实验二时间片轮转算法实验报告.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验二时间片轮转算法实验报告课案

实验二 时间片轮转算法 一、 实验目的 ??调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。 ??在了解原有EOS的基于优先级的抢先式调度策略的基础上,添加时间片轮转调度。 二、 实验内容 2.1 EOS的基于优先级的抢先式调度策略: EOS内核中实现的是一种基于优先级的抢先式调度策略:为线程定义了从0到31的32个优先级,其中0优先级最低,31优先级最高。定义了一个数组: PspReadyListHeads[32],其中保存了32个链表头,每个链表都代表一个对应优先级的就绪队列。其中下标为n的链表对应优先级为n的就绪队列。所以,优先级为0的就绪线程要放入下标为0的链表中,优先级为8的就绪线程要放入下标为8的链表中。EOS每隔几十毫秒就会发生中断并执行一次线程调度,在调度过程中,总是率先选择高优先级就绪队列中的线程获得处理器,而对于同一个优先级就绪队列中的多个线程,则按照先来先服务(FCFS)的顺序进行调度。即:假如出现了比正在执行的线程优先级更高的线程处于“就绪”状态,则将CPU分配给这个高优先级的线程,而低优先级的线程就进入“就绪”状态;而假如所有“就绪”状态的线程都是同一个优先级,那么只有排在首位的线程被执行,其余同优先级别的线程都将一直处于“就绪”状态。 观察EOS内核中基于优先级的抢先式调度策略的具体实施方法: (1)新建一个EOS Kernel项目,起名为EOS_RR_XXXXXXX,(XXXXX代表学号)。 (2)按F5启动调试,在控制台中输入命令“rr”后回车,并观察结果。 (3)控制台的输出结果应该如下图所示: 即,只有第0个新建的线程在第0行显示其计数在增加,说明只有第0个新建的线程在运行,其它线程都没有运行。造成上述现象的原因是:观察ke/sysproc.c中的第690行ConsoleCmdRoundRobin函数,在该函数中调用了第649行的ThreadFunction函数创建了20个优先级别都为8的线程,而此时EOS只实现了基于优先级的抢先式调度,所以至始至终都只有第0个线程在运行。而其他具有相同优先级的线程都没有机会运行,只能处于“就绪”状态。 2.2 EOS的线程调度程序 PspSelectNextThread 函数: EOS每次发生中断时,都调用函数PspSelectNextThread来选择即将要执行的线程。??函数的流程图如下图所示: 2.2.1 观察PspSelectNextThread函数不发生线程切换时的执行过程: 按以下步骤观察PspSelectNextThread函数的执行方法: (1)结束之前的调试,并取消所有断点。 (2)在ke/sysproc.c文件的第680行fprintf函数处加一个断点,并按F5启动调试。 (3)输入命令“rr”,会在断点处停止。 (4)连续按F5两次,直至虚拟机窗口显示如下内容: (5)在左下角“监视”窗口中,添加如下所示4个表达式:“pThreadParameter-Y”,“/t PspReadyBitmap”,“ListGetCount(PspReadyListHeads[8])”,“HighestPriority”。 此时会发现,PspReadyBitmap的值为100000001,即表示优先级为8和0的两个队列中存在就绪队列。而pThreadParameter-Y的值应该为0,表示正在调试的是第0个新建的线程。 (6)在ps/sched.c文件的第384行BitScanReverse函数处加一个断点,并按F5,到该断点处停止。在“调试”菜单中选择“快速监视”,并输入表达式“*PspCurrentThread”,点击“重新计算”按钮,可以查看当前正在执行的线程(即被中断的线程)的线程控制块中各个域的值。关于线程控制块TCB的定义可参见ps/psp.h的第58行。其中优先级(Priority域)的值为8;状态(State域)的值为2(运行态);时间片(RemainderTicks域)的值为6;线程函数(StartAddr域)为ThreadFunction。综合这些信息即可确定当前正在执行的线程就是新建的第0个线程。关闭“快速监视”对话框。 其中,State的取值范围是:(ps/psp.h的第93行) (7)观察可知,此时监视窗口中ListGetCount(PspReadyListHeads[8]的值为19,即优先级为8的就绪队列中共有19个就绪线程。说明除了正在执行的第0个新建的线程外,其余19个新建的线程都在优先级为8的就绪队列中。ListGetCount函数在文件rtl/list.c中定义。 (8)按F10单步调试,会发现执行完BitScanReverse函数后,BitScanReverse函数会从就绪位图中扫描最

文档评论(0)

jiayou10 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8133070117000003

1亿VIP精品文档

相关文档