时间片轮转调度.doc_第1页
时间片轮转调度.doc_第2页
时间片轮转调度.doc_第3页
时间片轮转调度.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、时间片轮转调度实验性质:设计建议学时:2学时一、实验目的l 为eos调度器添加时间片轮转调度算法,了解常用调度算法。二、预备知识阅读eos实验指南5.4节。重点理解eos当前使用的基于优先级的抢先式调度,调度程序执行的过程和时机,以及时间片轮转调度实现的方法。三、实验内容3.1 准备实验按照下面的步骤准备实验:1. 启动os lab。2. 新建一个eos kernel项目。3. 在“项目管理器”窗口中双击floppy.img文件,使用floppyimageeditor工具打开此软盘镜像。4. 将本实验文件夹中的multi.exe文件添加到软盘镜像的根目录中。5. 点击floppyimageed

2、itor工具栏上的保存按钮,关闭该工具。3.2 阅读multi.exe的源代码在本实验文件夹中找到multi.exe的源代码文件multi.c,使用os lab打开此文件,仔细阅读此文件中的源代码。在阅读的过程中需要注意下面的问题:l 在main函数中使用threadfunction线程函数创建了23个新线程。这样在该应用程序创建的进程中,算上主线程后就会包括24个线程。l 主线程会在控制台的第0行循环输出计数,其它的线程也会在控制台的对应行循环输出计数,这样就可以很方便的观察各个线程执行的情况。l 各个线程在向控制台输出时使用“关中断”和“开中断”进行了互斥。原则上在应用程序中是不能使用“关

3、中断”和“开中断”指令的,这里是为了保证各个线程不进行让权等待,保证实验的效果。l 为了保证实验效果,所有的线程(包括主线程)都是死循环。也就是说所有的线程都不会结束执行。3.3 执行multi.exe按照下面的步骤执行multi.exe,查看其运行效果:1. 按f7生成在3.1中创建的eos kernel项目。2. 按f5启动调试。3. 在eos控制台中输入“a:multi.exe”后按回车。在multi.exe开始执行后,观察其执行结果(如图1)会发现multi.exe的执行没有体现其源代码的设计意图。通过之前对multi.c的分析,multi进程中的24个线程应该在控制台对应的行中不停地

4、输出字符。而这里只有主线程在运行,其它线程都没有运行。图1:不进行时间片轮转调度时multi.exe的执行效果造成上述现象的原因:进程内的所有线程在被创建时都采用了默认优先级8,这就造成这24个线程的优先级都是相同的。而此时eos只实现了基于优先级的抢先式调度算法,还没有实现时间片轮转调度算法,所以至始至终都只有主线程在运行,其它具有相同优先级的线程都没有运行。3.4 为eos添加时间片轮转调度算法3.4.1 要求修改eos内核项目ps/sched.c文件中的psproundrobin函数(第335行),在其中实现时间片轮转调度算法。3.4.2 测试方法1. 代码修改完毕后,按f7生成eos内

5、核项目。2. 按f5启动调试。3. 在eos控制台中输入“a:multi.exe”后按回车。应能看到24个线程并发执行的效果,如图2。图2:进行时间片轮转调度时multi.exe的执行效果图3:psproundrobin函数的流程图3.4.3 提示l 在eos操作系统运行过程中,tcb指针变量pspcurrentthread始终指向当前线程。所以,当发生中断时,pspcurrentthread就指向被中断的线程。pspcurrentthread的定义参见ps/sched.c的第44行。tcb结构体定义参见ps/psp.h的第58行。l psproundrobin函数在被调用时,被中断线程(ps

6、pcurrentthread指向的线程)的状态可能已经改变(例如从运行状态转变为等待状态)。所以要先判断一下被中断线程是否仍处于运行状态,只有当被中断线程处于运行状态时才能进行时间片轮转调度。在psproundrobin中的第一行代码可以如下:if (null != pspcurrentthread & running = pspcurrentthread-state) / 在此实现时间片轮转调度算法线程状态的定义可以参见ps/psp.h的第93行。l psproundrobin函数具体的流程可以参考图3。l 被中断线程所拥有的时间片保存在pspcurrentthread-remaindert

7、icks中。l 重新为被中断线程分配时间片时,可以使用头文件ps/psp.h中第104行的宏定义ticks_of_time_slice,目前为6。注意,此宏定义表示每次给线程分配的时钟滴答(tick)数量,多个时钟滴答组成了线程的时间片。时钟滴答的大小是由定时器中断的频率确定的,目前每秒触发100次定时器中断,所以每个时钟滴答的大小是10ms。l 在检查是否存在和被中断线程优先级相同的就绪线程时,只需要扫描32位就绪位图即可。可以使用下面的代码作为判断语句中的布尔表达式:bit_test(pspreadybitmap, pspcurrentthread-priority)bit_test是一个

8、宏定义函数,其定义参见inc/eosdef.h的第219行。如果存在和被中断线程优先级相同的就绪线程,此函数返回非0(ture),否则返回0(false)。变量pspreadybitmap是32为就绪位图,其定义参见ps/sched.c的第28行。l 可以使用下面的代码将被中断线程转入就绪状态:pspreadythread(pspcurrentthread);函数pspreadythread的定义参见ps/sched.c的第106行。3.5 修改线程的时间片大小 在成功为eos添加了时间片轮转调度算法后,可以按照下面的步骤修改时间片的大小:1. 在os lab的“项目管理器”窗口中找到ps/p

9、sp.h文件,并双击打开此文件。2. 将ps/psp.h第104行定义的ticks_of_time_slice的值修改为1。4. 按f7生成eos内核项目。5. 按f5启动调试。3. 在eos控制台中输入“a:multi.exe”后按回车。观察multi.exe执行的效果。你还可以按照上面的步骤为ticks_of_time_slice取一些极端值,例如20和100等,分别观察multi.exe运行的效果。通过分析造成运行效果不同的原因,理解时间片的大小对时间片轮转调度造成的影响。四、思考与练习l 开始eos只实现了基于优先级的抢先式调度,这导致同优先级的线程只能有一个被执行。当实现了时间片轮转调度算法后,同优先级的线程就能够轮流执行从而获得均等的执行机会。但是,如果有高优先级的线程一直占用cpu,低优先级的线程就永远不会被执行,请设计一种调度算法来解决此问题,让低优先级的线程也能获得被执行的机会。l eos内核时间片大小取60ms(和windows操作系统完全相同),在线程比较多时,就可以观察出线程轮流执行的情况(因为此时一次轮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论