实时操作系统基本概念
这几天不忙,复习了一下UC/OSII中实时内核的基本概念,做了些简单的笔记加深记忆。
1.前后台系统
应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。后台也可以叫做任务级。前台也可以叫做中断级。
2.代码的临界段
代码的临界段也称为临界区,指处理时不可分割的代码。一旦这段代码开始执行,则不容许任何中断打入。为确保临界代码段的执行,在进入临界段之前要关中断,而临界段代码执行完以后要立即开中断。
3.多任务
多任务运行的实现实际是靠CPU在许多任务之间转换,调度。CPU只有一个,轮番服务于一系列任务中的某一个。多任务运行很像前后台系统,但后台任务有多个。多任务运行使CPU的利用率得到最大的发挥,并使应用程序模块化。在实际应用中,多任务的最大特点是,开发人员可以将很复杂的应用程序层次化。使用多任务,应用程序更容易设计与维护。
4.任务
一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全只属于程序自己。每个任务都是整个应用的某一部分,每个任务被赋予一定的优先级,有它自己的一套CPU寄存器和自己的栈空间。
每个任务都处于以下5重状态下:休眠态,就绪态,运行态,挂起态,中断态。
5.任务切换
当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态(context),即CPU寄存器中的全部内容。这些内容保存在任务自己的栈区之中。入栈完成后,就是把下一个将要运行的任务的当前状况从该任务的栈中重新装入CPU的寄存器,并开始下一个任务的运行。
做任务切换所需要的时间取决于CPU有多少寄存器要入栈。实时内核的性能不应该以每秒找能做多少次任务切换来评价。
6.调度(Scheduler)
调度是内核的主要职能之一,就是要决定该轮到哪个任务运行了。基于优先级的调度算法是指,CPU总是让处在就绪态的优先级最高的任务先运行。
7.不可剥夺型内核(Non-Preemptive Kernel)
不可剥夺型内核要求每个任务自我放弃CPU的所有权。异步事件还是由中断来处理,中断服务程序可以使一个高优先级的任务由挂起状态变为就绪状态。但中断程序结束以后控制权还是回到原来被中断了的那个任务,知道该任务主动放弃CPU的使用权。
8.可剥夺型内核
实时内核大都采用可剥夺型内核,最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。
9.可重入性(Reentrancy)
可重入型函数可以被一个以上的任务调用,而不必担心数据的破坏。如果在可重入函数中使用了全局变量,有时是十分危险的。使用以下技术之一即可使函数具有可重入性:
Ø 函数内只使用局部变量;
Ø 调用函数前关中断,调用后再开中断;
Ø 用信号量禁止该函数在使用过程中被再次调用;
10.时间片轮转调度法
当两个或两个以上任务有相同优先级,内核容许一个任务运行事先确定的一段时间,叫时间额度,然后切换给另一个任务,叫做时间片调度。
11.优先级反转
使用实时内核,优先级反转问题是实时内核出现得最多的问题。当当时存在多个任务,任务1优先级高于任务2,任务2优先级高于任务3。任务1和任务2处于挂起状态,任务3正在运行。如果此时任务3正在使用了共享资源,任务1等待的时间来之后将剥夺任务3的CPU控制权,任务1开始运行。这是任务1恰好要使用共享资源,但被任务3占据,任务1只好放弃CPU控制权,等待任务3释放该资源。同样的情况,任务2在此期间也不能占用共享资源。结果任务1和任务2实际上的优先级就低于了任务3,任务1和任务2的优先级发生了反转。
纠正的方法是,当任务1把CPU的控制权还给任务3时,内核将任务3的优先级升至任务1一样,然后回到任务3继续运行,直到任务3释放共享资源。这时将任务3的优先级恢复,任务1得以正常运行。当任务1结束后,任务2开始运行。这样将避免优先级的反转。