优先级位图算法

谁说我不能喝 提交于 2019-12-27 00:45:25

算法的由来

我是在学习嵌入式操作系统这门课知道优先级位图算法的,可能描述的啰嗦,将就着看吧!这个算法用来对操作系统的任务进行调度。在μC/OS-II中是这样的,每一个任务都有一个优先级,但是每一个优先级只能有一个任务,那么如何让具有最高优先级的任务先执行。系统中每一个任务都有一个任务控制快TCB,可以将就绪的TCB放进就绪队列,然后处理器执行的时候从就绪队列中选择优先级最高的执行,但是这样的话,嵌入式系统的实时性无法保证,因为需要遍历就绪队列找到最高优先级的任务,所以才有了优先级位图算法。

优先级位图算法

优先级位图算法有一个数组OSRdyTbl[8],数组中的每一值有八位,这样就构成了一个8*8的格子,如下图所示。
在这里插入图片描述
在上面的这个表格中,我们在用一个变量OSRdyGrp(八位)来对应OSRdyTb[8]的每一个元素。这个OSRdyTb中当然不是这些1~63的数字,而都只是1,0的二进制数字。如果某一个优先级有任务,那么对应的位置标志为1,然后让OSRdyGrp对应的bit也标志为1。
例如(如图A):优先级35,转成二进制00 100 011,然后将二进制分为高三位100 = 4,低三位011 = 3,然后查看一个表如图B,找到4对应的值与OSRdyGrp相或就能将OSRdyGrp对应的行标志为1,然后3对应的值与OSRdyTbl[4]的值相或,就可以确定是哪一列(如图C)。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当然,有一个问题,比如上面的例子OSRdyGrp初始值为0,优先级35来了过后OSRdyGrp为4,也就是0000 0100,我们就知道是OSRdyTbl索引为4的值。那么,如果是多个优先级的任务且在不同的行?那怎么在多个任务中确认优先级做高的任务所在的行呢?于是就有了一种表记录OSRdyGrp所有的值的二进制中第一个1的位置,这个表如图D所示:
在这里插入图片描述
那这个表怎么查呢?比如有优先级6,17,35转化为二进制,6:110,17:10001,35:100011,那么经过计算过后的OSRdyGrp的值为110111,转化为16进制0X37 ,找到这个数字对应的行,然后找到这个数对应的值0,说明最高优先级的在OSRdyTabl的第0行,然后以相同的方式找到所在的列就能确定最高优先级的值了。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!