计算机操作系统-输入输出系统篇:
内容:
- 磁盘调度算法作业
- 磁盘调度算法实训代码-C语言实现
磁盘调度算法作业
假定在某移动臂磁盘上,刚刚处理了访问143号柱面的请求,目前正在为访问125号柱面的请求服务,同时有若干请求者在等待服务,它们依次访问的柱面号为 86,147,91,177,94,150,102,175,130
请列表回答下列问题:
1、分别写出用先来先服务算法、最短寻找时间优先算法、扫描算法、循环扫描算法的实际服务次序
2、计算上述算法下的平均寻道长度
思路:
- 先来先服务算法FCFS:根据进程请求访问磁盘的先后顺序进行调度
- 最短寻找时间优先算法SSTF:优先选择距当前磁头最近的访问请求进行服务
- 扫描算法算法scan:又称电梯算法,在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象,起终点来回移动
- 循环扫描算法cscan:磁头单向移动提供服务,回返时直接快速移动到起点
详细介绍请查看P241~P244或点击磁盘调度算法查看百度百科
答案:画表格太麻烦,直接贴图
2.实训代码
代码如下:
#include <stdio.h>
#include <math.h>
#define MAXSIZE 10
#define MAX 1024
//86 147 91 177 94 150 102 175 130 通用
//55 58 39 18 90 160 150 38 184 用于SCAN向磁道大的方向访问
void sstf(int disk[MAXSIZE],int curnumber,int disknumber) {
int disktime[MAXSIZE]= {0},diskseq[MAXSIZE]= {0},disktemp[MAXSIZE],mintime,min;//disktime存放距离,diskseq存序列,disktemp临时距离,mintime记录最小距离,min记录最小距离下标
float sumtime;//累加最小距离,用于计算平均寻道长度
printf("\n-------------SSTF最短寻找时间优先算法-------------\n");
printf("\t从%d号磁盘开始\n被访问的下一个磁道号\t移动距离\n",curnumber);
for (int i=0; i<disknumber; i++) {
mintime=disktemp[0]=abs(disk[0]-curnumber);
min=0;
for (int j=0; j<disknumber; j++) {//计算最小磁盘号距离存到disktemp数组里
disktemp[j]=abs(disk[j]-curnumber);
if(mintime>disktemp[j]) {
mintime=disktemp[j];//记录最小距离
min=j;//记录下标
}
//printf("%d-%d----%d----%d----%d----%d----%d\n",j,disk[j],disktime[j],disktemp[j],mintime,min,curnumber);
}
curnumber=diskseq[i]=disk[min];//数组用来存下一个磁道号
disktime[i]=mintime;//用来存距离
disk[min]=MAX;//将已经处理的磁道设成最大,确保不会访问
}
for (int i=0; i<disknumber; i++) {
printf("%d\t\t\t%d\n",diskseq[i],disktime[i]);
sumtime+=disktime[i];
}
printf("平均寻道长度:%f",sumtime/disknumber);
}
void scan(int disk[MAXSIZE],int overnumber,int curnumber,int disknumber) {
int disktime[MAXSIZE]= {0},diskseq[MAXSIZE]= {0},disktemp[MAXSIZE],mintime,min,index=0;
float sumtime=0.0;
printf("\n-------------SCAN扫描算法-------------\n");
printf("从%d号磁盘开始",curnumber);
mintime=disktemp[0]=curnumber-disk[0];
min=0;
for(int i=0; i<disknumber; i++) {
disktemp[i]=curnumber-disk[i];
if(mintime>disktemp[i] && disktemp[i]>0) {//最小距离且不为负数
mintime=disktemp[i];
min=i;
}
}
if((overnumber-curnumber)>0) {//如果>0则表示向内移动
printf(",向磁盘号减小的方向访问\n被访问的下一个磁道号\t移动距离\n");
for(int i=min; i>=0; i--) { //逆序遍历小磁盘号,然后再升序遍历一下后面的
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
}
for(int i=++min; i<disknumber; i++) {
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
}
} else {
printf(",向磁盘号增大的方向访问\n被访问的下一个磁道号\t移动距离\n");
for(int i=++min; i<disknumber; i++) {
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
}
for(int i=--min; i>=0; i--) {
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
}
}
for (int i=0; i<disknumber; i++) {
printf("%d\t\t\t%d\n",diskseq[i],disktime[i]);
sumtime+=disktime[i];
}
printf("平均寻道长度:%f",sumtime/disknumber);
}
void cscan(int disk[MAXSIZE],int overnumber,int curnumber,int disknumber) {
int disktime[MAXSIZE]= {0},diskseq[MAXSIZE]= {0},disktemp[MAXSIZE],mintime,min,index=0;
float sumtime=0.0;
printf("\n-------------CSCAN扫描算法-------------\n");
printf("从%d号磁盘开始,",curnumber);
mintime=disktemp[0]=curnumber-disk[0];
min=0;
for(int i=0; i<disknumber; i++) {
disktemp[i]=curnumber-disk[i];
if(mintime>disktemp[i] && disktemp[i]>0) {//最小距离且不为负数
mintime=disktemp[i];
min=i;
}
}
if((overnumber-curnumber)>0) {//如果>0则表示向内移动
printf(",向磁盘号减小的方向循环访问\n被访问的下一个磁道号\t移动距离\n");
for(int i=min; i>=0; i--) { //逆序遍历小磁盘号,然后再从最大的盘向内逆序遍历
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
}
for(int i=disknumber-1; i>min; i--) {
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
//printf("\ni=%d,disktime[%d]=%d,curnumber=%d,min=%d\n",i,index,disktime[index],curnumber,min);
}
} else {
printf(",向磁盘号增大的方向循环访问\n被访问的下一个磁道号\t移动距离\n");
for(int i=++min; i<disknumber; i++) {
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
}
for(int i=0; i<min; i++) {
disktime[index]=abs(disk[i]-curnumber);
curnumber=diskseq[index]=disk[i];
index++;
}
}
for (int i=0; i<disknumber; i++) {
printf("%d\t\t\t%d\n",diskseq[i],disktime[i]);
sumtime+=disktime[i];
}
printf("平均寻道长度:%f",sumtime/disknumber);
}
int main() {
int curdisk,disknumber,diskover,temp;
int diskpage[MAXSIZE],disksort[MAXSIZE];
printf("请输入当前访问的柱面请求及等待服务的请求数:");
scanf("%d%d",&curdisk,&disknumber);
printf("请输入柱面走向:");
for (int i=0; i<disknumber; i++) {
scanf("%d",&diskpage[i]);
disksort[i]=diskpage[i];
}
printf("运行算法,请等待:\n");
sstf(diskpage,curdisk,disknumber);
for(int i=0; i<disknumber; i++) {
for (int j=0; j<disknumber-i-1; j++) {
if(disksort[j]>disksort[j+1]) {
temp=disksort[j];
disksort[j]=disksort[j+1];
disksort[j+1]=temp;
}
}
}
printf("\n请输入刚刚处理过的访问的柱面请求:");
scanf("%d",&diskover);
scan(disksort,diskover,curdisk,disknumber);
cscan(disksort,diskover,curdisk,disknumber);
/* for (int i=0; i<disknumber; i++) {
printf("\n%d---%d\n",diskpage[i],disksort[i]);
}*/
return 0;
}
效果如下:
写到这里,这个专栏就结束了,主要作用是作业思路、实训代码分享,还有很多关键的知识点没有列举,大家还是自己看书学习吧。最后很感谢李老师的教导。