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

上传人:公**** 文档编号:564910383 上传时间:2022-07-25 格式:DOCX 页数:13 大小:253.39KB
返回 下载 相关 举报
实验二 时间片轮转算法 实验报告_第1页
第1页 / 共13页
实验二 时间片轮转算法 实验报告_第2页
第2页 / 共13页
实验二 时间片轮转算法 实验报告_第3页
第3页 / 共13页
实验二 时间片轮转算法 实验报告_第4页
第4页 / 共13页
实验二 时间片轮转算法 实验报告_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《实验二 时间片轮转算法 实验报告》由会员分享,可在线阅读,更多相关《实验二 时间片轮转算法 实验报告(13页珍藏版)》请在金锄头文库上搜索。

1、实验二时间片轮转算法一、实验目的 调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。 在了解原有EOS的基于优先级的抢先式调度策略的基础上,添加时间片轮转调度。二、 实验内容2.1 EOS的基于优先级的抢先式调度策略:EOS内核中实现的是一种基于优先级的抢先式调度策略:为线程定义了从0到31的32个 优先级,其中0优先级最低,31优先级最高。定义了一个数组:PspReadyListHeads32,其 中保存了32个链表头,每个链表都代表一个对应优先级的就绪队列。其中下标为1的链表对应 优先级为n的就绪队列。所以,优先级为0的就绪线程要放入下标为0的链表中,优先级为8的就 绪线程要放入下标为

2、8的链表中。EOS每隔几十毫秒就会发生中断并执行一次线程调度,在调度 过程中,总是率先选择高优先级就绪队列中的线程获得处理器,而对于同一个优先级就绪队列中的多个线程,则按照先来先服务(FCFS)的顺序进行调度。即:假如出现了比正在执行的线 程优先级更高的线程处于“就绪”状态,则将CPU分配给这个高优先级的线程,而低优先级的 线程就进入“就绪”状态;而假如所有“就绪”状态的线程都是同一个优先级,那么只有排在首位的线程被执行,其余同优先级别的线程都将一直处于“就绪”状态。3100S31链占头扫描到遠| 一也时停止I尤先级髙打招1方向32乍链表头组成的就绪臥列(2)根据扫押| 获誓的星高优 先SO对

3、应 的就蜡队列丨TCBTCB琏驶头 椎我头 敏蛊头 铤表头 椎表头骑老头TCBTCBTCB丁也按斥FCFS原別址 就绪队列中的第一个 诗程狀得处理胖优充嫌)优先赫尤光级32位就绪位图000 0000000000000000003G1000000018观察EOS内核中基于优先级的抢先式调度策略的具体实施方法:(1) 新建一个EOS Kernel项目,起名为EOS_RR_XXXXXXX,(XXXXX代表学号)。(2) 按F5启动调试,在控制台中输入命令“rr”后回车,并观察结果。(3) 控制台的输出结果应该如下图所示:即,只有第0个新建的线程在第0行显示其计数在增加,说明只有第0个新建的线程在运行

4、,其它线程都没有运行。造成上述现象的原因是:观察ke/sysproc.c中的第690行 ConsoleCmdRoundRobi n函数,在该函数中调用了第649行的ThreadFunc tion函数创建了 20个优 先级别都为8的线程,而此时EOS只实现了基于优先级的抢先式调度,所以至始至终都只有第0 个线程在运行。而其他具有相同优先级的线程都没有机会运行,只能处于“就绪”状态。2.2EOS的线程调度程序PspSelectNextThread函数:EOS每次发生中断时,都调用函数PspSelec tNex tThread来选择即将要执行的线程。该 函数的流程图如下图所示:是的就绪线程了PspS

5、elcc-tNcjstTlizead 甫就绪束选掙优先级最离的非空就绪 队列的队首绘程作为 中斯返回后的运行域程PspSeleclNejitThiEad 雷融开始将祕中断域程转入就常状态班捧被中断的线程作为 中断返回后的运行罐程2.2.1观察PspSelectNex tT hread函数不发生线程切换时的执行过程:按以下步骤观察PspSelec tNex tThread函数的执行方法:(1)结束之前的调试,并取消所有断点。(2)在ke/sysproc.c文件的第680行fprin tf函数处加一个断点,并按F5启动调试。(3)输入命令“rr”,会在断点处停止。(4)连续按F5两次,直至虚拟机窗

6、口显示如下内容:(5) 在左下角“监视”窗口中,添加如下所示4个表达式:“pThreadParameter-Y”,“/t PspReadyBitmap”,“ListGetCount(&PspReadyListHeads8)”,“ HighestPriority”。 U X值类型pThre&iiFweta.0SHOR!/t PspRei tnapL00000001Li etCaunt.LQHi g:hes tFi ori ty无法计宜克达式的值B此时会发现,PspReadyBitmap的值为100000001,即表示优先级为8和0的两个队列中存在就绪 队列。而pThreadParameter-Y

7、的值应该为0,表示正在调试的是第0个新建的线程。(6)在ps/sched.c文件的第384行BitScanReverse函数处加一个断点,并按F5,到该 断点处停止。在“调试”菜单中选择“快速监视”,并输入表达式“*PspCurrentThread”, 点击“重新计算”按钮,可以查看当前正在执行的线程(即被中断的线程)的线程控制块中各 个域的值。关于线程控制块TCB的定义可参见ps/psp.h的第58行。其中优先级(Priori ty域) 的值为8;状态(State域)的值为2 (运行态);时间片(RemainderTicks域)的值为6;线程 函数(Start Addr域)为ThreadFu

8、nc ti on。综合这些信息即可确定当前正在执行的线程就是新 建的第0个线程。关闭“快速监视”对话框。struct _IHKE?.D ;PPROCESS Process;/线程刖厲进程带针LZSI_EyTEY ThridListEntry;/进程的绸程就表项UCHAR Priority;/线程优先级UCHAR State;/线程兰前狀态LLOXG EemiiridTicks;/剩余时间片,用于时间片轮转调度STATUS TiitStitus;/阻塞等特拥结果状盡其中,State的取值范围是:(ps/psp.h的第93行)Z-ero./线程狀态转换过程中的中间狀态E-eidy./就绪EjnTj

9、irjH./运行ting./等待(阻塞)/结束j THREAB_STATE;(7)观察可知,此时监视窗口中Lis tGet Coun t(&PspReadyLis tHeads8的值为19,即 优先级为8的就绪队列中共有19个就绪线程。说明除了正在执行的第0个新建的线程外,其余19 个新建的线程都在优先级为8的就绪队列中。ListGetCount函数在文件rtl/list.c中定义。(8)按F10单步调试,会发现执行完BitScanReverse函数后,BitScanReverse函数会 从就绪位图中扫描最高优先级,并保存在变量Highes tPriori ty中。查看变量Highes tPr

10、iori ty 的值为8。(9)按F10单步调试,观察每一个执行步骤,直至465行。会发现并没有进行线程的切 换。因为没有比第0个线程优先级更高的就绪线程。2.2.2观察PspSelectNextThread函数发生线程切换时的执行过程: 不要结束2.2.1的调试,但是删除所有的断点,并进行以下操作:(1)在PspSelectNextThread的第395行加一个断点,并按F5继续执行。在虚拟机窗口 中可见第0个线程一直在执行。(2)在虚拟机窗口下按一次空格键,EOS会在第395行断点处停止。(3)在“监视”窗口中查看就绪位图的值为1000000000000000100000001,说明此时

11、在优先级为24的就绪队列中存在就绪线程。在“监视”窗口中添加表达式“ListGetCount(&PspReadyListHeads24)”,其值为1,说明优先级为24的就绪队列中只有 一个就绪线程。扫描就绪位图后获得的最高优先级的Highes tPriori ty也就应该是24。(4) 按F10单步调试一次,执行的语句会将当前正在执行的第0个新建的线程,放入优 先级为8的就绪队列的队首。“监视”窗口中显示的优先级为8的就绪队列中的线程数量就会增 加1,变为20。如下图所示:(5) 继续按F10单步调试,直到在第444行中断执行,注意观察线程调度执行的每一个 步骤。此时,正在执行的第0个新建的线

12、程已经进入了“就绪”状态,让出了CPU。线程调度程 序接下来的工作就是选择优先级最高的非空就绪队列的队首线程作为当前运行线程,也就是让 优先级为24的线程在CPU上执行。(6) 按F10单步调试一次,当前线程PspCurren tThread指向了优先级为24的线程。可 以在“快速监视”窗口中查看表达式“*PspCurrentThread”的值,注意线程控制块中 Start Addr 域的值为 IopConsoleDispa tchThread 函数(在文件 io/console.c 中定义),说明这 个优先级为24的线程是控制台派遣线程。(7) 继续按F10单步调试,直到在PspSelect

13、NextThread函数返回前(第465行)中断 执行,注意观察线程调度执行的每一个步骤。此时,优先级为24的线程已经进入了“运行”状 态,在中断返回后,就可以开始执行了。在“监视”窗口中,就绪位图的值变为100000001, 优先级为24的就绪队列中线程的数量变为0,就绪位图和就绪队列都是在刚刚被调用过的 PspUnreadyThread函数(在文件ps/sched.c中定义)内更新的。( 8)删除所有断点后结束调试。2.3为EOS添加时间片轮转调度算法:要求:在ps/sched.c文件的第337行PspRoundRobin函数中,添加适当的代码,使实现 时间片轮转算法。测试方法:(1) 代

14、码修改完毕后,按F7生成EOS内核项目。(2) 按F5启动调试。(3) 在EOS控制台中输入命令“rr”后按回车。应能看到20个线程轮流执行的效果, 如下图所示:lnl x|0 1Z345678910111213141516171819oo co co co co oo 00 co co co oo 00 co oo co oo oo oo 8 co3463704972421596914676305998534-85 Z0JO343798ZSZ658671O 1Z7O76330J4343333333 444444443J NOS Lab FC - licrosoft Virtual FC 20

15、0TAction Edit CIl Fl op?y HelpF8to suitch console uindou.)提示:(1) PspCurrentThread是一个指向当前正在执行的线程的TCB的指针。因此, PspCurrentThread-State代表的是当前线程的状态,PspCurrentThread-RemainderTicks代 表当前被中断的线程所拥有的时间片。初始时,每个线程拥有的时间片都是 TICKS_OF_TIME_SLICE(ps/psp.h的第104行有定义)。其他TCB中各成员代表的意思请参看 2.2.1节的内容。(2) 可能会用到函数:BIT_TEST(PspReadyBitmap, PspCurrentThre

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号