实验五时间片轮转调度.docx

上传人:小飞机 文档编号:3436165 上传时间:2023-03-13 格式:DOCX 页数:8 大小:39.27KB
返回 下载 相关 举报
实验五时间片轮转调度.docx_第1页
第1页 / 共8页
实验五时间片轮转调度.docx_第2页
第2页 / 共8页
实验五时间片轮转调度.docx_第3页
第3页 / 共8页
实验五时间片轮转调度.docx_第4页
第4页 / 共8页
实验五时间片轮转调度.docx_第5页
第5页 / 共8页
亲,该文档总共8页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《实验五时间片轮转调度.docx》由会员分享,可在线阅读,更多相关《实验五时间片轮转调度.docx(8页珍藏版)》请在三一办公上搜索。

1、实验五时间片轮转调度上海应用技术学院 程序设计语言实验报告 实验名称 时间片轮转调度 实验序号 实验五 实验日期 姓 名 学 号 指导教师 专 业 计算机科学与技术 一、实验目的及要求 班 级 成 绩 为EOS调度器添加时间片轮转调度算法,了解常用调度算法。 二、实验环境 Windows XP;Tevation OS Lab。 三、实验内容 1 准备实验 按照下面的步骤准备实验: 1. 启动OS Lab。 2. 新建一个EOS Kernel项目。如图1. 图1 3. 在“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor工具打开此软盘镜像。如图2。 图2 4

2、. 将本实验文件夹中的multi.exe文件添加到软盘镜像的根目录中。如图3。 图3 5. 点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。 2 阅读multi.exe的源代码 在本实验文件夹中找到multi.exe的源代码文件multi.c,使用OS Lab打开此文件,仔细阅读此文件中的源代码。在阅读的过程中需要注意下面的问题: l 在main函数中使用ThreadFunction线程函数创建了23个新线程。这样在该应用程序创建的进程中,算上主线程后就会包括24个线程。 l 主线程会在控制台的第0行循环输出计数,其它的线程也会在控制台的对应行循环输出计数,这样就可以很方

3、便的观察各个线程执行的情况。 l 各个线程在向控制台输出时使用“关中断”和“开中断”进行了互斥。原则上在应用程序中是不能使用“关中断”和“开中断”指令的,这里是为了保证各个线程不进行让权等待,保证实验的效果。 l 为了保证实验效果,所有的线程都是死循环。也就是说所有的线程都不会结束执行。 3 执行multi.exe 按照下面的步骤执行multi.exe,查看其运行效果: 1. 按F7生成在3.1中创建的EOS Kernel项目。如图4。 图4 2. 按F5启动调试。如图5。 图5 3. 在EOS控制台中输入“A:multi.exe”后按回车。 在multi.exe开始执行后,观察其执行结果会发

4、现multi.exe的执行没有体现其源代码的设计意图。通过之前对multi.c的分析,multi进程中的24个线程应该在控制台对应的行中不停地输出字符。而这里只有主线程在运行,其它线程都没有运行。 图6 造成上述现象的原因是什么呢?因为进程内的所有线程在被创建时都采用了默认优先级8,这就造成这24个线程的优先级都是相同的。而此时EOS只实现了基于优先级的抢先式调度算法,还没有实现时间片轮转调度算法,所以至始至终都只有主线程在运行,其它具有相同优先级的线程都没有运行。 4 为EOS添加时间片轮转调度算法 4.1 要求 修改EOS内核项目ps/sched.c文件中的PspRoundRobin函数(

5、第335行),在其中实现时间片轮转调度算法。如图7。 图7 4.2 测试方法 1. 代码修改完毕后,按F7生成EOS内核项目。如图8。 图8 2. 按F5启动调试。如图9。 图9 3. 在EOS控制台中输入“A:multi.exe”后按回车。应能看到24个线程并发执行的效果,如图10。 图10 图2:进行时间片轮转调度时multi.exe的执行效果 PspRoundRobin函数开始执行否被中断线程仍处于运行状态?是被中断线程的时间片减少1否被中断线程的剩余时间片等于0?是重新为被中断线程分配时间片否存在和被中断线程优先级相同的就绪线程?是将被中断线程转入就绪状态函数返回图3:PspRound

6、Robin函数的流程图 4.3 提示 l 在EOS操作系统运行过程中,TCB指针变量PspCurrentThread始终指向当前线程。所以,当发生中断时,PspCurrentThread就指向被中断的线程。PspCurrentThread的定义参见ps/sched.c的第44行。TCB结构体定义参见ps/psp.h的第58行。 l PspRoundRobin函数在被调用时,被中断线程的状态可能已经改变。所以要先判断一下被中断线程是否仍处于运行状态,只有当被中断线程处于运行状态时才能进行时间片轮转调度。在PspRoundRobin中的第一行代码可以如下: if (NULL != PspCurre

7、ntThread & Running = PspCurrentThread-State) / 在此实现时间片轮转调度算法 线程状态的定义可以参见ps/psp.h的第93行。 l PspRoundRobin函数具体的流程可以参考图3。 l 被中断线程所拥有的时间片保存在PspCurrentThread-RemainderTicks中。 l 重新为被中断线程分配时间片时,可以使用头文件ps/psp.h中第104行的宏定义TICKS_OF_TIME_SLICE,目前为6。注意,此宏定义表示每次给线程分配的时钟滴答数量,多个时钟滴答组成了线程的时间片。时钟滴答的大小是由定时器中断的频率确定的,目前每秒

8、触发100次定时器中断,所以每个时钟滴答的大小是10ms。 l 在检查是否存在和被中断线程优先级相同的就绪线程时,只需要扫描32位就绪位图即可。可以使用下面的代码作为判断语句中的布尔表达式: BIT_TEST(PspReadyBitmap, PspCurrentThread-Priority) BIT_TEST是一个宏定义函数,其定义参见inc/eosdef.h的第219行。如果存在和被中断线程优先级相同的就绪线程,此函数返回非0,否则返回0。 变量PspReadyBitmap是32为就绪位图,其定义参见ps/sched.c的第28行。 l 可以使用下面的代码将被中断线程转入就绪状态: Psp

9、ReadyThread(PspCurrentThread); 函数PspReadyThread的定义参见ps/sched.c的第106行。 5 修改线程的时间片大小 在你成功为EOS添加了时间片轮转调度算法后,可以按照下面的步骤修改时间片的大小: 1. 在OS Lab的“项目管理器”窗口中找到ps/psp.h文件,并双击打开此文件。如图11。 图11 2. 将ps/psp.h第104行定义的TICKS_OF_TIME_SLICE的值修改为1。如图12。 图12 4. 按F7生成EOS内核项目。如图13。 图13 5. 按F5启动调试。如图14。 图14 3. 在EOS控制台中输入“A:mult

10、i.exe”后按回车。观察multi.exe执行的效果。如图15。 图15 你还可以按照上面的步骤为TICKS_OF_TIME_SLICE取一些极端值,例如20和100等,分别观察multi.exe运行的效果。通过分析造成运行效果不同的原因,理解时间片的大小对时间片轮转调度造成的影响。 以100为例,过程如下: 修改TICKS_OF_TIME_SLICE的值为100。如图16。 图16 (2)F7生成项目。如图17。 图17 F5调试。如图18。 图18 四、实验结果与分析 1、实验中遇到的问题:按F5启动调试之后,在EOS控制台中输入“A:multi.exe”后按回车。没有出现如图19的结果 . 图6 2、解决方案:检查之后没有发现问题。删除之前的内容,从头开始试验。 最后发现上次实验错误的原因是输入“A:multi.exe”有误,没有输入反斜杠“”,修改之后,实验成功。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号