嵌入式OS设计策略解读|忆联企业级SSD高可靠、高性能的实现方法
企业级SSD需要在大量企业数据读写下保持超高稳定性,以及24 小时全天候运行,SSD的读写速度、使用寿命、稳定性及可靠性是企业级用户关注的重点。为满足用户对企业级SSD高性能、低延时、轻量级、高可靠等需求,忆联设计并开发了适合SSD的嵌入式操作系统(Operating System,缩写:OS),并在其上构建了可复制性强的SSD 控制器软件系统。
嵌入式软件分为三个层次,即驱动层、OS层、业务层。业务层集结了庞大复杂的产品功能,负责处理业务逻辑的部分,通常包括接口协议、业务功能实现、系统数据保存等;驱动层把设备的硬件访问抽象成软件接口,为OS层和业务层服务;OS层为业务层提供软件平台服务,让业务层可以聚焦在实现庞大复杂的软件功能上。
图1
通用的OS功能很多,包括处理器管理、内存管理、设备管理、文件管理、作业管理等,而对于嵌入式OS来说,主要聚焦在处理器管理、内存管理等核心功能上,本文则重点阐述处理器管理、互斥、通信。
SSD系统的处理器架构和OS部署
在PCIe 4.0时,SSD的读写带宽达到8GB/s, PCIe 5.0时SSD的读写带宽可能达到16GB/s。为了实现SSD的高性能,通常SSD控制器会使用多CPU、甚至多Cluster的处理器架构,分别用于SSD业务计算和Nand flash操作。
图2
在多处理器、多Cluster架构下,业务部署时可以选择SMP模式、AMP模式、或者SMP和AMP混合模式。在SSD系统里,基本上都是SMP模式和AMP模式混合,OS要负责程序调度、互斥、通信功能。在嵌入式系统中的AMP模式的通信,可以类比为通用系统里多进程之间的通信,因为没有全局数据可用,要借助外部存储空间进行通信。
忆联OS的调度策略
常规的OS调度对象都是线程,且每个线程有自己的堆栈和优先级,具有抢占机制。忆联在设计SSD嵌入式系统时,通过分析发现,线程调度开销大、线程之间存在较为复杂的互斥问题、容易出现优先级逆转死锁问题,加之线程运行的随机性和无序性,让系统时刻处于“不确定”状态。因此,忆联SSD选择了自创的“功能代码(入口函数及其调用的全部函数)”调度策略。为了描述方便,本文把这些可以被OS调度的“功能代码(入口函数及其调用的全部函数)”,称为SSD系统里的“事务”。
在SSD系统里的程序,不再以线程方式组织,而是以一个个不会阻塞的独立“事务处理流程”方式组织。这些“事务处理流程”可以以各种方式被OS调度。
事务的主要特征:
(1)不会阻塞。一个事务完成一个特定的计算,它在计算过程中,不需要等待外设动作,会一直运行到结束。如果一个流程会被阻塞,则需要在阻塞点切分为多个独立的事务。一旦一个事务被CPU执行,则一定会执行到事务结束。在系统里,除了每个CPU正在执行的事务是运行状态,其他事务都处在结束状态。比起线程的阻塞状态,事务状态变得极其简单。
(2) 事务共享堆栈。事务执行完成时,不再有局部变量需要保存在堆栈里。 事务共享堆栈,堆栈需求小,调度时也没有了堆栈切换的开销。
(3)同一个CPU,事务串行执行。一个CPU里的事务,一定是执行完毕一个事务后,才能开始执行下一个事务。同一个事务,在一个CPU上不会重入。
(4)SMP模式下事务间互斥变得简单。见图3。
图3
备注:
(1)事务完成时,不会持有全局变量的访问锁。
(2)AMP之间不存在全局共享数据,不存在互斥。
事务的调度方式
图4
事务优先级和实时性
一次性事务具有事务优先级功能。OS接受一次性事务调度请求,通过高优先级来处理系统里一些紧急事务,以此达成特定事件的实时处理。
图5
中断与事务
前面已经讲述在忆联OS里,同一个CPU里事务之间不会出现抢占,只有当一个事务运行完成后,才会运行另外一个事务,但是中断依然具有抢占功能。
中断处理程序遵循常规的中断处理流程,中断到来时,还是会抢占当前事务。当中断到来时,OS会把当前运行的事务程序压栈,跳转到中断处理程序运行,中断处理程序完成后,被中断的事务程序被恢复运行。
中断处理程序运行时也是使用事务程序运行时的堆栈。
中断处理程序具备的抢占功能,可以满足系统里对于实时性要求高的场景,但同时也带来了中断和事务之间的互斥问题。中断和事务的互斥方式如图六。
图6
中断处理程序实现时,可分为中断上半部和下半部。上半部读取外设数据,下半部发送事务消息到OS调度处理。中断下半部的互斥就变成了事务之间的简单互斥方式了。中断发给OS的事务调度消息,可以根据需要选择使用“紧急、高、常规”优先级。
中断处理举例:IPC中断
一般来说,IPC中断用于AMP与 CPU之间的通信。
发送方把数据写入共享的DDR后,发送IPC中断给接受方。
接收方的IPC中断程序读取DDR里的通信数据,然后发送事务消息到自己的OS,OS按照事务进行调度处理该事务消息。
中断处理程序读取DDR里的通信数据,就是中断上半部。读取通信数据并做具体处理,则是事务完成,是中断的下半部。
总结
通过事务调度思路,忆联实现了旗下企业级SSD产品的高性能和高可靠性,业务功能的设计、实现、扩展都变得更加简单和灵活,业务功能的代码复用也变得更简单,这让忆联在开发新代次SSD时,可以很好地继承已有代次SSD产品的功能和品质,保障忆联可以持续为客户提供高品质SSD产品与存储解决方案。