图 3.3.1
(2)实验指导P177-3.3验证验证最短寻道时间优先(SSTF)磁盘调度算法,要求请给出在“输出”窗口中的结果。
答:最短寻道时间优先(SSTF)磁盘调度算法在“输出”窗口中的结果如下图所示。
图 3.3.2
(3)实验指导P178-3.4验证SSTF算法造成的线程“饥饿”现象,要求请给出在“输出”窗口中的结果。
答:SSTF算法造成的线程“饥饿”现象在“输出”窗口中的结果如下图所示。
5
图 3.3.3
(4)实验指导P179-3.5验证扫描(SCAN)磁盘调度算法,要求在非饥饿(即《实验指导》P176-3.2节中的数据)和饥饿(即《实验指导》P178-3.4节中的数据)请给出在“输出”窗口中的结果,并且要求在每次输入两次“ds”命令(注意不要连续输入,要等第一次“ds”命令执行完,再输入第二次“ds”命令),分析结果为什么不同。
答:在非饥饿情况下,“输出”窗口中的结果如下图所示。
图 3.3.4
在饥饿情况下,“输出”窗口中的结果如下图所示。
6
图 3.3.5
ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule 函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出的结果会不一样。
(5)在执行 SCAN、N-Step-SCAN 磁盘调度算法时,如果在EOS控制台中多次输入“ds”命令,调度的顺序会发生变化,说明造成这种现象的原因(提示:注意这两种算法使用的全局变量)。尝试修改源代码,使这两种算法在多次执行时,都能确保调度的顺序一致(提示:可以参考 io/block.c 文件中IopReceiveRequest 函数和 IopProcessNextRequest 函数判断磁盘调度算法开始工作和结束工作的方法)。
答:ScanInside是一个全局变量,当第一次执行“ds”命令时,调用IopDiskSchedule 函数,ScanInside被修改了一次,再次执行“ds”命令时,ScanInside不会被重置,因此输出的结果会不一样。只需在for循环结束后添加如下代码,就能确保调度的顺序一致。
图 3.3.6
7
(6)尝试在 io/block.c 文件中定义一个全局的函数指针变量 DiskScheduleFunc,该函数指针初始指向实现了 FCFS 算法的 IopDiskSchedule 函数。修改 io/block.c 文件中的 IopProcessNextRequest 函数,在该函数中不再直接调用 IopDiskSchedule 函数,而是调用函数指针 DiskScheduleFunc 指向的磁盘调度算法函数;ke/sysproc.c 文件中的 ConsoleCmdDiskSchedule 函数中也不再直接调用IopDiskSchedule函数,也要修改为调用函数指针DiskScheduleFunc指向的磁盘调度算法函数。最后,添加一个控制台命令“sstf”,该命令使函数指针 DiskScheduleFunc 指向实现了 SSTF 算法的函数。这样,在 EOS启动后默认会执行FCFS 算法,执行控制台命令“sstf”后,会执行SSTF算法。按照这种方式依次实现“fcfs”、“scan”、“cscan”和“nstepscan”命令。说明这种在EOS运行时动态切换磁盘调度算法的好处。
答:首先在block.c 中定义一个全局的函数指针变量 DiskScheduleFunc。
图 3.3.7
修改IopProcessNextRequest 函数和ConsoleCmdDiskSchedule 函数,使其不再直接调用 IopDiskSchedule 函数而是调用函数指针DiskScheduleFunc指向的磁盘调度算法函数。
图 3.3.8
调用函数前先声明。
图 3.3.9
8
添加一个控制台命令“sstf”,该命令使函数指针 DiskScheduleFunc 指向实现了 SSTF 算法的函数。
图 3.3.10
验证结果如下图所示。
图 3.3.11
图 3.3.12
9