内容发布更新时间 : 2024/12/23 2:25:25星期一 下面是文章的全部内容请认真阅读。
操作系统实验报告四
[实验题目]
磁盘调度算法SSTF、SCAN、C-SCAN [实验目的]
通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易理解,使磁盘调度的特点更简单明了,能使使用者加深对最短寻道时间优先算法、扫描算法以及循环扫描算法的理解。 [实验内容]
编程实现如下内容:
1. 最短寻道时间优先算法(SSTF); 2. 扫描算法(SCAN)(又叫电梯调度算法); 3. 循环扫描算法(CSCAN) 代码如下:
#define _CRT_SECURE_NO_WARNINGS #include
/*最短寻道时间函数SSTF*/ void SSTF(int a[], int n){ int temp; int now;
int sum = 0, i, j, k=0;
//冒泡排序法对磁道号进行排序
printf(\排序后的磁道分布:\\n\ for (i = 0; i < n; i++){
for (j = i + 1; j < n; j++){ if (a[i]>a[j]){ temp = a[i];
a[i] = a[j]; a[j] = temp; } }
printf(\ if (i % 10 == 9){ printf(\ } }
printf(\
printf(\请输入当前磁道号:\\n\ scanf(\ if (a[0] >=now){
printf(\当前访问的磁道%d\\n\ for (i = 0; i < n-1; i++){
printf(\当前访问的磁道:\\t%d\\n\ }
sum = a[n - 1] - now;
printf(\移动的总磁道数:%d\\n\ }
else if (a[n - 1] <= now){
printf(\当前访问的磁道:%d\\n\ for (j=n-1; i printf(\当前访问的磁道:\\t%d\\n\ } sum = now-a[0]; printf(\移动的总磁道数:%d\\n\ } else{ while (a[k] < now){ k++; } j = k-1; i = 0; while ((j>=0)&&(k if (now - a[j] >= a[k] - now){ printf(\当前访问的磁道:\\t%d\\n\ sum += a[k] - now; now = a[k]; k++; } else{ printf(\当前访问的磁道:\\t%d\\n\ sum += now - a[j]; now = a[j]; j--; } } if (k > n-1){ for (int t = j; t > 0; t--){ i++; if (t == j){ printf(\当前访问的磁道:\\t%d\\n\ } else{ printf(\当前访问的磁道:\\t%d\\n\ } } sum += a[n - 1] - a[0]; } if (j <0){ for (int t = k; t < n; t++){ i++; if (t == k){ printf(\当前访问的磁道:\\t%d\\n\ } else{ printf(\当前访问的磁道:\\t%d\\n\ } } sum += a[n - 1] - a[0]; } } printf(\经过的总磁道数为:%d\\n\ printf(\移动的平均磁道数:%.2lf\\n\ printf(\请再次输入你想使用的方法:\\n\ } /*扫描算法*/ void SCAN(int a[], int n){ int temp; int now; int sum = 0, i, j, k = 0; //冒泡排序法对磁道号进行排序 printf(\排序后的磁道分布:\\n\ for (i = 0; i < n; i++){ for (j = i + 1; j < n; j++){ if (a[i]>a[j]){ temp = a[i]; a[i] = a[j]; a[j] = temp; } } printf(\ if (i % 10 == 9){ printf(\ } } printf(\请输入当前磁道号:\\n\ scanf(\ if (a[0] >= now){ printf(\当前访问的磁道:%d\\n\ for (i = 0; i < n - 1; i++){ printf(\当前访问的磁道:\\t%d\\n\ } sum = a[n - 1] - now; printf(\移动的总磁道数:%d\\n\ } else if (a[n - 1] <= now){ printf(\当前访问的磁道:%d\\n\ for ( j = n - 1; i printf(\当前访问的磁道:\\t%d\\n\ } sum = now - a[0]; printf(\移动的总磁道数:%d\\n\ } else{ int d; while (a[k] < now){ k++; } j = k - 1; printf(\请输入当前磁头移动的方向(0向内,1向外):\\n\ scanf(\ if (d == 1){ for (int t = k; t < n; t++){ printf(\当前访问的磁道:\\t%d\\n\ sum += a[t] - now; now = a[t]; } for (int t = j; t >=0; t--){ printf(\当前访问的磁道:\\t%d\\n\ } sum += a[n - 1] - a[0]; } else if (d == 0){ for (int t = j; t >= 0; t--){ printf(\当前访问的磁道:\\t%d\\n\ sum += now - a[t]; now = a[t]; } for (int t = k; t < n; t++){ printf(\当前访问的磁道:\\t%d\\n\ } sum += a[n - 1] - a[0]; } else{ printf(\输入错误,重新回到选择算法界面!\\n\ } } printf(\经过的总磁道数为:%d\\n\ printf(\移动的平均磁道数:%.2lf\\n\ printf(\请再次输入你想使用的方法:\\n\} /*循环扫描算法*/ void CSCAN(int a[], int n){ int temp; int now; int sum = 0, i, j, k = 0; //冒泡排序法对磁道号进行排序 printf(\排序后的磁道分布:\\n\ for (i = 0; i < n; i++){ for (j = i + 1; j < n; j++){ if (a[i]>a[j]){ temp = a[i]; a[i] = a[j];