磁盘寻道算法 实验报告

操作系统实验报告四

[实验题目]

磁盘调度算法SSTF、SCAN、C-SCAN [实验目的]

通过设计一个磁盘调度模拟系统,从而使磁盘调度算法更加形象化,容易理解,使磁盘调度的特点更简单明了,能使使用者加深对最短寻道时间优先算法、扫描算法以及循环扫描算法的理解。 [实验内容]

编程实现如下内容:

1. 最短寻道时间优先算法(SSTF); 2. 扫描算法(SCAN)(又叫电梯调度算法); 3. 循环扫描算法(CSCAN) 代码如下:

#define _CRT_SECURE_NO_WARNINGS #include #include #include #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];

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4