磁盘调度算法例题解析以及C语言实现

这篇具有很好参考价值的文章主要介绍了磁盘调度算法例题解析以及C语言实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如果当前停留在第122号磁道上,接下来8个磁道按顺序分别是 120,98,4,51,180,195,140,23。请写出最短寻道时间优先和扫描算 法的访问顺序以及各自的平均寻道长度。

最短寻道时间优先算法:

SSTF算法选择调度处理的磁道是与当前磁头所在磁道距离最近的磁道,以使每次的寻找时间最短。当然,总是选择最小寻找时间并不能保证平均寻找时间最小,但是能提供比FCFS算法更好的性能。这种算法会产生“饥饿”现象。

最短寻道时间优先:122, 120, 140, 180, 195, 98, 51, 23, 4

先找离122最近的120,接着找离120最近的,140,以此类推

平均寻道长度:(2+20+40+15+97+47+28+19)/8 = 33.5

扫描算法:

该算法不仅考虑到欲访问的磁道与当前磁道间的距离,更优先考虑的是磁头当前的移动方向。例如,当磁头正在自里向外移动时,SCAN算法所考虑的下一个访问对象,应是其欲访问的磁道既在当前磁道之外,又是距离最近的。这种自里向外地访问,直至再无更外的磁道需要访问时,才将磁臂换向为自外向里移动。这是,同样也是每次选择这样的进程来调度,即要访问的磁道在当前位置内距离最近者,这样,磁头又逐步地从外向里移动,直至再无更里面的磁道要访问,从而避免了出现“饥饿”现象。由于在这种算法中磁盘移动的规律颇似电梯的运行,因而又常称之为电梯调度算法。

扫描算法:122, 140, 180, 195, 120, 98, 51, 23, 4

按顺序先从小到大,122 140 180 195 到了最大值开始从大到小

平均寻道长度:(18+40+15+75+22+47+28+19)/8 = 33

最短寻道时间算法(C语言)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 51
struct TCB     //track control block磁道控制块 
{
	int tn; //track number磁道号 
	int flag;  //完成标志   flag=-1没完成 flag=1完成 
}track[N]; 
 
int a[N]; //记录磁道访问的先后顺序 
 
int randomnumber(int n,int max,int min)   //各磁道互不相同 
{
	srand((int)time(NULL));
	int t;   //用来判断这个随机数是否重复
	int x,y;
	for(x=1;x<=n;)
	{
		t=rand()%(max-min+1)+min;
		for(y=1;y<x;y++)
			{if(track[y].tn==t) break;}
		if(y==x) //不重复
		{track[x++].tn=t;track[--x].flag=-1;x++;}//有进程的为-1,没有的为0 (系统初始化) 
	}
}
 
int SSTF(int n,int present,int max,int min)
{
	/*这个最短寻道时间优先要分两部分考虑,
	第一,访问第一个磁道:
	      比如说磁头开始处在第六道,然后等待服务的磁道先后顺序为8,2,5,3,7,9
	      那么问题来了,这个最短访问磁道距离为1(分别是磁道5和7),
		  那么我就以这两个磁道先到达的处理,那就是处理5;
		  当然,除了第一个访问的会出现这种问题,之后不会出现了(因为顺序) 
	第二,访问之后的磁道就以当前磁头所在地找最短的访问 
		  */ 
	int z=1;     //记录顺序访问数组a的下标 
	int s=0;     // 记录对于第一个访问中最短距离有几个 
	int sum=0;  //移动的磁道总数 
	int add=0;   //记录已经访问的磁道个数
	int md=max-min;  //min distance用来存当前最短距离 (初值最大) 
	int mdp;  //min distance position用来存放当前最短距离磁道下标
	int i,j; 
	
	//访问第一个磁道 
	for(i=1;i<=n;i++)    //找最小距离 
	{
		if(abs(present-track[i].tn)<md)
			md=abs(present-track[i].tn);	
	}
	for(i=1;i<=n;i++)   //找最小距离的个数 ,mdp记录的是最后一个磁道其md等于最小距离的下标 
	{
		if(md==abs(present-track[i].tn)) {s++;mdp=i;}
	}
	if(s==1)      //如果只有一个,那就直接访问 
	{
		a[z++]=track[mdp].tn; 
		track[mdp].flag=1;
		sum+=abs(present-track[mdp].tn);
		present=track[mdp].tn;
		add+=1;	
	}
	else if(s>1)  //如果有两个 
	{
		for(i=1;i<=n;i++)  //先找到最先到达的一个 ,再访问 
		if(md==abs(present-track[i].tn)) {mdp=i;break;}  
		a[z++]=track[mdp].tn; 
		track[mdp].flag=1;
		sum+=abs(present-track[mdp].tn);
		present=track[mdp].tn;
		add+=1;
	}
	
	//访问其他的磁道 
	while(add<n)
	{
		md=max-min; 
		for(i=1;i<=n;i++)
		{                     //找到接下来访问的位置 
		if(track[i].flag==-1) 
			if(abs(present-track[i].tn)<md) 
			 {md=abs(present-track[i].tn);mdp=i;}
		} 
		sum+=md;
		present=track[mdp].tn;
		track[mdp].flag=1;
		add++;
		a[z++]=track[mdp].tn;
	} 
	
	printf("\n\n\n磁道访问顺序:");
	for(j=1;j<=n;j++)
	printf("%d ",a[j]);
	printf("\n\n磁道移动总数sum=%d\n",sum);
	printf("平均寻道总数=%lf\n",sum/(float)n);
}
 
int main()
{
	int n;
	int max,min,current;
	printf("\t\t最短寻道时间优先\n\n");
	printf("请输入请求进程的个数(1-50):");
	scanf("%d",&n);
	printf("请输入最小磁道号:");
	scanf("%d",&min);
	printf("请输入最大磁道号:");
	scanf("%d",&max);
	printf("请输入当前磁头所在的位置:");
	scanf("%d",¤t);
	randomnumber(n,max,min);
	//for(int i=1;i<=N;i++) //检验产生的数是否符合要求 
	//printf("%d %d\n",track[i].tn,track[i].flag);
	printf("\n磁道请求调度先后顺序为:\n");
	for(int j=1;j<=n;j++)
	printf("%d\t",track[j].tn);
	SSTF(n,current,max,min);
	return 0;	
}

扫描算法(C语言)文章来源地址https://www.toymoban.com/news/detail-518228.html

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define N 51
struct TCB     //track control block
{
	int tn; //track number磁道号 
	int flag;  //完成标志   flag=-1没完成 flag=1完成 
}track[N]; 
 
int randomnumber(int n,int max,int min)   //各磁道互不相同 
{
	srand((int)time(NULL));
	int t;   //用来判断这个随机数是否重复
	int x,y;
	for(x=1;x<=n;)
	{
		t=rand()%(max-min+1)+min;
		for(y=1;y<x;y++)
			{if(track[y].tn==t) break;}
		if(y==x) //不重复
		{track[x++].tn=t;track[--x].flag=-1;x++;}//有进程的为-1,没有的为0 (系统初始化) 
	}
}
 
int SCAN(int n,int present,int max,int min,int option)
{
	int i,j;
	int z=1;
	int start;  //存放磁头访问开始位置 
	int sum=0;  //磁头移动总数 
	for(i=1;i<n;i++)    //对磁道从小到大排序 
	for(j=i+1;j<=n;j++)
	if(track[i].tn>track[j].tn)
	{
	track[0].tn=track[i].tn;
	track[i].tn=track[j].tn;
	track[j].tn=track[0].tn;
	}
	
	if(present<=track[1].tn) start=1;   //找分断点和访问开始位置 
	else if(present>=track[n].tn) start=n;
	else
	{ 
		for(i=2;i<n;i++)
		if(track[i-1].tn<present&&track[i+1].tn>present)
	         {start=i;break;} 
	    if(track[start].tn==present) start=i;
	    else if(track[start].tn<=present)
	    {
	    	if(option==1) start=i+1;
	    	else if(option==0) start=i;
		}
		else if(track[start].tn>=present)
		{
			if(option==1) start=i;
	    	else if(option==0) start=i-1;
		}
	}
	
	//找到磁头访问开始位置后,就是扫描访问各磁道 
	printf("\n\n\n磁道访问顺序:");
	if(start==1||start==n)   
	{
		
		if(start==1)
			for(j=1;j<=n;j++)
				{printf("%d ",track[j].tn); sum+=abs(present-track[j].tn); present=track[j].tn;}
		else if(start==n)
			for(j=n;j>=1;j--)
				{printf("%d ",track[j].tn);sum+=abs(present-track[j].tn);present=track[j].tn;}
	} 
	else
	{    
	if(option==1)  //自低向高走
		{
		 for(j=start;j<=n;j++) {printf("%d ",track[j].tn);sum+=abs(present-track[j].tn);present=track[j].tn;}
		 for(j=start-1;j>=1;j--) {printf("%d ",track[j].tn);sum+=abs(present-track[j].tn);present=track[j].tn;}
		} 
	else if(option==2)  //自高向低走 
		{
			for(j=start;j>=1;j--){printf("%d ",track[j].tn);sum+=abs(present-track[j].tn);present=track[j].tn;}
			for(j=start+1;j<=n;j++){printf("%d ",track[j].tn);sum+=abs(present-track[j].tn);present=track[j].tn;}
		} 
	printf("\n\n磁道移动总数sum=%d\n",sum);
	printf("平均寻道总数=%lf\n",sum/(float)n);
	}
}
 
int main()
{
	int n;
	int max,min,current;
	int option;    //用于磁头移动方向选择 
	printf("\t\t最短寻道时间优先\n\n");
	printf("请输入请求进程的个数(1-50):");
	scanf("%d",&n);
	printf("请输入最小磁道号:");
	scanf("%d",&min);
	printf("请输入最大磁道号:");
	scanf("%d",&max);
	printf("请输入当前磁头所在的位置:");
	scanf("%d",¤t);
	printf("\n请选择磁头的移动方向: 1.自低向高; 2.自高向低。\n");
	scanf("%d",&option);
	randomnumber(n,max,min);
	//for(int i=1;i<=N;i++) //检验产生的数是否符合要求 
	//printf("%d %d\n",track[i].tn,track[i].flag);
	printf("\n磁道请求调度先后顺序为:\n");
	for(int j=1;j<=n;j++)
	printf("%d\t",track[j].tn);
	SCAN(n,current,max,min,option);
	return 0;	
}

到了这里,关于磁盘调度算法例题解析以及C语言实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C语言递归算法实现经典例题

    递归是一种编程技术,它通过在函数内部反复调用自身来解决问题。当一个程序调用自己时,这就称为递归调用。递归可以有助于简化某些算法的实现和理解。在递归过程中,每个调用都会将一些数据保存在栈上,直到递归结束后才能被处理并弹出栈。 递归通常有两个部分:

    2024年02月05日
    浏览(43)
  • 操作系统实验:虚拟存储器 (C语言实现) 模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺页中断。

    模拟分页式虚拟存储管理中硬件的地址转换和缺页中断,以及选择页面调度算法处理缺 页中断。 模拟分页式存储管理中硬件的地址转换和产生缺页中断。 用先进先出(FIFO)页面调度算法处理缺页中断。 由于是模拟调度算法,所以,不实际启动输出一页和装入一页的程序,

    2024年02月04日
    浏览(49)
  • 磁盘调度算法习题

    注意(不论被访问的下一个磁道号是几,计算移动距离都是: 大数减小数 ) 一.磁盘共有200个柱面(0-199),它刚刚从92号磁道移到98号随道完成读写,假设此时系统中等待访问磁盘盘的磁道序列为190,97,90,45,150,32,162,108,112,80,试给出采用下列磁头移动算法的顺序并

    2024年02月03日
    浏览(29)
  • 操作系统磁盘调度算法(c++)

    先来先服务这个没什么好说了,按顺序来就是了。将需要访问的磁道序列直接作为算法的访问序列,然后将每次移动的磁道数量记录下来。 最短寻道时间优先,每次执行完,看一下离自己最近的哪条磁道有任务,就移动过去执行。每次寻找下一次访问的磁道号时,都遍历磁道

    2024年02月04日
    浏览(30)
  • 磁盘调度算法(操作系统实验 C++)

    通过这次实验,加深对磁盘调度算法的理解,进一步掌握先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的实现方法。 问题描述: 设计程序模拟先来先服务FCFS、最短寻道时间优先SSTF、SCAN和循环SCAN算法的工作过程。假设有n个磁道号所组成的磁道访问序列,给定开

    2024年02月07日
    浏览(42)
  • 操作系统进程调度算法(c语言模拟实现)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(40)
  • 进程调度算法——C++实现 [ FCFS,SJF,HPR,HRN + 开源代码 + 详细解析 ]

    ✅ (原创,库存,第100篇博客,纪念一下) (1) 先来先服务算法FCFS (First Come First Service):即调度程序只靠率一个参数———作业到达系统的时间,谁先到就先给谁提供服务。 (2) 最短作业优先算法SJF (Shortest Job First):即我们也只考虑一个参数———进程的CPU的执行时间,计算量

    2023年04月13日
    浏览(23)
  • 操作系统进程调度算法的模拟实现(c语言版本)

            前言: 本文旨在分享如何使用c语言对操作系统中的部分进程调度算法进行模拟实现,以及算法描述的讲解, 完整代码放在文章末尾,欢迎大家自行拷贝调用 目录 常见的调度算法 数据结构 先来先服务调度算法 算法模拟思路: 算法模拟:  最短作业优先调度算法

    2024年02月06日
    浏览(44)
  • 【操作系统】磁盘调度算法(FCFS、SSTF、SCAN 和 C-LOOK 调度策略)

    实验内容:硬盘调度 编写一个 C 程序模拟实现课件 Lecture25 中的硬盘磁头调度算法,包括 FCFS、SSTF、SCAN 和 C-LOOK 调度策略。 固定一个硬盘柱面数; 输入一批随机的硬盘柱面请求序列,计算各个调度策略下的磁头移动平均总距离 (假设磁头运动是理想匀速的,可以把移动距离

    2024年02月11日
    浏览(28)
  • 先来先服务调度算法(C语言代码实现) 大三操作系统实验

    实验原理: 先来先服务(First Come First Served,FCFS),是一种简单的调度算法,它既适用于作业调度,也适用于进程调度。先来先服务算法是按照作业或进程的到达先后次序来进行调度。当作业调度中采用该算法时,每次调度都是从后备队列中选择一个最先进入该队列中作业,将

    2024年04月16日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包