一、实验目的
磁盘是高速、大容量、旋转型、可直接存取的存储设备。它作为计算机系统的辅助存储器,担负着繁重的输入输出工作,在现代计算机系统中往往同时会有若干个要求访问磁盘的输入输出要求。系统可采用一种策略,尽可能按最佳次序执行访问磁盘的请求。由于磁盘访问时间主要受寻道时间 T 的影响,为此需要采用合适的寻道算法,以降低寻道时间。本实验要求学生模拟设计一个磁盘调度程序,观察调度程序的动态运行过程。通过实验让学生理解和掌握磁盘调度的职能。
二、实验内容:
模拟电梯调度算法,对磁盘进行移臂操作
三、提示及要求:
1、 假设磁盘只有一个盘面,并且磁盘是可移动头磁盘。
2、 磁盘是可供多个进程共享的存储设备,但一个磁盘每个时刻只能为一个进程服务。当有进程在访问某个磁盘时,其它想访问该磁盘的进程必须等待,直到磁盘一次工作结束。当有多个进程提出输入输出请求而处于等待状态时,可用电梯调度算法从若干个等待访问者中选择一个进程,让它访问磁盘。为此设置“驱动调度”进程。
3、 由于磁盘与处理器是并行工作的,所以当磁盘在为一个进程服务时,占有处理器的其它进程可以提出使用磁盘(这里我们只要求访问磁道),即动态申请访问磁道,为此设置“接受请求”进程。
4、 为了模拟以上两个进程的执行,可以考虑使用随机数来确定二者的允许顺序,程序结构图参考附图:
5、 “接受请求”进程建立一张“进程请求 I/O”表,指出等待访问磁盘的进程要求访问的磁道,表的格式如下:
6、 “磁盘调度”的功能是查“请求 I/O”表,当有等待访问的进程时,按电梯调度算法(SCAN 算法)从中选择一个等待访问的进程,按其指定的要求访问磁道。SCAN 算法参考课本第九章。算法模拟框图略。
7、 附图中的“初始化”工作包括:初始化“请求 I/O”表,设置置当前移臂方向;当前磁道号。并且假设程序运行前“请求 I/O”表中已有若干进程(4~ 8 个)申请访问相应磁道。
四、实验方案
五、实验代码(JAVA)
import java.util.Random;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("请输入访问磁道号的数量:");
final int x=in.nextInt();
System.out.println("请选择磁头的移动方式(q->小到大,w->大到小):");
char dir = in.next().charAt(0);
System.out.println("请输入磁头初始位置(0-200):");
int start = in.nextInt();
int[] a = new int[x];
boolean[] b = new boolean[x]; //判断是否已完成
Random r = new Random(System.currentTimeMillis()); //随机生成数列
System.out.println("以下为生成的随机数列:");
for (int i = 0; i < x; i++) {
a[i] = r.nextInt(200);
System.out.print(a[i]+" "); //输出数列
}
System.out.println();
/*System.out.println("请输入磁道访问序列(15个且0-200之间):");//手动输入序列
for(int i=0;i<a.length;i++){
a[i]=in.nextInt();
}*/
for (int i = 0; i < x; i++) { //冒泡排序
for (int j = 0; j < x - i - 1; j++) {
if (a[j] > a[j + 1]) {
int temp = a[j + 1];
a[j + 1] = a[j];
a[j] = temp;
}
}
}
int ave = 0;
switch (dir) {
case 'q' -> { //小到大
System.out.println("访问磁道 移动距离");
for (int i = 0; i < x; i++) {
if (a[i] >= start) {
System.out.println(a[i] + " " + Math.abs(a[i] - start));
ave+=Math.abs(a[i] - start);
start = a[i];
b[i] = true;
}
}
for (int i = 0; i < x; i++) {
if (!b[i]) {
System.out.println(a[i] + " " + Math.abs(a[i] - start));
ave+=Math.abs(a[i] - start);
start = a[i];
}
}
}
case 'w' -> { //大到小
System.out.println("访问磁道 移动距离");
for (int i = x - 1; i >= 0; i--) {
if (a[i] <= start) {
System.out.println(a[i] + " " + Math.abs(start - a[i]));
ave+=Math.abs(a[i] - start);
start = a[i];
b[i] = true;
}
}
for (int i = x - 1; i >= 0; i--) {
if (!b[i]) {
System.out.println(a[i] + " " + Math.abs(start - a[i]));
ave+=Math.abs(a[i] - start);
start = a[i];
}
}
}
}
System.out.print("平均移动距离为:"+ave/x);
}
}
六、运行结果
- 输入:
2. 生成随机数列:
3. 磁道访问与平均寻道长度: