磁盘调度算法模拟(FIFO,SSTF,SCAN,C-SCAN)
1.都是从磁道号为100开始。输入的数据为:55 58 39 18 90 160 150 38 184
2.其中SCAN和C-SCAN都是让他们从离100较近的方向开始,要是想自己定义从那一边开始则在while循环内删掉一种条件的语句即可。
3.建议一个一个算法来看,这样就不会乱了。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
//先进先出
void FIFO(int a[], int n)
{
int i;
int sum = 0, num;
for (i = 0; i < n - 2; i++)
{
printf("第%d次:", i);
num = fabs(a[i + 1] - a[i]);
printf("num:%d", num);
sum = sum + num;
printf("sum:%d ", sum);
printf("\n");
}
printf("平均寻道长度:%.1f\n", sum * 1.0 / (n - 2));
}
//最短寻道时间优先
void SSTF(int a[], int n)
{
int t;
int sum = 0;
int i, j, temp, begin;
for (i = 1; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
/*for (i = 0; i < n-1; i++){
printf("%d ", a[i]);
}*/
begin = Search_Bin(a, n - 1, 100);
//printf("begin:%d", a[begin]);
int left = begin - 1;
int right = begin + 1;
while (begin != n - 2 && begin != 0)
{
if (fabs(a[left] - a[begin]) >= fabs(a[right] - a[begin]))
{
sum = sum + fabs(a[right] - a[begin]);
begin = right;
right = right + 1;
}
else
{
sum = sum + fabs(a[left] - a[begin]);
begin = left;
left = left - 1;
}
}
if (begin == 0)
{
sum = sum + fabs(a[right] - a[begin]);
for (t = right; t < n - 2; t++)
{
sum = sum + fabs(a[t + 1] - a[t]);
}
}
if (begin == n - 2)
{
sum = sum + fabs(a[left] - a[begin]);
for (t = left; t > 0; t--)
{
sum = sum + fabs(a[t] - a[t - 1]);
}
}
printf("平均寻道长度:%.1f\n", sum * 1.0 / (n - 2));
}
//使用折半查找算法先找到开始的位置即100的位置
int Search_Bin(int s[], int n, int key)
{
int low = 0, high = n, mid;
while (low <= high)
{
mid = (low + high) / 2;
if (s[mid] == key)
return mid;
else if (s[mid] > key)
high = mid - 1;
else
low = mid + 1;
}
return 0;
}
//SCAN电梯调度算法
void SCAN(int a[], int n)
{
int t;
int sum = 0;
int i, j, temp, begin;
int left, right;
for (i = 1; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
begin = Search_Bin(a, n - 1, 100);
left = begin - 1;
right = begin + 1;
while (t != n - 2 && t != 0)
{
if (fabs(a[left] - a[begin]) >= fabs(a[right] - a[begin]))
{
for (t = begin; t < n - 2; t++)
{
sum = sum + fabs(a[t + 1] - a[t]);
}
}
else
{
for (t = begin; t > 0; t--)
{
sum = sum + fabs(a[t] - a[t - 1]);
}
}
}
int num = sum;
printf("sum1:%d", sum);
printf(" t:%d ", t);
if (t == 0)
{
int m;
num = num + fabs(a[right] - a[0]);
for (m = right; m < n - 2; m++)
{
num += fabs(a[m + 1] - a[m]);
}
printf("sum2:%d ", num);
}
if (t == n - 2)
{
int m;
num = num + fabs(a[left] - a[0]);
for (m = left; m > 0; m--)
{
num += fabs(a[m] - a[m - 1]);
}
printf("sum2:%d ", num);
}
printf("平均寻道长度:%.1f\n", (num) * 1.0 / (n - 2));
}
//单向电梯调度算法
void C_SCAN(int a[], int n)
{
int t;
int sum = 0;
int i, j, temp, begin;
int left, right;
for (i = 1; i < n; i++)
{
for (j = 0; j < n - i; j++)
{
if (a[j] > a[j + 1])
{
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
begin = Search_Bin(a, n - 1, 100);
left = begin - 1;
right = begin + 1;
while (t != n - 2 && t != 0)
{
if (fabs(a[left] - a[begin]) >= fabs(a[right] - a[begin]))
{
for (t = begin; t < n - 2; t++)
{
sum = sum + fabs(a[t + 1] - a[t]);
}
}
else
{
for (t = begin; t > 0; t--)
{
sum = sum + fabs(a[t] - a[t - 1]);
}
}
}
int num = sum;
if (t == 0)
{
num = num + fabs(a[n - 2] - a[0]);
int m;
for (m = n - 2; m > right; m--)
{
num += fabs(a[m] - a[m - 1]);
}
printf("sum2:%d ", num);
}
if (t == n - 2)
{
num = num + fabs(a[n - 2] - a[0]);
int m;
for (m = 0; m < left; m++)
{
num += fabs(a[m + 1] - a[m]);
}
printf("sum2:%d ", num);
}
for (i = 0; i <= n - 2; i++)
printf("%d ", a[i]);
printf("平均寻道长度:%.1f\n", (num) * 1.0 / (n - 2));
}
int main()
{
int n = 11;
int disk[n];
int i, t;
disk[0] = 100;
//初始化
printf("请输入请求的磁盘的磁道:\n");
for (i = 1; i < n - 1; i++)
scanf("%d", &disk[i]);
while (t != 5)
{
printf("================================\n");
printf("磁盘调度算法的模拟\n");
printf("================================\n");
printf("1:FIFO 2:最短服务时间优先\n");
printf("3:SCAN 4:C_SCAN\n");
printf("5:退出\n");
printf("--------------------------------\n");
printf("请选择(1~5):\n");
scanf("%d", &t);
switch (t)
{
case 1:
FIFO(disk, n);
break;
case 2:
SSTF(disk, n);
break;
case 3:
SCAN(disk, n);
break;
case 4:
C_SCAN(disk, n);
break;
case 5:
printf("磁盘调度模拟结束!Bye.");
exit(0);
}
}
return 0;
}