假定当前磁头位于100号磁道,有9个进程先后提出了磁盘I/O请求:55 58 39 18 90 160 150 38 184,如果采用扫描算法或循环扫描算法,则磁头向磁道号增加的方向访问。
设计一个磁盘调度模拟系统,编程序演示下述算法的具体实现过程,并计算磁头总的移动距离以及平均寻道长度。要求设计主界面以灵活选择某算法:
1)最短寻道时间优先算法(SSTF);
2)扫描算法(SCAN)(又叫电梯调度算法);
3)循环扫描算法(CSCAN)
#include <stdio.h>
#include <stdlib.h>
#define N 1000
int n;
int cmp(const void* a,const void* b)
{
return *(int *)a - *(int *)b;
}
void SSTF()
{
int t; //磁头起始位置
int h = 0 ; //个数
char ch; //结束条件
int u; // 位置
int io[N];
printf("请输入磁头的位置:");
scanf("%d",&t);
printf("请输入I/O请求的磁道序列:");
while(ch!='\n')
{
scanf("%d%c",&io[h],&ch);
h++;
}
io[h++] = t; //磁头的位置插入
qsort(io,h,sizeof(int),cmp); //排序
for(int i = 0 ; i < h ;i++)
{
if(io[i] == t)
u = i; //找到起始位置的下标
}
//三种情况的查询
// 第一种 ,在头
// 第二种,在尾
//第三种,在中间
if(u == 0)
{
int p = u+1;
int i = 1;
double age = 0 ; //平均数
int k = 0; // 步数
int sum = 0; //总和
while(p<h)
{
k = io[p] - k;
sum +=k;
printf("第%d次的步数为:%d\n",i++,k);
k = io[p];
p++;
}
age = sum * 1.0 / h ;
printf("平均寻道时间为:%0.2f\n",age);
}
else if(u == h-1)
{
int q = u;
int i = 1;
double age = 0;//平均数
int k = 0; // 步数
int sum = 0; //总和
k = io[q-1];
while(q > 0)
{
k = io[q] - k;
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
q--;
k = io[q-1];
}
age = sum * 1.0 / h ;
printf("平均寻道时间为:%0.2f\n",age);
}
else
{
int q,p;
int i = 1;
int sum = 0;
//设置两个指针,分别指向起始位置前后的位置
q = u - 1; //前
p = u + 1; //后
int k = 0;
double age = 0;
while(q >=0 || p < h)
{
if(io[u] - io[q] > io[p] - io[u] && q !=-1 && p != h) // 判断条件
{
k = io[p++] - io[u++];
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
if(io[u] - io[q] < io[p] - io[u] && q!=-1 && p != h) // 判断条件
{
k = io[u--] - io[q--];
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
if(q==-1&&p!=h) //前面循环完,后面没有完
{
k = io[p] - io[u];
u = p;
p++;
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
if(p==h&&q!=-1) //后面循环完,前面没有完
{
k = io[u] - io[q];
u=q;
q--;
printf("第%d次的步数为:%d\n",i++,k);
}
}
age = sum * 1.0 / (h-1);
printf("平均寻道时间为:%0.2f\n",age);
}
}
void SCAN()
{
int t; //磁头起始位置
int h = 0 ; //个数
char ch; //结束条件
int u; // 位置
int io[N];
int l;
printf("请输入磁头的位置:");
scanf("%d",&t);
printf("请输入I/O请求的磁道序列:");
while(ch!='\n')
{
scanf("%d%c",&io[h],&ch);
h++;
}
io[h++] = t;
qsort(io,h,sizeof(int),cmp);
for(int i = 0 ; i < h ;i++)
{
if(io[i] == t)
u = i;
}
printf("请输入磁头先查询的方向:\n1.自里向外\n2.自外向里\n");
scanf("%d",&l);
qsort(io,h,sizeof(int),cmp);
//自里向外
if(l == 1)
{
int i=1;
int k =0;
int sum = 0;
double age = 0;
int p = u + 1 ;
int q = u - 1 ;
while(p != h)
{
k = io[p++] - io[u++];
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
//反向扫描
while(q != -1)
{
k = io[u] - io[q];
u = q;
q--;
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
age = sum * 1.0 / (h-1);
printf("平均寻道时间为:%0.2f\n",age);
}
//自外向里
else
{
int i=1;
int k =0;
int sum = 0;
double age = 0;
int p = u + 1 ;
int q = u - 1 ;
while(q != -1)
{
k = io[u--] - io[q--];
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
//反向
while(p != h)
{
k = io[p] - io[u];
u = p;
p++;
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
age = sum * 1.0 / (h-1);
printf("平均寻道时间为:%0.2f\n",age);
}
}
void CSCAN()
{
int t; //磁头起始位置
int h = 0 ; //个数
char ch; //结束条件
int u; // 位置
int io[N];
int l;
printf("请输入磁头的位置:");
scanf("%d",&t);
printf("请输入I/O请求的磁道序列:");
while(ch!='\n')
{
scanf("%d%c",&io[h],&ch);
h++;
}
io[h++] = t;
qsort(io,h,sizeof(int),cmp);
for(int i = 0 ; i < h ;i++)
{
if(io[i] == t)
u = i;
}
printf("请输入磁头先查询的方向:\n1.自里向外\n2.自外向里\n");
scanf("%d",&l);
qsort(io,h,sizeof(int),cmp);
//自里向外
if(l == 1)
{
int i=1;
int k =0;
int sum = 0;
double age = 0;
int p = u + 1 ;
int t = u ;
int q = 0 ;
while(p != h)
{
k = io[p++] - io[u++];
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
//反向扫描
while(q != t)
{
k = io[u] - io[q];
if(k < 0)
k *=-1;
u = q;
q++;
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
age = sum * 1.0 / (h-1);
printf("平均寻道时间为:%0.2f\n",age);
}
//自外向里
else
{
int i=1;
int k =0;
int sum = 0;
double age = 0;
int t = u;
int q = u - 1 ;
int p = h - 1 ;
while(q != -1)
{
k = io[u--] - io[q--];
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
//反向
while(p != t)
{
k = io[p] - io[u];
if(k < 0)
k *=-1;
u = p;
p--;
printf("第%d次的步数为:%d\n",i++,k);
sum+=k;
}
age = sum * 1.0 / (h-1);
printf("平均寻道时间为:%0.2f\n",age);
}
}
int main()
{
printf("-------欢迎使用磁盘调度模拟系统-------\n");
while(1)
{
printf("请选择要执行的算法:\n1.SSTF\n2.SCAN\n3.CSCAN\n");
scanf("%d",&n);
switch(n){
case 1 : SSTF();break;
case 2 : SCAN();break;
case 3 : CSCAN();break;
}
}
return 0;
}