#include<stdio.h>
#include<stdlib.h>
#define maxsize 1000

//先进先出调度算法
void FIFO(int array[],int m)
{
int sum=0,j,i,now; float avg;
printf("\n 请输入当前的磁道号:");
scanf("%d",&now);
printf("\n FIFO 调度结果:");
printf("%d ",now);
for(i=0;i<m;i++)
printf("%d ",array[i]); 
sum=abs(now-array[0]);
for(j=1;j<m;j++)
sum+=abs(array[j]-array[j-1]);//累计总的移动距离
avg=(float)sum/m;//计算平均寻道长度 
printf("\n 移动的总道数: %d \n",sum); 
printf("  平均寻道长度: %f \n",avg);
}

//扫描算法
void SCAN(int array[],int m)
{
int i,j,temp;
int max = array[0], min = array[0];
int sum,now,num;
float avg;
printf("\n 指针方向先向磁道最小号移动");
printf("\n 请输入当前的磁道号:");
scanf("%d",&now);
for(i = 0;i < m;i++)
{
if(array[i] > max)
max = array[i];
}
for(i = 0;i < m;i++)
{
if(array[i] < min)
min = array[i];
}
sum = now - min;
sum = sum + max - min;
avg = (float)sum/m;
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)//对磁道号进行从小到大排列
{
if(array[i]>array[j])//两磁道号之间比较
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for(i = 0;i < m;i++)
{
if(array[i] == now)
num = i;
}
printf("\n SCAN 调度结果:");
for(i = num;i>=0;i--)
{
printf("%d ",array[i]);
}
for(i = num+1;i < m;i++)
{
printf("%d ",array[i]);
}
printf("\n 移动的总道数: %d \n",sum); 
printf("  平均寻道长度: %f \n",avg);
}

//循环扫描算法
void CSCAN(int array[],int m)
{
int i,j,temp;
int max = array[0], min = array[0];
int sum,now,num;
float avg;
printf("\n 指针方向先向磁道最小号移动");
printf("\n 请输入当前的磁道号:");
scanf("%d",&now);
for(i = 0;i < m;i++)
{
if(array[i] > max)
max = array[i];
}
for(i = 0;i < m;i++)
{
if(array[i] < min)
min = array[i];
}
sum = now - min;
sum = sum + max - min;
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)//对磁道号进行从小到大排列
{
if(array[i]>array[j])//两磁道号之间比较
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for(i = 0;i < m;i++)
{
if(array[i] == now)
num = i;
}
sum = sum + max - array[num + 1];
avg = (float)sum/m;
printf("\n SCAN 调度结果:");
for(i = num;i>=0;i--)
{
printf("%d ",array[i]);
}
for(i = m-1;i > num;i--)
{
printf("%d ",array[i]);
}
printf("\n 移动的总道数: %d \n",sum); 
printf("  平均寻道长度: %f \n",avg);

}

//最短服务时间优先调度算法 
void SSTF(int array[],int m)
{
int temp; 
int k=1; 
int now,l,r;
int i,j,sum=0; 
float avg; 
for(i=0;i<m;i++)
{
for(j=i+1;j<m;j++)//对磁道号进行从小到大排列
{
if(array[i]>array[j])//两磁道号之间比较
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
}
}
}
for( i=0;i<m;i++)//输出排序后的磁道号数组 
printf("%d",array[i]);
printf("\n 请输入当前的磁道号:");
scanf("%d",&now);
printf("\n SSTF 调度结果:");
if(array[m-1]<=now)//判断整个数组里的数是否都小于当前磁道号
{
for(i=m-1;i>=0;i--)//将数组磁道号从大到小输出 
printf("%d",array[i]);
sum=now-array[0];//计算移动距离
}
else if(array[0]>=now)//判断整个数组里的数是否都大于当前磁道号
{
for(i=0;i<m;i++)//将磁道号从小到大输出 
printf("%d",array[i]);
sum=array[m-1]-now;//计算移动距离
}
else
{
while(array[k]<now)//逐一比较以确定 K 值
{
k++;
}
l=k-1;
r=k;
//确定当前磁道在已排的序列中的位置
while((l>=0)&&(r<m))
{
if((now-array[l])<=(array[r]-now))//判断最短距离
{
printf("%d",array[l]);
sum+=now-array[l];//计算移动距离 
now=array[l];
l=l-1;
}
else
{
printf("%d",array[r]); 
sum+=array[r]-now;//计算移动距离 
now=array[r];
r=r+1;
}
}
if(l=-1)
{
for(j=r;j<m;j++)
{
printf("%d",array[j]);
}
sum+=array[m-1]-array[0];//计算移动距离
}
else
{
for(j=l;j>=0;j--)
{
printf("%d",array[j]);
}
sum+=array[m-1]-array[0];//计算移动距离
}
}
avg=(float)sum/m;
printf("\n 移动的总道数: %d \n",sum); 
printf("  平均寻道长度: %f \n",avg);
}

int main()
{
int c;
int count;
//int m=0;
int cidao[maxsize];//定义磁道号数组 
int i=0;
int b;
printf("\n --------------------------------------------------\n");
printf("磁盘调度算法模拟");
printf("\n --------------------------------------------------\n");
printf("请先输入磁道数量:\n"); 
scanf("%d",&b); 
printf("请先输入磁道序列:\n"); 
for(i=0;i<b;i++){
scanf("%d",&cidao[i]);
}
printf("\n 磁道读取结果:\n"); 
for(i=0;i<b;i++)
{
printf("%d",cidao[i]);//输出读取的磁道的磁道号
}
count=b;
printf("\n");
while(1)
{
printf("\n算法选择:\n");
printf(" 1、先进先出算法(FIFO)\n");
printf(" 2、最短服务时间优先算法(SSTF)\n"); printf(" 3、扫描算法(SCAN)\n");
printf(" 4、循环扫描算法(C-SCAN)\n"); printf(" 5. 退出\n");
printf("\n");
printf("请选择:");
scanf("%d",&c); 
if(c>5)
break; switch(c)//算法选择
{
case 1: 
FIFO(cidao,count);//先进先出算法 
printf("\n");
break; 
case 2:
SSTF(cidao,count);//最短服务时间优先算法
printf("\n"); 
break;
case 3:
SCAN(cidao,count);//扫描算法
printf("\n");
break; 
case 4:
CSCAN(cidao,count);//循环扫描算法
printf("\n"); 
break;
case 5: 
exit(0);
}
}
return 0;
}

磁盘调度策略 c语言实现(操作系统课程设计,书p320)相关推荐

  1. 操作系统作业调度算法c语言,操作系统课程设计报告电梯调度算法c语言实现.doc...

    操作系统课程设计报告电梯调度算法c语言实现 操作系统课程设计报告电梯调度算法c语言实现 :调度 算法 电梯 课程设计 操作系统 操作系统课程设计报告 模拟操作系统课程设计 写一个简单的操作系统 篇一: ...

  2. 操作系统课程设计---实验七 磁盘调度算法的模拟与实现

    实验七 磁盘调度算法的模拟与实现 完整课程设计源码及其报告查看:陈陈的操作系统课程设计 1.实验目的 (1) 了解磁盘结构以及磁盘上数据的组织方式. (2) 掌握磁盘访问时间的计算方式. (3) 掌握 ...

  3. 操作系统课程设计——进程调度模拟程序(JAVA语言实现)

    本科期间的一些学习回忆记录(自己用) 一.课程设计的任务和要求 本次课程设计的题目是,时间片轮转调度算法的模拟实现.要求在充分理解时间片轮转调度算法原理的基础上,编写一个可视化的算法模拟程序.  具体 ...

  4. java编写文件系统的方法_操作系统课程设计模拟文件系统Java

    [实例简介] 一个操作系统课程设计,使用java语言模拟磁盘文件系统实现,实现了FAT算法 [实例截图] [核心代码] e692cc3b-c785-40f6-babe-2f9d5383f034 └── ...

  5. 操作系统课程设计geekos project1-3

    概述 实验环境 GeekOS-0.3.0 Bochs和Vmware介绍 开发过程 编译运行 配置文件 前导知识 一.全局描述符表GDT(Global Descriptor Table) 二.段选择子( ...

  6. 操作系统课程设计报告总结(下)

    操作系统课程设计报告总结(下) 实验六 银行家算法的模拟与实现 实验目的 总体设计 背景知识 基本原理 模块介绍 详细设计 关键代码及分析 实验结果与分析 小结与心得体会 银行家算法源码 实验七 磁盘 ...

  7. linux课程设计死锁避免,linux操作系统课程设计—车辆死锁.doc

    linux操作系统课程设计-车辆死锁.doc 键入文字"操作系统原理"课程设计BX090709吴沛儒操作系统原理课程设计报告姓名吴沛儒班级BX0907学号9指导老师胡静二〇一一年十 ...

  8. 计算机操作系统课设总结,计算机操作系统课程设计

    <计算机操作系统课程设计>由会员分享,可在线阅读,更多相关<计算机操作系统课程设计(36页珍藏版)>请在人人文库网上搜索. 1.操作系统课程设计实验报告姓 名: 李文孝 班 级 ...

  9. 操作系统分区分配java算法_合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc...

    合肥工业大学操作系统课程设计 动态分区分配存储管理java版.doc 1课程设计动态分区分配存储管理设计题目学号专业班级学生姓名号指导教师22010年12月合肥工业大学课程设计任务书设计题目动态分区分 ...

最新文章

  1. 为ASP.NET控件添加常用的JavaScript操作
  2. python基础:购物车的简单实现
  3. [转]添加mysql索引的3条原则
  4. 实现DataGridView和DevExpress.GridControl表头全选功能
  5. 在主机中通过xdebug远程调试Vagrant虚拟机中drush脚本的方法
  6. 3维DEMO: 抽奖圆盘
  7. 最大似然估计MLE和最大后验估计MAP理解
  8. 用JSON.parse(JSON.stringify(itemData))序列化反序列化实现‘深度复制’
  9. vue样式中背景图片路径_vue打包css文件中背景图片的路径问题
  10. 会议通知|2019暑期全国高校Python数据分析与实训课程高级研修班
  11. 全屏幕文本编辑器___Q10的设置:
  12. 网页保存为pdf神器(可自定义编辑)—Print Edit WE
  13. Android扫码枪数据读取封装
  14. m4s格式转换mp3_QQ音乐下载的歌曲怎么转换MP3?音频转换格式详细教程
  15. [深度学习入门]两阶段目标检测算法到Faster RCNN
  16. android 辅助功能(无障碍) AccessibilityService 实战入门详解
  17. C++编译为动态链接库并用python调用
  18. 一篇让你读懂java中的字符串(String)
  19. 《程序员的自我修养-链接-装载与库》第三章 目标文件里有什么(1)
  20. AOP技术学习之AspectJ

热门文章

  1. 九阴真经服务器维护,《九阴真经》-官方网站-一亿人的真武侠梦,开创全自由空中打斗...
  2. Python基础篇学习
  3. 技术人生的职场众生相 - 十多年的经验与心得
  4. 鸿蒙系统摄像头,内置鸿蒙系统,华为生态产品海雀智能摄像头Pro体验
  5. chtMultiRegionSimpleFoam求解器的热源不在边界上【翻译】
  6. 计算机应用技术英语音标,英语国际音标
  7. 京东金融-供应链金融业务介绍
  8. 观世界赛事,品足球人生--2022世界杯
  9. AFL源码分析之afl-clang-fast(学习笔记)
  10. 【基础知识】PID(比例微分积分)控制