面向NB-IoT的微内核RTOS的设计与实现

2022-10-24 01:20贾小林
计算机技术与发展 2022年10期
关键词:任务调度内核内存

张 正,贾小林

(西南科技大学 计算机科学与技术学院 RFID&IOT实验室,四川 绵阳 621000)

0 引 言

NB-IoT被广泛应用于环境监控、安全检测等重要领域,这类设备的硬件资源通常非常有限(通常为IETF定义的三类设备[1]),其设备中大多运行宏内核RTOS,例如:RT-Thread[2]、FreeRTOS[3]、uC/OS-II[4]。这种宏内核的设计思想,整个系统组件、设备驱动、内存管理、线程调度、网络栈等都被包含在特权内核中。内核中出现的错误将会导致整个系统的崩溃,并且内核之间的模块可能出现潜在的相互依赖使得模块化程度降低,此外宏内核的初始化中包含了许多导致系统启动变慢的流程,会影响系统的开机速度。为解决以上问题,出现了各类的微内核操作系统,例如:Chorus[5]、Mach[6]、L4[7]、seL4[8]等。这类内核通常只提供以下几类硬件抽象:(1)虚拟内存管理:将虚拟地址映射到物理地址;(2)线程抽象和调度;(3)进程间通信(IPC)。其余的文件系统、网络协议栈等都被隔离在内核之外。

在NB-IoT设备上实现微内核有一定的难度,主要原因在于其处理器上不包含MMU,整个系统只有单地址空间,DL2实现困难。DL2作为微内核实现的重要技术,保证了微内核系统中的软件模块可以实时动态地加载到系统中进行运行。目前,适用于NB-IoT设备的操作系统比较多:(1)Contiki[9]、uC/OS-II、uC/OS-III[10]、RIOT[11]、FreeRTOS[3]、uCLinux[12]、Linux、SenSpire OS[13]、RT-Thread、mbedOS[14]、TinyOS[15]等操作系统在物联网上得到广泛使用,但都为宏内核操作系统,甚至部分操作系统还并不支持DL2技术;(2)seL4、VxWorks[16]、Chorus等在设计之初就被设计为微内核操作系统,支持DL2技术,但是内存占用较高,在NB-IoT设备中并不适用[8]。

目前,对于NB-IoT设备还没有适用的微内核操作系统,该文针对NB-IoT设备硬件资源较少的情况,对现有的DL2技术进行优化,设计并实现了无MMU的nM-MKRTOS,实现了加载速度和传输开销的优化。nM-MKRTOS通过优先加载配置策略,实现了核心功能的优先加载,提高NB-IoT系统的启动速度。此外利用DL2技术,实现了模块间的内存复用策略,能够减少NB-IoT系统的成本,提高内存利用率。

1 微内核的设计

FreeRTOS、RT-Thread等系列操作系统,在设计之初就采用了宏内核的设计方式,宏内核通过统一编译的方式,在运行阶段会带来一定的性能提升。但也导致宏内核需要设计者做大量的配置工作,并且其大量组件被一同编译运行,会拖慢开机速度。该文设计的nM-MKRTOS内核包含内存管理、任务间通信(Inter Process Communication,IPC)、调度管理模块与DL2模块,如图1所示。

图1 微内核操作系统结构

(1)调度管理模块:该模块进行任务调度,采用抢占式任务调度算法。

(2)任务间通信模块:任务间通信通过共享内存、消息队列等方式实现。

(3)内存管理模块:对系统的内存进行管理。

(4)DL2模块:DL2模块用于对模块进行快速加载并执行。对于每一个动态加载的模块,会进行初始化;对于每一个动态加载的应用,会初始化并创建进程。

(5)策略优化模块:该模块包含了加载策略优化,用于提高系统的开机速度;此外还包含了内存“卸载”功能,通过将挂起进程的内存“卸载”到外部存储模块,达到内存复用的目的。

不同的微内核系统的设计结构基本一致,故模块2、3不是该文描述的重点;模块1中包含了抢占式任务调度程序,其任务状态与普通RTOS有差异;模块4中包含了DL2模块,用于在设备上实现程序模块的动态加载,是提高系统开机速度和实现内存复用的核心技术;模块5实现了开机加载策略并实现了内存复用,是核心模块。

2 调度管理模块

任务调度算法为微内核的核心模块,对于NB-IoT来说,系统要求对于某些紧急任务做出最快的处理(如:环境检测报警),这就要求系统拥有一定的实时性。该系统中的任务调度算法,采用抢占式设计,但支持同优先级任务时间片轮转执行。系统任务调度算法示意图如图2所示。

图2 实时调度算法

系统维持一个按照优先级顺序排列的双向链表,链表的每一个节点中存放的是同优先级的任务。变量x将存放最高优先级任务的头节点,每次最高优先级任务被挂起或阻塞时,会查找最高优先级节点以更新x。在x未发生变化时,其调度算法的时间复杂度为O(1),在发生变化时,其调度算法复杂度为O(n),n为系统中优先级的个数。在x发生变化时,利用位图的方式进行查找,其算法复杂度还可以优化,但是要求系统最大任务数与优先级必须在编译时就确定,使得系统灵活性降低,所以这里不进行论述。

图3中,系统中的任务总共包含6种状态:挂起、就绪、运行、卸载、阻塞、被阻塞。挂起状态为用户执行Suspend操作时挂起任务,只有执行Resume才能将任务恢复为就绪状态;阻塞状态为任务延时、等待事件等都会进入阻塞状态;卸载状态为用户执行Unload操作将任务“卸载”到外部存储设备,只有执行Load操作才能够恢复,并执行Unload与Load将会占用较多的时间。

图3 任务状态转换示意图

3 DL2模块

DL2用于微内核中模块动态加载与执行,可加载文件体积与加载速度都会影响系统性能。在许多物联网操作系统中,如SenSpire OS[13],都实现了DL2,并且针对其使用的场合进行优化。该文参考了文献[17-18]中DL2的实现,并优化可加载文件大小与符号表。

3.1 可加载文件大小优化

在标准的可执行可链接格式(Executable Linkable Format,ELF)文件中包含了许多的段,如图4所示,然而这些段不参与程序的执行,通过对这些段的优化,能够减少可加载文件的体积,在网络传输时能够明显提高速度,减少能耗。

图4 tDLL文件格式与ELF文件格式

3.2 符号表优化

在标准ELF中,符号表被分成了很多类,并且某些符号表之间还存在一定的关系。符号表中存储了函数、变量、重定向变量等信息,系统依靠符号表完成函数的重定向,ELF在符号表中利用Hash表对符号表进行快速查找,但是当符号数量增多时,Hash表的碰撞会导致性能下降。该文对符号表进行了修改与整合,如表1所示,在符号表中添加预链接信息(目标符号在目标库中的偏移地址),在进行重定向时,通过使用预链接信息则无需在目标符号表中进行查找,查找效率为O(1)。

表1 符号表

4 策略优化模块

4.1 提高系统开机速度

系统内核的加载、系统硬件初始化、内核软件的初始化、用户软件的初始化等都会影响系统开机速度。在使用宏内核操作系统的设备中,系统通常包含了众多的功能,整个软硬件系统全部初始化完毕则标志着整个系统启动完毕。然而对于使用者来说通常只关心一部分功能亦或者一部分功能需要提前启动,而这部分功能的启动只占用整个系统启动的一部分时间。利用微内核的DL2所具备的优势,将系统任务按照启动权重进行划分,利用优先加载策略,能够实现系统快速启动。

图5 系统模块划分有向加权图

在整个系统中,不同功能对应不同的模块子集序列,这些序列通过施加权值的方式决定其启动的顺序。例如:任务I中希望序列J2被最先加载执行,则对于子集权重的分配为公式(2)~公式(4)。

(1)

J1={I0,I1,I4,I7,I10}*k1

(2)

J2={I0,I1,I2,I4,I5,I8,I11}*k2

(3)

J3={I0,I2,I3,I5,I6,I9,I12}*k3

(4)

其中,k2>(k1,k3)∈N,上述公式表示,J2拥有最高权重,其任务功能序列最先被加载。

4.2 内存复用优化

在有MMU的处理器中,通过“交换内存”实现内存的复用,即通过外部存储设备作为内存存放的临时区域,使得运行程序的规模能够超过内存所支持的大小。但NB-IoT设备通常没有MMU,开发者通常只能够使用硬件所限制的内存大小。该文利用微内核的优势,提出模块内存“卸载”策略,即在系统中执行的任务具有时间上的不相关性,则这些任务也可以使用类似“交换内存”的方式实现内存的重复利用。

内存复用能够使得系统运行更多的应用,但也带来了性能损失,通常将其用于对应用要求不高的场合,这对于NB-IoT的场合非常适用,在NB-IoT场景中其通常要求周期性地进行工作,对系统的时延要求并不严格。在微内核的系统中运行的任务可以用图6表示,定义任务规则P=(r,k,I,b,p,a,Rt,t),其中:

(1)r为RAM所需空间,r<系统可用RAM空间;

(2)k为ROM所需空间,k<系统可用ROM空间;

(3)I为之后需要执行的任务集(为-1代表下一个任务为空);

(4)b为前驱任务集;

(5)p为执行该模块前需执行的动作(0:保持,1:挂起;2:恢复;3:卸载到外部内存;4:加载到内部内存);

(6)a为当前任模块到下一个模块所执行的动作;

(7)Rt为模块运行间隔;

(8)t为运行时间。

在图6中,通过配置r、k、I、p与a可以指定模块I1与I2的启动顺序与动作,通过配置Rt与t可以实现时间不相关模块的内存复用(如:I2与I1)。

图6 任务内存复用示意

5 实验分析

实验中,使用了真实的硬件设备,见图7,其系统RAM为64 KB,系统ROM为512 KB,系统主频为72 MHz,在本节的所有实验中,都采用该配置的处理器。

图7 测试硬件

5.1 可加载文件性能分析

该文对可加载文件的大小以及加载速度进行了优化,为此编写了7个模块,对比ELF可加载文件在相同模块下的体积大小。在图8中,该文的可加载文件体积相比于ELF,是标准ELF文件大小的10.4%~68.4%。可加载文件体积的优化,意味着在NB-IoT网络传输过程中能够节省更多的时间与能耗。

图8 可加载文件大小对比

5.2 可加载文件执行速度测试

为对比该可加载文件与ELF文件在加载后执行性能的差异,利用几种经典的排序算法进行性能比较,测试结果如图9所示。在几种排序算法中,只有在选择排序测试中,性能损失了6.1%,其他排序算法在对比中几乎没有差异。

图9 执行性能对比

5.3 系统启动速度测试

为测试系统启动速度,编写了一个测试程序,该程序与真实场景相对应,其模块划分见图5,系统执行远程数据采集、上报与控制任务,其包含三个任务子集J1、J2与J3,每个子集包含若干模块,定义其启动规则为公式(5)~公式(7)。

(5)

(6)

(7)

在系统未按权重进行加载时,系统总启动时间为1 290 ms,在分别设置模块子集加载权重为:(2,1,1)、(1,2,1)、(1,1,2),三个模块子集其启动时间分别为:547 ms,612 ms,676 ms,即权重加载启动方式相比于未按权重加载其三个模块的启动时间分别减少了57.59%、52.55%与47.59%。

5.4 内存复用测试

在内存复用测试的测试中,编写与4.2节中相同的应用测试模块,4个应用模块的加载规则为公式(8)。

(8)

在规则中,I0为系统OS内核;I1与I2为应用程序,执行周期分别为2 s与1 s,其为周期任务,可以做到时间上不相交,并且I1与I2同时运行其需要的RAM空间必然超过系统总空间。通过内存复用可提高RAM内存的利用效率,在本测试中,内存利用率提高56.25%。

6 结束语

针对NB-IoT设备资源少、稳定性要求高、系统对外界响应性强等特点,设计并实现了nM-MKRTOS。该系统采用微内核的设计思想,其任务调度算法采用抢占式调度策略,利用模块优先加载策略提高系统的开机速度,并且针对时间上不相关的模块,实现了内存复用策略,提高了内存的利用率。在编写的测试案例中,系统的开机时间分别减少57.59%、52.55%与47.59%,内存利用率提高45.83%。此外,该系统采用微内核的思想,其能够最大程度上保证内核的安全,防止驱动、文件系统等出现的问题影响系统的工作。nM-MKRTOS系统能够应用于环境监测、智慧农业等各个场合,在降低系统成本的同时,还能够提高系统的安全性与稳定性。

猜你喜欢
任务调度内核内存
基于生产函数的云计算QoS任务调度算法
多内核操作系统综述①
基于动态能量感知的云计算任务调度模型
强化『高新』内核 打造农业『硅谷』
活化非遗文化 承启设计内核
笔记本内存已经在涨价了,但幅度不大,升级扩容无须等待
“春夏秋冬”的内存
微软发布新Edge浏览器预览版下载换装Chrome内核
内存搭配DDR4、DDR3L还是DDR3?
基于HMS的任务资源分配问题的研究