计算机操作系统-输入输出系统篇

文章介绍了磁盘调度算法中的SSTF(最短寻找时间优先)、SCAN(扫描)和CSCAN(循环扫描)在C语言中的实现,包括算法原理、服务次序和平均寻道长度计算。实训代码展示了如何根据不同算法处理磁盘请求并计算平均寻道长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

计算机操作系统-输入输出系统篇:


内容:

  1. 磁盘调度算法作业
  2. 磁盘调度算法实训代码-C语言实现

磁盘调度算法作业

假定在某移动臂磁盘上,刚刚处理了访问143号柱面的请求,目前正在为访问125号柱面的请求服务,同时有若干请求者在等待服务,它们依次访问的柱面号为 86,147,91,177,94,150,102,175,130

请列表回答下列问题:
1、分别写出用先来先服务算法、最短寻找时间优先算法、扫描算法、循环扫描算法的实际服务次序
2、计算上述算法下的平均寻道长度

思路:

  1. 先来先服务算法FCFS:根据进程请求访问磁盘的先后顺序进行调度
  2. 最短寻找时间优先算法SSTF:优先选择距当前磁头最近的访问请求进行服务
  3. 扫描算法算法scan:又称电梯算法,在磁头当前移动方向上选择与当前磁头所在磁道距离最近的请求作为下一次服务的对象,起终点来回移动
  4. 循环扫描算法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;
}

效果如下:

在这里插入图片描述
写到这里,这个专栏就结束了,主要作用是作业思路、实训代码分享,还有很多关键的知识点没有列举,大家还是自己看书学习吧。最后很感谢李老师的教导。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值