单等待队列
- 资源对应的事件发生时,内核需要扫描整个等待队列,搜索等待该资源的任务,并按照一定的策略选取任务,把任务的任务控制块放置到就绪队列。
- 如果系统的资源和任务比较多,搜索等待该资源的任务所需要的时间就比较长,会影响整个系统的实时性能。
多等待队列
- 资源对应的事件发生时,能够在较短的时间内确立等待该资源的任务等待队列。
基于位图的优先级调度算法【大题】
对于就绪任务,如果采用上述队列方式(单/多等待队列
)进行管理,在基于优先级的调度处理中,要获得当前具有最高优先级的就绪任务:
- 方式一:任务就绪时,把就绪任务的任务控制块放在就绪队列的末尾。
调度程序需要从就绪队列的头部到尾部进行一次遍历,才能获得就绪队列中具有最高优先级的任务; - 方式二:就绪队列按照优先级从高到低的顺序排列。
新的就绪任务到达时,需要插入到就绪队列的合适位置,确保就绪队列保持优先级从高到低排列的顺序性。
在这两种处理方式中,所花费的时间与任务数量有密切的关系,具有不确定性。
为提高实时内核的确定性,可采用一种被称为优先级位图的就绪任务处理算法。
调度用来确定多任务环境下任务执行的顺序和在获得CPU资源后能够执行的时间长度。
数据结构
要使用该算法,首先需要维护四个数据结构:
- 优先级就绪组
OSRdyGrp
,原型:char OSRdyGrp
- 优先级就绪表
OSRdyTbl
,原型:char OSRdyTbl[8]
- 优先级映射表
OSMapTbl
,原型:char OSMapTbl[8]
- 优先级判定表
OSUnMapTbl
,原型:char OSUnMapTbl[256]
其中,OSRdyGrp
和OSRdyTbl
的值是随任务调度动态发生变化的。OSMapTbl
和OSUnMapTbl
是固定的值,仅用来做转换操作
OSRdyGrp 和 OSRdyTbl
二者关系见图:
OSRdyGrp
用来表示OSRdyTbl
当中的行是否存在就绪任务OSRdyTbl
一共8行8列,共64位,可以表示64种不同的优先级(0-63
)。其中63为最低优先级,表示空闲任务- 同时上图还表现出以下事实:任务的优先级中仅有6位是有效的(
0-63中第6、7位为0当然无效
),同时高三位表示Y即行,低三位表示X即列。将OSRdyTbl
中对应行列置1,表示该优先级的任务已就绪,反之,也可以通过Y*8(或Y<<3
) + X,得到对应位置的优先级
OSMapTbl
OSMapTbl