- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
嵌入式操作系统内核原理和开发(改进型优先级调度).
嵌入式操作系统内核原理和开发(改进型优先级调度)
上面的一篇博客说到了优先级调度,但是那个优先级调度算法比较极端。打个比方说,现在王先生有三个小孩,分别是老大、老二、老三。假设现在到了饭点,王先生需要给三个小孩喂饭。此时如果是时间片轮转的话,那么就是绝对公平,王先生每人一口不停地进行喂饭。如果是优先级调度,那么王先生首先自己有一个优先级考量,比如说三个小孩按照年龄顺序优先级是逐渐提高的,毕竟小孩需要更多的照顾嘛。这个时候如果需要进行喂饭的话,那么王先生需要首先伺候好最小的那个小孩老三,才会有时间照顾老二,至于老大什么时候才能得到照顾那就看造化了。
现在,我们打算重新换一种方法。假设三个小孩的优先级分别是1、2、3,其中年龄越小优先级越高,3代表高优先级。接着,我们按照优先级给三个小孩安排时间片,分别是1、2、3。同时,这个时间片不光代表了当前可用的剩余时间,还代表了小孩此时的临时优先级。
(1)首先王先生给老三喂饭,时间片降低1,即临时优先级为2;
(2)接着王先生判断当前优先级最高的仍为老三,毕竟老二的优先级也没有超过老三,所以老三的时间片降1,临时优先级为1;
(3)王先生获知当前优先级最高的为老二,老二获得时间片;
(4)此时王先生发现三个孩子的临时优先级都一样,那么就会按照固定优先级的大小依次对老三、老二、老大进行喂饭。
我们发现,这中间受益最大的就是老二。当然,我们可以做进一步推论,如果老王的孩子越多,那么优先级处于中间的孩子在时间片的分配上将更加均匀,响应也会更加及时,交互性也会变得很好。
根据以上的想法,我们重新改写了优先级调度算法,修改为改进型优先级调度算法,
[cpp] view plaincopy
int find_next_thread()
{
int index;
int choice = THREAD_MAX_NUMBER -1;
int value = gAllTask[choice].time_slice;
for(index = choice -1; index = 0; index --)
{
if(value gAllTask[index].time_slice)
{
choice = index;
value = gAllTask[index].time_slice;
}
}
if(0 == value)
choice = -1;
return choice;
}
当然,加上原来的时间片轮转调度、通用优先级调度方法,此时就存在三种调度方法了。我们可以自己设置宏,通过宏的设置灵活选用调度算法,[cpp] view plaincopy
#define TIME_ROUND_SCHEDULE 0
#define HARD_PRIORITY_SCHEDULE 0
#define SOFT_PRIORITY_SCHEDULE 1
这些代码都是可以在系统中共存的。选用什么算法,取决于实际情况是什么样的情形。
[cpp] view plaincopy
#include stdio.h
#include time.h
#include stdlib.h
#include signal.h
#include assert.h
#include string.h
#include sys/time.h
#define UINT32 unsigned int
#define STACK_LENGTH 512
#define THREAD_MAX_NUMBER 10
#define TIME_ROUND_SCHEDULE 0
#define HARD_PRIORITY_SCHEDULE 0
#define SOFT_PRIORITY_SCHEDULE 1
typedef struct _TASK_INFO
{
UINT32 id;
UINT32* stack;
UINT32 size;
UINT32 context;
UINT32 priority;
UINT32 time_slice;
void
您可能关注的文档
最近下载
- 品酒师考试:葡萄酒品酒师试题预测五.docx VIP
- 品酒师考试:葡萄酒品酒师试题及答案(强化练习).docx VIP
- 甘肃省第一届职业技能大赛无人机驾驶(植保)项目(国赛精选)技术工作文件.docx VIP
- 班主任艺术:班主任与家长沟通的技巧-班主任工作艺术.docx VIP
- 品酒师考试葡萄酒品酒师.doc VIP
- ISO56001-2024创新管理体系 — 要求(中文版-雷泽佳译2024-09).docx VIP
- 05s502图集阀门井_标准图集.pdf VIP
- 江西省第二届职业技能大赛技术文件无人机驾驶员(植保)项目技术工作文件.docx VIP
- 体例格式12:工学一体化课程《小型网络安装与调试》任务1教学单元6教学单元活动方案.docx VIP
- 体例格式12:工学一体化课程《小型网络安装与调试》任务1教学单元5教学单元活动方案.docx VIP
文档评论(0)