优先级位图算法

优先级就绪组:OSRdyGrp
OSRdyGrp[8]:优先级就绪组,对应OSRdyTbl[8]中的元素
优先级就绪表:OSRdyTbl
OSRdyTbl[8]:优先级就绪表,数组中每个值有8位,8*8

优先级数目为64时,对应6个二进制位,[7 6 5 4 3 2 1 0]
高三位[5 4 3]:优先级在OSRdyGrp中二进制位的位序
低三位[2 1 0]:优先级在OSRdyTbl中二进制位的位序

在这里插入图片描述

优先级35转换成二进制是00 100 011,高三位100=4,则行为OSRdyTbl[4],低三位011=3,则列为
OSRdyTbl[4]的位序3即35,然后在相应数字标号里写1

优先级映射表: OSMapTbl

char OSMapTbl[8] ={0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
  • 数组元素下标与优先级的高3位对应时,数组元素对应的二进制值中,位为1的位表示 OSRdyGrp 的对 应位也为1
  • 数组元素下标与优先级的低3位对应时,数组元素对应的二进制值中,位为1的位表示 OSRdyTbl[] 的 对应位也为1
    在这里插入图片描述

35的高三位是100=4,4对应0010000即OSRdyGrp第4位为1,低三位是011=3,3对应00001000即OSRdyTbl[]第3位为1

优先级判定表 OSUnMapTbl[256]

  • 数组中元素 OSUnMapTbl[n] 表示一个任意的8位无符号数n对应的低位为1的那个位序
  • [例]例如二进制数 00000001B低位为1的是 bit0,OSUnMapTbl[1] = 0;1000000B低位为1的是 bit7,所以OSUnMapTbl[128] =7
  • n为奇数时 OSUnMapTbl[n] = 0

y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = (y <<3) + x;

在这里插入图片描述

任务进入就绪态

OSRdyGrp |= OSMapTbl[priority >> 3]; //获取优先级高的3位,找到在OSMapTbl中的对应值,再与OSRdyGrp做或运算,将其 对应位置1 
OSRdyTbl[priority >> 3] |= OSMapTbl[priority & 0x07]; //获取优先级低的3位,进行二进制或运算

任务退出就绪态

if((OSRdyTbl[priority >> 3] &= ~OSMapTbl[priority & 0x07]) == 0) OSRdyGrp &= ~OSMapTbl[priority >> 3];

获取进入就绪态的最高优先级

high3Bit = OSUnMapTbl[OSRdyGrp]; 
low3Bit = OSUnMapTbl[OSRdyTbl[high3Bit]];    
priority = (high3Bit << 3) + low3Bit; 

【例】假设有4个任务,优先级分别为6、10、11、17,请结合优先级位图算法中的就绪任务算法,给出优先级位图算法的具体实现过程以及优先级就绪组、优先级就绪表的最终操作结果

解答如下:

就绪算法:

OSRdyGrp |= OSMapTbl[priority >> 3]; 
OSRdyTbl[priority >> 3] |= OSMapTbl[priority & 0x07]; 

6:

二进制:00 000 110
高三位:000
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[0]=0000 0001
低三位:110
通过OSMapTbl映射后 OSMapTbl[6]=0100 0000
OSRdyTbl[prio>>3]=OSRdyTbl[0]=0100 0000

10:

二进制:00 001 010
高三位:001
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=0000 0010
低三位:010
通过OSMapTbl映射后 OSMapTbl[2]=0100 0000
OSRdyTbl[prio>>3]=OSRdyTbl[1]=0000 0010

11:

二进制:00 001 011
高三位:001
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[1]=0000 0010
低三位:011
通过OSMapTbl映射后 OSMapTbl[3]=0000 1000
OSRdyTbl[prio>>3]=OSRdyTbl[1]=0000 0010

17:

二进制:00 010 001
高三位:010
通过OSMapTbl映射后 OSMapTbl[prio>>3]=OSMapTbl[2]=0000 0100
低三位:001
通过OSMapTbl映射后 OSMapTbl[1]=0000 0010
OSRdyTbl[prio>>3]=OSRdyTbl[2]=0000 0010

OSRdyGrp= 000 00001 |0000 0010 |0000 0010 |0000 0100 =0000 0111 = 0x07

OSRdyTbl[0]=0100 0000
OSRdyTbl[1]= 0000 0100 |0000 1000 =0000 1100

OSRdyTbl[2]=0000 0010

在优先级判定表OSUnMapTbl[]中查找

OSRdyGrp=0x07
Y=OSUnMapTbl[0x07]=0 ------->最高优先级在第0组

OSRdyTbl[0]=0100 0000=0x40
X = OSUnMapTbl[0x40]=6

最高优先级为:prio= y*8+x=6

本篇博客为在理解了码之泪伤最高优先级算法后写出来的,可参考原文,整个过程讲述的更清晰。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优先级调度算法(Priority Scheduling Algorithm)是一种用于任务调度的算法,根据任务的优先级进行排序和执行。该算法根据任务的重要性或优先级来确定任务的执行顺序。在目前提供的引用,并没有特别提及优先级调度算法的具体实现和代码。引用提到了一个动态优先级编程算法的Matlab代码,但没有明确指出这个算法优先级调度算法。引用提到了遗传算法(Genetic Algorithms),但并没有提到优先级调度算法。引用提到了一段Matlab代码,但没有提到与优先级调度算法相关的内容。 因此,在这种情况下,我们无法提供关于优先级调度算法在Matlab的具体实现和代码。如果您需要了解更多关于优先级调度算法的信息,建议您参考相关的计算机科学和调度算法的教材、论文或在线资源。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [动态优先级调度算法代码matlab-scheduler:CPU调度模拟器](https://download.csdn.net/download/weixin_38735541/18905280)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【优化调度】基于matlab遗传算法求解工件的并行调度组合优化问题【含Matlab源码 2234期】](https://blog.csdn.net/TIQCmatlab/article/details/127970490)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值