
上一篇【操作系统原理 实验报告3】进程同步目录一、实验目的和要求二、实验预习内容三、实验项目摘要四、实验结果与分析实验心得一、实验目的和要求1调试EOS的线程调度程序熟悉基于优先级的抢先式调度。2为EOS添加时间片轮转调度了解其它常用的调度算法。二、实验预习内容1线程调度属于低级调度。2线程调度的对象只包括处于“就绪”状态的线程不包括处于“阻塞”或者“挂起”状态的线程。3目前EOS实现了基于优先级的抢先式调度。当有比正在执行的线程优先级高的线程进入“就绪”状态时这种调度方式允许调度程序停止正在执行的低优先级的线程而将处理器分配给高优先级的线程使之执行。三、实验项目摘要13.2按照步骤执行控制台命令“rr”查看其在没有时间片轮转调度时的执行效果简要给出操作步骤和虚拟机运行截图23.3调试线程调度程序给出各工作过程的调试步骤3.3.1调试当前线程不被抢先的情况3.3.2调试当前线程被抢先的情况33.4为EOS添加时间片轮转调度给出可编辑代码和相应代码截图以及运行截图四、实验结果与分析1思考说明在ThreadFunction函数中为什么可以使用“关中断”和“开中断”的方法来保护控制台这种临界资源而不使用互斥信号量MUTEX来保护临界资源控制台对于新建的线程来说是一种临界资源所以新建的线程在向控制台输出时必须使用“关中断”和“开中断”进行互斥。23.3调试线程调度程序给出以下各过程中要求步骤中的截图3.3.1调试当前线程不被抢先的情况在ps/sched.c文件的PspSelectNextThread函数中调用BitScanReverse函数扫描就绪位图的代码行第384行添加断点后的调试中分别给出表达式“/t PspReadyBitmap”、“*PspCurrentThread”、“ListGetCount(PspReadyListHeads[8])”的情况截图。3.3.2 调试当前线程被抢先的情况给出5、6、8步骤中要求的表达式截图3.4为EOS添加时间片轮转调度算法根据3.4.3的提示修改PspRoundRobin函数在其中实现时间片轮转调度。并测试10各线程轮转执行结果。要求给出rr命令执行结果截图以及“线程运行轨迹”窗口截图。参考已给代码并结合教程P71或ppt的P17理解算法实现。解释其中涉及线程状态及相关变量、函数等如时间片定义、线程优先级。3.4修改线程时间片大小将定义的 TICKS_OF_TIME_SLICE的值修改为 1、20、100分别给出“rr”命令执行的效果截图。通过分析造成执行效果不同的原因理解时间片的大小对时间片轮转调度造成的影响。实验心得本次《操作系统》线程调度实验围绕EOS线程调度程序的调试、基于优先级的抢先式调度的熟悉以及时间片轮转调度算法的添加展开通过实操调试与代码修改让我深入理解了线程调度的核心机制掌握了不同调度算法的实现逻辑与应用场景也深刻体会到操作系统调度模块设计的严谨性与重要性积累了宝贵的实操经验与理论认知。实验前期我通过预习明确了线程调度的核心知识点线程调度属于低级调度调度对象仅为就绪状态的线程不包含阻塞或挂起状态的线程而EOS当前已实现的基于优先级的抢先式调度核心是高优先级线程可抢占低优先级线程的CPU执行权。实验初期我按照步骤执行控制台命令“rr”观察到在未添加时间片轮转调度时线程执行呈现非轮转状态高优先级线程会持续占用CPU低优先级线程无法获得执行机会这让我直观感受到了不同调度算法对线程执行效果的影响也为后续添加时间片轮转调度奠定了基础。调试线程调度程序是本次实验的重点环节分为当前线程不被抢先和被抢先两种情况。在调试不被抢先的场景时我在PspSelectNextThread函数的指定代码行添加断点通过查看“PspReadyBitmap”“*PspCurrentThread”等表达式的取值清晰观察到就绪位图的状态、当前线程信息以及就绪队列的线程数量理解了调度程序如何筛选下一个执行线程。而在调试线程被抢先的情况时通过跟踪相关表达式的变化我明确了高优先级线程进入就绪状态后调度程序如何停止低优先级线程、分配CPU资源深刻掌握了基于优先级的抢先式调度的执行流程将课本中抽象的调度原理转化为可观察、可跟踪的实操过程。为EOS添加时间片轮转调度算法是本次实验的难点也是最能提升实操能力的环节。根据实验提示我重点修改了PspRoundRobin函数结合教程与PPT中的算法思路实现了时间片轮转调度的核心逻辑通过定义时间片大小、判断线程时间片是否耗尽、切换线程执行等步骤让多个线程能够按时间片轮流占用CPU。在测试过程中我通过执行“rr”命令查看线程运行轨迹窗口验证了10个线程能够轮转执行的效果。同时我将TICKS_OF_TIME_SLICE的值修改为1、20、100观察到不同时间片大小对执行效果的显著影响时间片过小时线程切换频繁系统开销增大时间片过大时轮转效果不明显低优先级线程等待时间过长这让我深刻理解了时间片大小设置的合理性对系统性能的重要意义。实验中我还深入思考了临界资源保护的问题明确了为何在ThreadFunction函数中使用“关中断”和“开中断”保护控制台而非互斥信号量。控制台作为多线程共享的临界资源关中断能够直接禁止CPU响应中断避免线程切换从而实现临界区的互斥访问而互斥信号量的实现依赖于线程调度在调度程序调试和修改过程中可能存在冲突因此关中断是更直接、更可靠的保护方式这一思考也让我对临界资源保护的多种方法有了更全面的认识。通过本次实验我不仅熟练掌握了EOS线程调度程序的调试方法成功为系统添加了时间片轮转调度算法更实现了线程调度理论与实操的深度融合。此前我对线程调度的理解仅停留在概念层面通过亲手调试、修改代码、分析实验结果我真正掌握了不同调度算法的核心逻辑与应用场景也认识到自身的不足比如对EOS内核调度模块的底层实现理解不够深入代码修改的熟练度还有待提升。此次实验让我明白操作系统的学习离不开实操严谨的逻辑思维和细致的操作习惯是解决问题的关键未来我将继续加强实操训练深入学习调度算法的优化方法为后续学习更复杂的操作系统模块打下坚实基础。