程序设计语言实验报告实验名称时间片轮转调度实验序号实验五实验日期姓名学号指导教师专业计算机科学与技术班级成绩实验目的及要求为EOS调度器添加时间片轮转调度算法,了解常用调度算法。实验环境WindowsXP;TevationOSLab。三、实验内容1准备实验按照下面的步骤准备实验:启动OSLab。新建一个EOSKernel项目。“项目管理器”,使用FloppyImageEditor工具打开此软盘镜像。如图2。。如图3。图3点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。,使用OSLab打开此文件,仔细阅读此文件中的源代码。在阅读的过程中需要注意下面的问题:在main函数中使用ThreadFunction线程函数创建了23个新线程。这样在该应用程序创建的进程中,算上主线程后就会包括24个线程。主线程会在控制台的第0行循环输出计数,其它的线程也会在控制台的对应行循环输出计数,这样就可以很方便的观察各个线程执行的情况。各个线程在向控制台输出时使用“关中断”和“开中断”进行了互斥。原则上在应用程序中是不能使用“关中断”和“开中断”指令的,这里是为了保证各个线程不进行让权等待,保证实验的效果。为了保证实验效果,所有的线程(包括主线程)都是死循环。也就是说所有的线程都不会结束执行。,查看其运行效果:。如图4。图4按F5启动调试。如图5。图5在EOS控制台中输入“A:\”后按回车。,观察其执行结果(如图6)。,multi进程中的24个线程应该在控制台对应的行中不停地输出字符。而这里只有主线程在运行,其它线程都没有运行。图6造成上述现象的原因是什么呢?因为进程内的所有线程在被创建时都采用了默认优先级8,这就造成这24个线程的优先级都是相同的。而此时EOS只实现了基于优先级的抢先式调度算法,还没有实现时间片轮转调度算法,所以至始至终都只有主线程在运行,其它具有相同优先级的线程都没有运行。(第335行),在其中实现时间片轮转调度算法。如图7。,按F7生成EOS内核项目。如图8。图8按F5启动调试。如图9。图9在EOS控制台中输入“A:\”后按回车。应能看到24个线程并发执行的效果,如图10。图10图2::,TCB指针变量PspCurrentThread始终指向当前线程。所以,当发生中断时,PspCurrentThread就指向被中断的线程。PspCurrentThread的定义参见ps/。TCB结构体定义参见ps/。PspRoundRobin函数在被调用时,被中断线程(PspCurrentThread指向的线程)的状态可能已经改变(例如从运行状态转变为等待状态)。所以要先判断一下被中断线程是否仍处于运行状态,只有当被中断线程处于运行状态时才能进行时间片轮转调度。在PspRoundRobin中的第一行代码可以如下:if(NULL!=PspCurrentThread&&Running==PspCurrentThread->State){ //在此实现时间片轮转调度算法}线程状态的定义可以参见ps/。PspRoundRobin函数具体的流程可以参考图3。被中断线程所拥有的时间片保存在PspCurrentThread->RemainderTicks中。重新为被中断线程分配时间片时,可以使用头文件ps/,目前为6。注意,此宏定义表示每次给线程分配的时钟滴答(Tick)数量,多个时钟滴答组成了线程的时间片。时钟滴答的大小是由定时器中断的频率确定的,目前每秒触发100次定时器中断,所以每个时钟滴答的大小是10ms。在检查是否存在和被中断线程优先级相同的就绪线程时,只需要扫描32位就绪位图即可。可以使用下面的代码作为判断语句中的布尔表达式:BIT_TEST(PspReadyBit
实验五-时间片轮转调度 来自淘豆网m.daumloan.com转载请标明出处.