2024年4月12日发(作者:)

《操作系统》实验报告

实验题目 时间片轮转调度

学生姓名

lee

学 号

专业班级

指导教师

院系名称 计算机与信息学院

2017 年 10

月 30 日

实验6 时间片轮转调度

1. 实验目的与要求

调试EOS的线程调度程序,熟悉基于优先级的抢先式调度。

为EOS添加时间片轮转调度,了解其它常用的调度算法。

2. 实验原理

阅读本书第5章中的第5.4节。重点理解EOS当前使用的基于优先级的抢先式调度,调度程

序执行的时机和流程,以及实现时间片轮转调度的细节。

3. 实验内容

3.1 准备实验

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

1. 启动OS Lab。

2. 新建一个EOS Kernel项目。

3.2 阅读控制台命令“rr”相关的源代码

阅读ke/sysproc.c文件中第690行的ConsoleCmdRoundRobin函数,及该函数用到的第649

行的ThreadFunction函数和第642行的THREAD_PARAMETER结构体,学习“rr”命令是如何测试

时间片轮转调度的。在阅读的过程中需要特别注意下面几点:

在ConsoleCmdRoundRobin函数中使用ThreadFunction函数做为线程函数,新建了20个

优先级为8的线程,做为测试时间片轮转调度用的线程。

在新建的线程中,只有正在执行的线程才会在控制台的对应行(第0个线程对应第0行,

第1个线程对应第1行)增加其计数,这样就可以很方便的观察到各个线程执行的情况。

控制台对于新建的线程来说是一种临界资源,所以,新建的线程在向控制台输出时,

必须使用“关中断”和“开中断”进行互斥(参见ThreadFunction函数的源代码)。

由于控制台线程的优先级是24,高于新建线程的优先级 8,所以只有在控制台线程进

入“阻塞”状态后,新建的线程才能执行。

新建的线程会一直运行,原因是在ThreadFunction函数中使用了死循环,所以只能在

ConsoleCmdRoundRobin函数的最后调用TerminateThread函数来强制结束这些新建的线

程。

按照下面的步骤执行控制台命令“rr”,查看其在没有时间片轮转调度时的执行效果:

1. 按F7生成在本实验3.1中创建的EOS Kernel项目。

2. 按F5启动调试。

3. 待EOS启动完毕,在EOS控制台中输入命令“rr”后按回车。

命令开始执行后,观察其执行效果(如图1),会发现并没有体现“rr”命令相关源代码的设计

意图。通过之前对这些源代码的学习,20个新建的线程应该在控制台对应的行中轮流地显

示它们的计数在增加,而现在只有第0个新建的线程在第0行显示其计数在增加,说明只有