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

上传人:今*** 文档编号:108141417 上传时间:2019-10-22 格式:DOCX 页数:10 大小:339.36KB
返回 下载 相关 举报
实验二时间片轮转算法实验报告概要_第1页
第1页 / 共10页
实验二时间片轮转算法实验报告概要_第2页
第2页 / 共10页
实验二时间片轮转算法实验报告概要_第3页
第3页 / 共10页
实验二时间片轮转算法实验报告概要_第4页
第4页 / 共10页
实验二时间片轮转算法实验报告概要_第5页
第5页 / 共10页
点击查看更多>>
资源描述

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

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

2、绪线程要放入下标为8的链表中。EOS每隔几十毫秒就会发生中断并执行一次线程调度,在调度过程中,总是率先选择高优先级就绪队列中的线程获得处理器,而对于同一个优先级就绪队列中的多个线程,则按照先来先服务(FCFS)的顺序进行调度。即:假如出现了比正在执行的线程优先级更高的线程处于“就绪”状态,则将CPU分配给这个高优先级的线程,而低优先级的线程就进入“就绪”状态;而假如所有“就绪”状态的线程都是同一个优先级,那么只有排在首位的线程被执行,其余同优先级别的线程都将一直处于“就绪”状态。观察EOS内核中基于优先级的抢先式调度策略的具体实施方法:(1)新建一个EOS Kernel项目,起名为EOS_RR

3、_XXXXXXX,(XXXXX代表学号)。(2)按F5启动调试,在控制台中输入命令“rr”后回车,并观察结果。(3)控制台的输出结果应该如下图所示:即,只有第0个新建的线程在第0行显示其计数在增加,说明只有第0个新建的线程在运行,其它线程都没有运行。造成上述现象的原因是:观察ke/sysproc.c中的第690行ConsoleCmdRoundRobin函数,在该函数中调用了第649行的ThreadFunction函数创建了20个优先级别都为8的线程,而此时EOS只实现了基于优先级的抢先式调度,所以至始至终都只有第0个线程在运行。而其他具有相同优先级的线程都没有机会运行,只能处于“就绪”状态。2

4、.2 EOS的线程调度程序 PspSelectNextThread 函数:EOS每次发生中断时,都调用函数PspSelectNextThread来选择即将要执行的线程。该函数的流程图如下图所示:2.2.1 观察PspSelectNextThread函数不发生线程切换时的执行过程:按以下步骤观察PspSelectNextThread函数的执行方法:(1)结束之前的调试,并取消所有断点。(2)在ke/sysproc.c文件的第680行fprintf函数处加一个断点,并按F5启动调试。(3)输入命令“rr”,会在断点处停止。(4)连续按F5两次,直至虚拟机窗口显示如下内容:(5)在左下角“监视”窗口

5、中,添加如下所示4个表达式:“pThreadParameter-Y”,“/t PspReadyBitmap”,“ListGetCount(&PspReadyListHeads8)”,“HighestPriority”。此时会发现,PspReadyBitmap的值为100000001,即表示优先级为8和0的两个队列中存在就绪队列。而pThreadParameter-Y的值应该为0,表示正在调试的是第0个新建的线程。(6)在ps/sched.c文件的第384行BitScanReverse函数处加一个断点,并按F5,到该断点处停止。在“调试”菜单中选择“快速监视”,并输入表达式“*PspCurren

6、tThread”,点击“重新计算”按钮,可以查看当前正在执行的线程(即被中断的线程)的线程控制块中各个域的值。关于线程控制块TCB的定义可参见ps/psp.h的第58行。其中优先级(Priority域)的值为8;状态(State域)的值为2(运行态);时间片(RemainderTicks域)的值为6;线程函数(StartAddr域)为ThreadFunction。综合这些信息即可确定当前正在执行的线程就是新建的第0个线程。关闭“快速监视”对话框。 其中,State的取值范围是:(ps/psp.h的第93行)(7)观察可知,此时监视窗口中ListGetCount(&PspReadyListHea

7、ds8的值为19,即优先级为8的就绪队列中共有19个就绪线程。说明除了正在执行的第0个新建的线程外,其余19个新建的线程都在优先级为8的就绪队列中。ListGetCount函数在文件rtl/list.c中定义。(8)按F10单步调试,会发现执行完BitScanReverse函数后,BitScanReverse函数会从就绪位图中扫描最高优先级,并保存在变量HighestPriority中。查看变量HighestPriority的值为8。(9)按F10单步调试,观察每一个执行步骤,直至465行。会发现并没有进行线程的切换。因为没有比第0个线程优先级更高的就绪线程。2.2.2 观察PspSelect

8、NextThread函数发生线程切换时的执行过程:不要结束2.2.1的调试,但是删除所有的断点,并进行以下操作:(1)在PspSelectNextThread的第395行加一个断点,并按F5继续执行。在虚拟机窗口中可见第0个线程一直在执行。(2)在虚拟机窗口下按一次空格键,EOS会在第395行断点处停止。(3)在“监视”窗口中查看就绪位图的值为1000000000000000100000001,说明此时在优先级为24的就绪队列中存在就绪线程。在“监视”窗口中添加表达式“ListGetCount(&PspReadyListHeads24)”,其值为1,说明优先级为24的就绪队列中只有一个就绪线程

9、。扫描就绪位图后获得的最高优先级的值HighestPriority也就应该是24。(4)按F10单步调试一次,执行的语句会将当前正在执行的第0个新建的线程,放入优先级为8的就绪队列的队首。“监视”窗口中显示的优先级为8的就绪队列中的线程数量就会增加1,变为20。如下图所示:(5)继续按F10单步调试,直到在第444行中断执行,注意观察线程调度执行的每一个步骤。此时,正在执行的第0个新建的线程已经进入了“就绪”状态,让出了CPU。线程调度程序接下来的工作就是选择优先级最高的非空就绪队列的队首线程作为当前运行线程,也就是让优先级为24的线程在CPU上执行。(6)按F10单步调试一次,当前线程Psp

10、CurrentThread指向了优先级为24的线程。可以在“快速监视”窗口中查看表达式“*PspCurrentThread”的值,注意线程控制块中StartAddr域的值为IopConsoleDispatchThread函数(在文件io/console.c中定义),说明这个优先级为24的线程是控制台派遣线程。(7)继续按F10单步调试,直到在PspSelectNextThread函数返回前(第465行)中断执行,注意观察线程调度执行的每一个步骤。此时,优先级为24的线程已经进入了“运行”状态,在中断返回后,就可以开始执行了。在“监视”窗口中,就绪位图的值变为100000001,优先级为24的就

11、绪队列中线程的数量变为0,就绪位图和就绪队列都是在刚刚被调用过的PspUnreadyThread函数(在文件ps/sched.c中定义)内更新的。(8)删除所有断点后结束调试。2.3 为EOS添加时间片轮转调度算法:要求:在ps/sched.c文件的第337行PspRoundRobin函数中,添加适当的代码,使实现时间片轮转算法。测试方法:(1)代码修改完毕后,按F7生成EOS内核项目。(2)按F5启动调试。(3)在EOS控制台中输入命令“rr”后按回车。应能看到20个线程轮流执行的效果,如下图所示: 提示:(1)PspCurrentThread是一个指向当前正在执行的线程的TCB的指针。因此

12、,PspCurrentThread-State代表的是当前线程的状态,PspCurrentThread-RemainderTicks代表当前被中断的线程所拥有的时间片。初始时,每个线程拥有的时间片都是TICKS_OF_TIME_SLICE(ps/psp.h的第104行有定义)。其他TCB中各成员代表的意思请参看2.2.1节的内容。(2)可能会用到函数:BIT_TEST(PspReadyBitmap, PspCurrentThread-Priority),其定义请参见inc/eosdef.h的第220行。(3)可能会用到的函数:PspReadyThread(PspCurrentThread),其

13、定义参见ps/sched.c的第107行。(2)PspRoundRobin函数的流程可如下所示:2.4 完成实验报告按实验报告模板(请见下一页),完成实验报告。实验报告课程名称:实验名称实验日期: 班级: 数媒 姓名: 学号 仪器编号: 一、实验目的:l 调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。 l 在了解原有EOS的基于优先级的抢先式调度策略的基础上,添加时间片轮转调度。 二、实验要求要求:在ps/sched.c文件的第337行PspRoundRobin函数中,添加适当的代码,使实现时间片轮转算法。三、实验内容 2.1 EOS的基于优先级的抢先式调度策略:EOS内核中实现的是一

14、种基于优先级的抢先式调度策略:为线程定义了从0到31的32个优先级,其中0优先级最低,31优先级最高。定义了一个数组: PspReadyListHeads32,其中保存了32个链表头,每个链表都代表一个对应优先级的就绪队列。其中下标为n的链表对应优先级为n的就绪队列。所以,优先级为0的就绪线程要放入下标为0的链表中,优先级为8的就绪线程要放入下标为8的链表中。EOS每隔几十毫秒就会发生中断并执行一次线程调度,在调度过程中,总是率先选择高优先级就绪队列中的线程获得处理器,而对于同一个优先级就绪队列中的多个线程,则按照先来先服务(FCFS)的顺序进行调度。即:假如出现了比正在执行的线程优先级更高的

15、线程处于“就绪”状态,则将CPU分配给这个高优先级的线程,而低优先级的线程就进入“就绪”状态;而假如所有“就绪”状态的线程都是同一个优先级,那么只有排在首位的线程被执行,其余同优先级别的线程都将一直处于“就绪”状态。2.2 EOS的线程调度程序 PspSelectNextThread 函数:EOS每次发生中断时,都调用函数PspSelectNextThread来选择即将要执行的线程。 2.2.1 观察PspSelectNextThread函数不发生线程切换时的执行过程:2.2.2 观察PspSelectNextThread函数发生线程切换时的执行过程:不要结束2.2.1的调试,但是删除所有的断点,并进行以下操作:(1)在PspSelectNextThread的第395行加一个断点,并按F5继续执行。在虚拟机窗口中可见第0个线程一直在执行。(2)在虚拟机窗口下按一次空格键,EOS会在第395行断点处停止。(3)在“监视”窗口中查看就绪位图的值为1000000000000000100000001,说明此时在优先级为24的就绪队列中存在就绪线程。在“监视”窗口中添加表达式“ListGetCount(&PspReadyLis

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

当前位置:首页 > 高等教育 > 大学课件

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