实验五-时间片轮转调度.docxVIP

  • 102
  • 1
  • 约3.37千字
  • 约 11页
  • 2022-06-30 发布于上海
  • 举报
上海应用技术学院 程序设计语言实验报告 实验名称 时间片轮转调度 实验序号 实验五 实验日期姓 名 学 号 指导教师 专 业 计算机科学与技术 班 级 成 绩 一、实验目的及要求 为 EOS 调度器添加时间片轮转调度算法,了解常用调度算法。 二、实验环境 Windows XP;Tevation OS Lab。 三、实验内容 准备实验 按照下面的步骤准备实验: 启动 OS Lab。 新建一个 EOS Kernel 项目。如图 1. 图 1 在“项目管理器”窗口中双击 Floppy.img 文件,使用 FloppyImageEditor 工具打开此 软盘镜像。如图 2。 图 2 将本实验文件夹中的 multi.exe 文件添加到软盘镜像的根目录中。如图 3。 图 3 点击 FloppyImageEditor 工具栏上的保存按钮,关闭该工具。 阅读 multi.exe 的源代码 在本实验文件夹中找到 multi.exe 的源代码文件 multi.c,使用 OS Lab 打开此文件,仔细阅读此文件中的源代码。在阅读的过程中需要注意下面的问题: 在 main 函数中使用 ThreadFunction 线程函数创建了 23 个新线程。这样在该应用程序 创建的进程中,算上主线程后就会包括 24 个线程。 主线程会在控制台的第 0 行循环输出计数,其它的线程也会在控制台的对应行循环输出计数,这样就可以很方便的观察各个线程执行的情况。 各个线程在向控制台输出时使用“关中断”和“开中断”进行了互斥。原则上在应用程 序中是不能使用“关中断”和“开中断”指令的,这里是为了保证各个线程不进行让权等待,保证实验的效果。 为了保证实验效果,所有的线程(包括主线程)都是死循环。也就是说所有的线程都不 会结束执行。 执行 multi.exe 按照下面的步骤执行 multi.exe,查看其运行效果: 按 F7 生成在 3.1 中创建的 EOS Kernel 项目。如图 4。 图 4 按 F5 启动调试。如图 5。 图 5 在 EOS 控制台中输入“A:\multi.exe”后按回车。 在 multi.exe 开始执行后,观察其执行结果(如图 6)会发现 multi.exe 的执行没有体现其源代码的设计意图。通过之前对 multi.c 的分析,multi 进程中的 24 个线程应该在控制台对应的行中不停地输出字符。而这里只有主线程在运行,其它线程都没有运行。 图 6 造成上述现象的原因是什么呢?因为进程内的所有线程在被创建时都采用了默认优先级8,这就造成这 24 个线程的优先级都是相同的。而此时 EOS 只实现了基于优先级的抢先式调度算法,还没有实现时间片轮转调度算法,所以至始至终都只有主线程在运行,其它具有相同优先级的线程都没有运行。 为 EOS 添加时间片轮转调度算法 要求 修改 EOS 内核项目 ps/sched.c 文件中的 PspRoundRobin 函数(第 335 行),在其中实现时间片轮转调度算法。如图 7。 图 7 测试方法 代码修改完毕后,按 F7 生成 EOS 内核项目。如图 8。 图 8 按 F5 启动调试。如图 9。 图 9 在 EOS 控制台中输入“A:\multi.exe”后按回车。应能看到 24 个线程并发执行的效果,如图 10。 图 10 图 2:进行时间片轮转调度时 multi.exe 的执行效果 PspRoundRobin 函数开始执行 否 被中断线程仍处于运行状态? 是 被中断线程的时间片减少1 否 被中断线程的剩余时间片等于0? 是 重新为被中断线程分配时间片 存在和被中断 否 线程优先级相 同的就绪线程? 是 将被中断线程转入就绪状态 函数返回 图 3:PspRoundRobin 函数的流程图 提示 在 EOS 操作系统运行过程中,TCB 指针变量 PspCurrentThread 始终指向当前线程。所以, 当发生中断时,PspCurrentThread 就指向被中断的线程。PspCurrentThread 的定义参见ps/sched.c 的第 44 行。TCB 结构体定义参见 ps/psp.h 的第 58 行。 PspRoundRobin 函数在被调用时,被中断线程(PspCurrentThread 指向的线程)的状态可 能已经改变(例如从运行状态转变为等待状态)。所以要先判断一下被中断线程是否仍处于运行状态, 只有当被中断线程处于运行状态时才能进行时间片轮转调度。在PspRoundRobin 中的第一行代码可以如下: if (NULL != PspCurrentThread Running == PspCurrentThread-State) { // 在此实现时间片轮转调度算法 } 线程状态的定义可以参见

文档评论(0)

1亿VIP精品文档

相关文档