拓展实验三:线程调度算法改进
实验目的
实现多级反馈队列调度算法
实验步骤
实现时间片轮转调度算法。
修改时间片的大小 TICKS_OF_TIME_SLICE 为 100,方便观察执行后的效果。
在控制台命令“rr”的处理函数中,将 Sleep 时间更改为 200*1000,这样可以有充足的时间查看优先级降低后的效果。
修改线程控制块(TCB)结构体,在其中新增两个成员,一个是线程整个生命周期中合计使用的时间片数量,另一个是线程的初始时间片数量。
修改“rr”命令在控制台输出的内容和格式,不再显示线程计数,而是显示线程初始化时间片的大小,已使用时间片的合计数量,剩余时间片的数量。注意,在调用fprintf 函数格式化字符时,需要在字符串的末尾增加一个空格,否则会导致输出异常。
在实现多级反馈队列调度算法后(注意:数字越大,优先级越高,反之,数字越小,优先级越低),使用实验 6 中提供的“rr”命令,查看各个线程的优先级逐步降低的过程。
由于 EOS 没有提供鼠标,可以使用键盘事件或者控制台命令使线程优先级提升。由于键盘事件与线程之间没有建立一个明确的会话关系,所以还需要解决使用键盘事件提升哪个线程优先级的问题。一个简单的方式是,在键盘的中断处理程序中(在io/driver/keyboard.c 文件的 396 行的 KbdIsr 函数),如果当前线程(注意不能是 2 号线程)处于运行状态并且优先级大于 0 小于 8 的话(由于空闲线程的优先级为 0,不能更改该线程的优先级,如果当前线程的优先级为 8,没有必要再做提升线程优先级的操作),按下空格键,响应键盘事件后,就将其优先级提升为默认的优先
级即可。关于键盘中断相关的内容可以参考实验 12。
使用控制台命令提升线程优先级,在 EOS 操作系统中实现一个“up ThreadID”命令,通过输入的线程 ID 来提升对应线程的优先级。在实现命令的过程中需要做如下判断:需要提升线程的优先级应该大于 0 并且小于 8,如果是处于就绪状态的线程,需要先将该线程移出队列,然后设置该线程的优先级为默认值 8,并设置线程的初始时间片大小和剩余时间片大小,如果是处于运行状态或阻塞状态的线程,直接设置线程的优先级即可。测试提升线程优先级命令的方法:在控制台窗口 1 执行 rr时,可以按 Ctrl + F2 切换到控制台窗口 2,然后输入“up 24”命令,按回车执行该命令,按 Ctrl + F1 切换到控制台窗口 1,可以查看 ID 为 24 的线程优先级已