调度算法(SSTF,SCAN,CSCAN)c语言

假定当前磁头位于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;
}

​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/714090.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

线程池ThreadPoolExecutor源码分析

一、线程池基本概念和线程池前置知识 1.1 Java中创建线程的方式有哪些 传统答案&#xff1a; 继承Thread类 通过继承Thread类并重写其run方法来创建线程。具体步骤包括定义Thread类的子类&#xff0c;在子类中重写run方法以实现线程的具体逻辑&#xff0c;然后创建子类的实例…

举例说明 如何通过SparkUI和日志定位任务莫名失败?

有一个Task OOM&#xff1a; 通过概览信息&#xff0c;发现Stage 10的Task 36失败了4次导致Job失败。概览信息中显示最后一次失败的退出代码&#xff08;exit code&#xff09;是143&#xff0c;意味着发生了内存溢出&#xff08;OOM&#xff0c;即Out of Memory&#xff09;。…

QQ登录测试用例

QQ登录测试用例 常见测试方法&#xff08;可参考软件测试<用例篇>&#xff09; 等价类&#xff1a; 1、有效等价类 &#xff1a;满足需求的数据集合 2、无效等价类&#xff1a;不满足需求的数据集合 边界值错误猜测法场景法 QQ测试用例设计&#xff1a;xmind 需要完整…

C++ 55 之 多继承

#include <iostream> #include <string> using namespace std;class Base08_1{ public:int m_a;Base08_1(){this->m_a 10;} };class Base08_2{ public:// int m_b;int m_a;Base08_2(){// this->m_b 20;this->m_a 30;} };// 多继承 继承的类型都要…

九、BGP路由属性和选路

目录 一、属性分类 1.1、公认属性 1.2、可选属性 二、选路原则 0、丢弃不可达 取值越大越优 1、Preferred-Value 2、Local_Preference 取值越小越优 3、路由优先级 4、AS_Path 5、Origin 6、MED 7、路由来源 8、Next_Hop的IGP度量值 BGP路由等价负载分担&#…

流媒体传输协议HTTP-FLV、WebSocket-FLV、HTTP-TS 和 WebSocket-TS的详细介绍、应用场景及对比

一、前言 HTTP-FLV、WS-FLV、HTTP-TS 和 WS-TS 是针对 FLV 和 TS 格式视频流的不同传输方式。它们通过不同的协议实现视频流的传输&#xff0c;以满足不同的应用场景和需求。接下来我们对这些流媒体传输协议进行剖析。 二、传输协议 1、HTTP-FLV 介绍&#xff1a;基于 HTTP…

雷击保险丝选取

雷击保险丝的估算方法&#xff1a; 1、雷击浪涌实验规定的差模内阻是 2欧姆&#xff1a;(一般差模都是2欧姆) 2、差模雷击浪涌实验等级的确定。 3、差模雷击L-N防雷电路的确定&#xff08;估算防雷电路的钳位电压&#xff09;。 4、估算防雷电路中保险丝的 I^2t 的值来确定…

如何从索尼存储卡恢复数据?

Sony 存储卡广泛用于在数码相机、数码摄像机等中存储照片和视频。如果您从 Sony 存储卡中删除重要数据而未备份&#xff0c;您仍然可以找回丢失的数据。实际上&#xff0c;已删除的视频/照片或文档不会永远丢失&#xff0c;它们仍存储在 Sony 存储卡上&#xff0c;可以通过数据…

计算机组成原理之定点乘法运算

文章目录 原码并行乘法与补码并行乘法原码算法运算规则存在的问题带符号的阵列乘法器习题原码阵列乘法器间接补码阵列乘法器直接补码阵列乘法器 补码与真值的转换 原码并行乘法与补码并行乘法 原码算法运算规则 存在的问题 理解流水式阵列乘法器&#xff08;并行乘法器&#x…

会声会影色彩校正在哪里 会声会影色彩素材栏在哪 会声会影中文免费版下载

会声会影是一款功能强大的视频编辑软件&#xff0c;它可以帮助用户轻松地编辑和制作视频。在进行视频编辑时&#xff0c;色彩校正是一个重要的步骤&#xff0c;它可以调整视频的色调、亮度和对比度等参数&#xff0c;使视频更加生动和鲜明。在会声会影中&#xff0c;色彩校正功…

C#(C Sharp)学习笔记_封装【十八】

什么是封装&#xff1f; 封装是面向对象思维的三大特性之一。封装是将数据和对数据进行操作的函数绑定到一起的机制。它隐藏了对象的内部状态和实现细节&#xff0c;只对外提供必要的接口&#xff0c;从而确保对象内部状态的完整性和安全性。封装的主要目的是增强安全性和简化…

【教学类-64-02】20240610色块眼力挑战(二)-2-25宫格色差10-100(10倍)(星火讯飞)

背景需求 以下的色块眼里挑战需要人工筛选图片&#xff0c;非常繁琐。 【教学类-64-01】20240607色块眼力挑战&#xff08;一&#xff09;-0-255随机底色-CSDN博客文章浏览阅读446次&#xff0c;点赞12次&#xff0c;收藏5次。【教学类-64-01】20240607色块眼力挑战&#xff…

C语言——自定义类型:结构体

前言 本篇博客位大家介绍C语言中一块儿重要的内容&#xff0c;那就是结构体&#xff0c;关于结构体的内容&#xff0c;大家需要深入掌握&#xff0c;在后面的学习中依然会用到&#xff0c;如果你对本文感兴趣&#xff0c;麻烦点进来的老铁一键三连。多多支持&#xff0c;下面我…

食家巷助力“甘肃乡村振兴,百强主播·打call 甘味”活动

2024年&#xff0c;甘肃省“商务乡村振兴”促消费暨“百强主播打call 甘味”活动在天水市龙城广场盛大启动。 活动现场&#xff0c;来自甘肃省 14 个市州的农特产品展台琳琅满目&#xff0c;让人目不暇接。此次活动中&#xff0c;各企业带来了多款深受消费者喜爱的产品&a…

【C++提高编程-06】----C++之STL-函数对象、谓词、仿函数

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

这 10 种架构师,不合格!

大家好&#xff0c;我是君哥。 架构师这个岗位是好多程序员努力的方向&#xff0c;尤其是刚毕业的时候&#xff0c;对架构师有一种崇拜感。毕竟从初级到架构要经历好几次级别飞跃。 工作时间久了&#xff0c;发现架构师这个岗位&#xff0c;其实定义非常广泛&#xff0c;根据工…

linux 部署瑞数6实战(维普,药监局)sign第二部分

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx …

如何通过在线封装APP快速上线?小猪APP分发帮你解决难题

你是否曾经为了上线一款APP而头疼不已&#xff1f;开发完成后&#xff0c;封装、测试、分发&#xff0c;这些繁琐的步骤让人望而却步。别担心&#xff0c;小猪APP分发来了&#xff01;这篇文章将带你了解如何通过在线封装APP快速上线&#xff0c;并且告诉你为什么选择小猪APP分…

[Linux] TCP协议介绍(3): TCP协议的“四次挥手“过程、状态分析...

TCP协议是面向连接的 上一篇文章简单分析了TCP通信非常重要的建立连接的"三次握手"的过程 本篇文章来分析TCP通信中同样非常重要的断开连接的"四次挥手"的过程 TCP的"四次挥手" TCP协议建立连接 需要"三次握手". "三次挥手&q…

Postman下发流表至Opendaylight

目录 任务目的 任务内容 实验原理 实验环境 实验过程 1、打开ODL控制器 2、网页端打开ODL控制页面 3、创建拓扑 4、Postman中查看交换机的信息 5、L2层流表下发 6、L3层流表下发 7、L4层流表下发 任务目的 1、掌握OpenFlow流表相关知识&#xff0c;理解SDN网络中L…