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

上传人:b****2 文档编号:1718581 上传时间:2023-05-01 格式:DOCX 页数:14 大小:572.64KB
下载 相关 举报
实验五时间片轮转调度汇总.docx_第1页
第1页 / 共14页
实验五时间片轮转调度汇总.docx_第2页
第2页 / 共14页
实验五时间片轮转调度汇总.docx_第3页
第3页 / 共14页
实验五时间片轮转调度汇总.docx_第4页
第4页 / 共14页
实验五时间片轮转调度汇总.docx_第5页
第5页 / 共14页
实验五时间片轮转调度汇总.docx_第6页
第6页 / 共14页
实验五时间片轮转调度汇总.docx_第7页
第7页 / 共14页
实验五时间片轮转调度汇总.docx_第8页
第8页 / 共14页
实验五时间片轮转调度汇总.docx_第9页
第9页 / 共14页
实验五时间片轮转调度汇总.docx_第10页
第10页 / 共14页
实验五时间片轮转调度汇总.docx_第11页
第11页 / 共14页
实验五时间片轮转调度汇总.docx_第12页
第12页 / 共14页
实验五时间片轮转调度汇总.docx_第13页
第13页 / 共14页
实验五时间片轮转调度汇总.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

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

《实验五时间片轮转调度汇总.docx》由会员分享,可在线阅读,更多相关《实验五时间片轮转调度汇总.docx(14页珍藏版)》请在冰点文库上搜索。

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

实验五时间片轮转调度汇总

上海应用技术学院

程序设计语言实验报告

实验名称

时间片轮转调度

实验序号

实验五

实验日期

姓名

学号

指导教师

专业

计算机科学与技术

班级

成绩

1、实验目的及要求

为EOS调度器添加时间片轮转调度算法,了解常用调度算法。

2、实验环境

WindowsXP;TevationOSLab。

三、实验内容

1准备实验

按照下面的步骤准备实验:

1.启动OSLab。

2.新建一个EOSKernel项目。

如图1.

图1

3.在“项目管理器”窗口中双击Floppy.img文件,使用FloppyImageEditor工具打开此软盘镜像。

如图2。

图2

4.将本实验文件夹中的multi.exe文件添加到软盘镜像的根目录中。

如图3。

图3

5.点击FloppyImageEditor工具栏上的保存按钮,关闭该工具。

2阅读multi.exe的源代码

在本实验文件夹中找到multi.exe的源代码文件multi.c,使用OSLab打开此文件,仔细阅读此文件中的源代码。

在阅读的过程中需要注意下面的问题:

●在main函数中使用ThreadFunction线程函数创建了23个新线程。

这样在该应用程序创建的进程中,算上主线程后就会包括24个线程。

●主线程会在控制台的第0行循环输出计数,其它的线程也会在控制台的对应行循环输出计数,这样就可以很方便的观察各个线程执行的情况。

●各个线程在向控制台输出时使用“关中断”和“开中断”进行了互斥。

原则上在应用程序中是不能使用“关中断”和“开中断”指令的,这里是为了保证各个线程不进行让权等待,保证实验的效果。

●为了保证实验效果,所有的线程(包括主线程)都是死循环。

也就是说所有的线程都不会结束执行。

3执行multi.exe

按照下面的步骤执行multi.exe,查看其运行效果:

1.按F7生成在3.1中创建的EOSKernel项目。

如图4。

图4

2.按F5启动调试。

如图5。

图5

3.在EOS控制台中输入“A:

\multi.exe”后按回车。

在multi.exe开始执行后,观察其执行结果(如图6)会发现multi.exe的执行没有体现其源代码的设计意图。

通过之前对multi.c的分析,multi进程中的24个线程应该在控制台对应的行中不停地输出字符。

而这里只有主线程在运行,其它线程都没有运行。

图6

造成上述现象的原因是什么呢?

因为进程内的所有线程在被创建时都采用了默认优先级8,这就造成这24个线程的优先级都是相同的。

而此时EOS只实现了基于优先级的抢先式调度算法,还没有实现时间片轮转调度算法,所以至始至终都只有主线程在运行,其它具有相同优先级的线程都没有运行。

4为EOS添加时间片轮转调度算法

4.1要求

修改EOS内核项目ps/sched.c文件中的PspRoundRobin函数(第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的执行效果

图3:

PspRoundRobin函数的流程图

4.3提示

●在EOS操作系统运行过程中,TCB指针变量PspCurrentThread始终指向当前线程。

所以,当发生中断时,PspCurrentThread就指向被中断的线程。

PspCurrentThread的定义参见ps/sched.c的第44行。

TCB结构体定义参见ps/psp.h的第58行。

●PspRoundRobin函数在被调用时,被中断线程(PspCurrentThread指向的线程)的状态可能已经改变(例如从运行状态转变为等待状态)。

所以要先判断一下被中断线程是否仍处于运行状态,只有当被中断线程处于运行状态时才能进行时间片轮转调度。

在PspRoundRobin中的第一行代码可以如下:

if(NULL!

=PspCurrentThread&&Running==PspCurrentThread->State){

//在此实现时间片轮转调度算法

}

线程状态的定义可以参见ps/psp.h的第93行。

●PspRoundRobin函数具体的流程可以参考图3。

●被中断线程所拥有的时间片保存在PspCurrentThread->RemainderTicks中。

●重新为被中断线程分配时间片时,可以使用头文件ps/psp.h中第104行的宏定义TICKS_OF_TIME_SLICE,目前为6。

注意,此宏定义表示每次给线程分配的时钟滴答(Tick)数量,多个时钟滴答组成了线程的时间片。

时钟滴答的大小是由定时器中断的频率确定的,目前每秒触发100次定时器中断,所以每个时钟滴答的大小是10ms。

●在检查是否存在和被中断线程优先级相同的就绪线程时,只需要扫描32位就绪位图即可。

可以使用下面的代码作为判断语句中的布尔表达式:

BIT_TEST(PspReadyBitmap,PspCurrentThread->Priority)

BIT_TEST是一个宏定义函数,其定义参见inc/eosdef.h的第219行。

如果存在和被中断线程优先级相同的就绪线程,此函数返回非0(TURE),否则返回0(FALSE)。

变量PspReadyBitmap是32为就绪位图,其定义参见ps/sched.c的第28行。

●可以使用下面的代码将被中断线程转入就绪状态:

PspReadyThread(PspCurrentThread);

函数PspReadyThread的定义参见ps/sched.c的第106行。

5修改线程的时间片大小

在你成功为EOS添加了时间片轮转调度算法后,可以按照下面的步骤修改时间片的大小:

1.在OSLab的“项目管理器”窗口中找到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:

\multi.exe”后按回车。

观察multi.exe执行的效果。

如图15。

图15

你还可以按照上面的步骤为TICKS_OF_TIME_SLICE取一些极端值,例如20和100等,分别观察multi.exe运行的效果。

通过分析造成运行效果不同的原因,理解时间片的大小对时间片轮转调度造成的影响。

以100为例,过程如下:

(1)修改TICKS_OF_TIME_SLICE的值为100。

如图16。

图16

(2)F7生成项目。

如图17。

图17

(3)F5调试。

如图18。

图18

4、实验结果与分析

1、实验中遇到的问题:

按F5启动调试之后,在EOS控制台中输入“A:

\multi.exe”后按回车。

没有出现如图19的结果.

图6

2、解决方案:

检查之后没有发现问题。

删除之前的内容,从头开始试验。

最后发现上次实验错误的原因是输入“A:

\multi.exe”有误,没有输入反斜杠“\”,修改之后,实验成功。

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2