操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)和N步扫描算法(NStepScan)的程序实现

复制到本地即可运行

#include "stdio.h"
#include "stdlib.h"
#include "conio.h"void CopyL(int Sour[],int Dist[] ,int x); //数组Sour复制到数组Dist,复制到x个数
void SetDI(int DiscL[]);  //随机生成磁道数
void Print(int Pri[],int x);  //打印输出数组Pri
void DelInq(int Sour[],int x,int y);  //数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)
void FCFS(int Han,int DiscL[]);  //先来先服务算法(FCFS)
void SSTF(int Han,int DiscL[]);  //最短寻道时间优先算法(SSTF)
int SCAN(int Han,int DiscL[],int x,int y);  //扫描算法(SCAN)
void CSCAN(int Han,int DiscL[]);  //循环扫描算法(CSCAN)
void N_Step_SCAN(int Han1,int DiscL[]);  //N步扫描算法(NStepScan)
void PaiXu();  //寻道长度由低到高排序
void Pri();
int NAll=0;
int Best[5][2]; //用作寻道长度由低到高排序时存放的数组
int Limit=0; //输入寻找的范围磁道数i
int Jage;
float Aver=0;int main()
{int i;int DiscLine[10];  //声明准备要生成的随机磁道号的数组int Hand;  //磁道数int Con=1;int n;while(Con==1){Jage=0;printf("\n 请输入初始的磁道数(0<n<65536):");scanf("%d",&Hand);printf("\n+ 输入寻找的范围:");scanf("%d",&Limit);if(Limit>65536){printf("超出范围!");} else{printf("               ╭═══════════════╮            \n");printf("               ║       操作系统课程设计       ║    \n");printf("   ╭═════┤         磁盘调度算法         ├═════╮\n");printf("   ║          ║                              ║          ║\n");printf("   ║          ╰═══════════════╯          ║\n");printf("  ║               1.先来先服务算法(FCFS)                 ║\n");printf("   ║                                                      ║\n");printf("   ║               2.最短寻道时间优先算法(SSTF)           ║\n");printf("   ║                                                      ║\n");printf("   ║               3.扫描算法(SCAN)                       ║\n");printf("   ║                                                      ║\n");printf("   ║               4.循环扫描算法(CSCAN)                  ║\n");printf("   ║                                                      ║\n");printf("   ║               5.N步扫描算法(NStepScan)               ║\n");printf("   ║                                                      ║\n");printf("   ║               6.各类算法的比较                       ║\n");printf("   ║                                                      ║\n");printf("   ║                                                      ║\n");printf("   ║  ╭───────────────────────╮  ║\n");printf("   ╰═┤        请输入你的选择的算法(输入0离开)       ├═╯\n");printf("       ╰───────────────────────╯\n");scanf("%d",&n);if(n==0) exit(0);printf("\n");switch(n){case 1:SetDI(DiscLine);  //随机生成磁道数FCFS(Hand,DiscLine); //先来先服务算法(FCFS)break;case 2:SetDI(DiscLine);  //随机生成磁道数SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)break;case 3:SetDI(DiscLine);  //随机生成磁道数SCAN(Hand,DiscLine,0,9);  //扫描算法(SCAN)break;case 4:SetDI(DiscLine);  //随机生成磁道数CSCAN(Hand,DiscLine); //循环扫描算法(CSCAN)   break;case 5:SetDI(DiscLine);  //随机生成磁道数N_Step_SCAN(Hand,DiscLine);  //N步扫描算法(NStepScan)break;case 6:SetDI(DiscLine);  //随机生成磁道数FCFS(Hand,DiscLine); //先来先服务算法(FCFS)SSTF(Hand,DiscLine); //最短寻道时间优先算法(SSTF)SCAN(Hand,DiscLine,0,9); //扫描算法(SCAN)CSCAN(Hand,DiscLine);  //循环扫描算法(CSCAN)N_Step_SCAN(Hand,DiscLine);  //N步扫描算法(NStepScan)PaiXu();  //寻道长度由低到高排序printf("\n\n+ 寻道长度由低到高排序:"); for(i=0;i<5;i++){printf("%4d ",Best[i][0]);}break;}printf("\n\n+ 是否继续(按0结束,按1继续)?");scanf("%5d",&Con);}}
}//数组Sour复制到数组Dist,复制到x个数
void CopyL(int Sour[],int Dist[] ,int x)
{int i;for(i=0;i<=x;i++){Dist[i]=Sour[i];}
}
//打印输出数组Pri
void Print(int Pri[],int x)
{int i;for(i=0;i<=x;i++){printf("%5d",Pri[i]);}
}
//随机生成磁道数
void SetDI(int DiscL[])
{int i;for(i=0;i<=9;i++){DiscL[i]=rand()%Limit;//随机生成10个磁道号}printf("+ 需要寻找的磁道号:");Print(DiscL,9);  //输出随机生成的磁道号printf("\n");
}
//数组Sour把x位置的数删除,并把y前面的数向前移动,y后的数保持不变(即会出现2个y)
void DelInq(int Sour[],int x,int y)
{int i;for(i=x;i<y;i++){ Sour[i]=Sour[i+1];x++;}
}
//先来先服务算法(FCFS)
void FCFS(int Han,int DiscL[])
{int RLine[10];  //将随机生成的磁道数数组Discl[]复制给数组RLine[]int i,k,All,Temp;  //Temp是计算移动的磁道距离的临时变量All=0;  //统计全部的磁道数变量k=9;  //限定10个的磁道数CopyL(DiscL,RLine,9);  //复制磁道号到临时数组RLineprintf("\n+ 按照FCFS算法磁道的访问顺序为:");All=Han-RLine[0];for(i=0;i<=9;i++){Temp=RLine[0]-RLine[1];//求出移动磁道数,前一个磁道数减去后一个磁道数得出临时的移动距离if(Temp<0) Temp=(-Temp);//移动磁道数为负数时,算出相反数作为移动磁道数printf("%5d",RLine[0]);All=Temp+All;//求全部磁道数的总和 DelInq(RLine,0,k);//每个磁道数向前移动一位k--;}Best[Jage][1]=All;//Best[][1]存放移动磁道数 Best[Jage][0]=1; //Best[][0]存放算法的序号为:1 Jage++;//排序的序号加1Aver=((float) All)/10;//求平均寻道次数 printf("\n+ 移动磁道数:<%5d> ",All);printf("\n+ 平均寻道长度:*%0.2f* ",Aver);
}
//最短寻道时间优先算法(SSTF)
void SSTF(int Han,int DiscL[])
{int i,j,k,h,All;int Temp;  //Temp是计算移动的磁道距离的临时变量int RLine[10];   //将随机生成的磁道数数组Discl[]复制给数组RLine[]int Min;All=0;  //统计全部的磁道数变量k=9;  //限定10个的磁道数CopyL(DiscL,RLine,9);  //复制磁道号到临时数组RLineprintf("\n+ 按照SSTF算法磁道的访问顺序为:");for(i=0;i<=9;i++){Min=64000;for(j=0;j<=k;j++) //内循环寻找与当前磁道号最短寻道的时间的磁道号 {if(RLine[j]>Han)  //如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLine[j]-Han;  //求出临时的移动距离elseTemp=Han-RLine[j];  //求出临时的移动距离if(Temp<Min)  //如果每求出一次的移动距离小于Min,执行下一句{Min=Temp;  //Temp临时值赋予Minh=j;  //把最近当前磁道号的数组下标赋予h}}All=All+Min;  //统计一共移动的距离printf("%5d",RLine[h]);Han=RLine[h];  DelInq(RLine,h,k);  //每个磁道数向前移动一位k--;}Best[Jage][1]=All;//Best[][1]存放移动磁道数 Best[Jage][0]=2;//Best[][0]存放算法的序号为:2Jage++;//排序序号加1Aver=((float)All)/10;//求平均寻道次数 printf("\n+ 移动磁道数:<%5d> ",All);printf("\n+ 平均寻道长度:*%0.2f* ",Aver);
}
//扫描算法(SCAN)
int SCAN(int Han,int DiscL[],int x,int y)
{int j,n,k,h,m,All;int t=0;int Temp;int Min;int RLine[10]; //将随机生成的磁道数数组Discl[]复制给数组RLine[] int Order;Order=1;k=y;m=2;  //控制while语句的执行,即是一定要使当前磁道向内向外都要扫描到All=0;  //统计全部的磁道数变量CopyL(DiscL,RLine,9);  //复制磁道号到临时数组RLineprintf("\n+ 按照SCAN算法磁道的访问顺序为:");Min=64000;for(j=x;j<=y;j++)  //寻找与当前磁道号最短寻道的时间的磁道号{if(RLine[j]>Han)  //如果第一个随机生成的磁道号大于当前的磁道号,执行下一句Temp=RLine[j]-Han;  //求出临时的移动距离elseTemp=Han-RLine[j];  //求出临时的移动距离if(Temp<Min){Min=Temp;  //Temp临时值赋予Minh=j;   //把最近当前磁道号的数组下标赋予h}}All=All+Min;  printf("%5d",RLine[h]);if(RLine[h]>=Han){  //判断磁道的移动方向,即是由里向外还是由外向里Order=0;t=1;}Han=RLine[h];DelInq(RLine,h,k);  //每个磁道数向前移动一位k--;while(m>0)  {if(Order==1)  //order是判断磁盘扫描的方向标签,order是1的话,磁道向内移动{for(j=x;j<=y;j++)  {h=-1;Min=64000;for(n=x;n<=k;n++)  //判断离当前磁道最近的磁道号{if(RLine[n]<=Han){Temp=Han-RLine[n];if(Temp<Min){Min=Temp;  //Temp临时值赋予Minh=n;  //把最近当前磁道号的数组下标赋予h}}}if(h!=-1){All=All+Min;  //叠加移动距离printf("%5d",RLine[h]);Han=RLine[h]; //最近的磁道号作为当前磁道DelInq(RLine,h,k);k--;}}Order=0;  //当完成向内的移动,order赋予0,执行else语句,使磁道向外移动m--;  //向内完成一次,m减一次,保证while循环执行两次}else  //order是0的话,磁道向外移动{for(j=x;j<=y;j++){h=-1;Min=64000;for(n=x;n<=k;n++)  //判断离当前磁道最近的磁道号{if(RLine[n]>=Han){Temp=RLine[n]-Han;if(Temp<Min){Min=Temp;   //Temp临时值赋予Minh=n;  //把最近当前磁道号的数组下标赋予h}}}if(h!=-1){All=All+Min;  //叠加移动距离printf("%5d",RLine[h]);Han=RLine[h];  //最近的磁道号作为当前磁道DelInq(RLine,h,k);k--;}}Order=1;  //当完成向内的移动,order赋予0,执行else语句,使磁道向外移动m--;   //向内完成一次,m减一次,保证while循环执行两次}}NAll=NAll+All;if((y-x)>5){Best[Jage][1]=All;//Best[][1]存放移动磁道数 Best[Jage][0]=3;//Best[][0]存放算法的序号为:3Jage++;//排序序号加1Aver=((float)All)/10;//求平均寻道次数 printf("\n+ 移动磁道数:<%5d> ",All);printf("\n+ 平均寻道长度:*%0.2f* ",Aver);}if(t==1) printf("\n+ 磁道由内向外移动");else printf("\n+ 磁道由外向内移动");return(Han);
}
//循环扫描算法(CSCAN)
void CSCAN(int Han,int DiscL[])
{int j,h,n,Temp,m,k,All,Last,i;int RLine[10];  //将随机生成的磁道数数组Discl[]复制给数组RLine[] int Min;int tmp=0;m=2;k=9;All=0;   //统计全部的磁道数变量Last=Han;CopyL(DiscL,RLine,9);  //复制磁道号到临时数组RLineprintf("\n+ 按照CSCAN算法磁道的访问顺序为:");while(k>=0){for(j=0;j<=9;j++)  //从当前磁道号开始,由内向外搜索离当前磁道最近的磁道号{h=-1;Min=64000;for(n=0;n<=k;n++){if(RLine[n]>=Han){Temp=RLine[n]-Han;if(Temp<Min){Min=Temp;h=n;}}}if(h!=-1){All=All+Min;  //统计一共移动的距离printf("%5d",RLine[h]);Han=RLine[h];Last=RLine[h];DelInq(RLine,h,k);k--;}}if(k>=0){ tmp=RLine[0];for(i=0;i<k;i++)//算出剩下磁道号的最小值{ if(tmp>RLine[i]) tmp=RLine[i];}Han=tmp;//把最小的磁道号赋给HanTemp=Last-tmp;//求出最大磁道号和最小磁道号的距离差All=All+Temp;}}Best[Jage][1]=All;//Best[][1]存放移动磁道数 Best[Jage][0]=4;//Best[][0]存放算法的序号为:4Jage++;//排序序号加1Aver=((float)All)/10;//求平均寻道次数 printf("\n+ 移动磁道数:<%5d> ",All);printf("\n+ 平均寻道长度:*%0.2f* ",Aver);
}
//N步扫描算法(NStepScan)
void N_Step_SCAN(int Han1,int DiscL[])
{int i,m,k;int RLine1[10];NAll=0;m=2;k=9;  //限定10个的磁道数  i=-1;CopyL(DiscL,RLine1,9);  //复制磁道号到临时数组RLineprintf("\n+ 按照N_Step_SCAN算法磁道的访问顺序为:");for(m=0;m<2;m++)  //由于限定10磁道数,将10个磁道数分为两组,每组5个磁道数,每个组按照SCAN算法执行,该循环循环2次{Han1=SCAN(Han1,RLine1,i+1,i+5);i=i+5;}Best[Jage][1]=NAll;//Best[][1]存放移动磁道数 Best[Jage][0]=5;//Best[][0]存放算法的序号为:5Aver=((float)NAll)/10;//求平均寻道次数 printf("\n+ 移动磁道数:<%5d> ",NAll);printf("\n+ 平均寻道长度:*%0.2f* ",Aver);
}
//寻道长度由低到高排序
void PaiXu()
{int i,j,Temp;for(i=0;i<5;i++){for(j=0;j<4;j++){if(Best[j][1]>Best[j+1][1])  //如果前一个算法的移动磁道距离大于后一个移动磁道数,执行下面语句{Temp=Best[j+1][1];    //从这起下三行执行冒泡法将移动距离大小排序,排完后则执行每个算法的排序Best[j+1][1]=Best[j][1];Best[j][1]=Temp;Temp=Best[j+1][0];  //将每个算法的序号用冒泡法排序Best[j+1][0]=Best[j][0];Best[j][0]=Temp;}}}
}

操作系统 先来先服务算法(FCFS)、最短寻到时间优先算法(SSTF)、扫描算法(电梯算法,SCAN)、循环扫描算法(CSCAN)相关推荐

  1. 1.2.7存储结构-磁盘管理:磁盘移臂调度算法、先来先服务(FCFS)、最短寻道时间优先(SSTF)、扫描算法(SCAN)、循环扫描(CSCAN)

    1.2.7存储结构-磁盘管理:磁盘移臂调度算法.先来先服务(FCFS).最短寻道时间优先(SSTF).扫描算法(SCAN).循环扫描(CSCAN) 先来先服务(FCFS) 最短寻道时间优先(SSTF) ...

  2. 操作系统之文件管理:9、磁盘的结构与磁盘调度算法(先来先服务FCFS、最短寻找时间优先SSTF、扫描算法SCAN、循环扫描算法C-SCAN、LOOK调度算法、C-LOOK调度算法)

    9.磁盘的结构 磁盘结构 思维导图 磁盘.磁道.扇区.盘面.柱面 如何在磁盘中读/写数据? 磁盘的物理地址 一次磁盘读/写操作需要的时间 磁盘调度算法 1.先来先服务FCFS 2.最短寻找时间优先SS ...

  3. 最短寻道时间优先算法c语言程序,操作系统先来先服务、最短寻道时间优先(SSTf)、扫描算法(SCAN)、循环扫描算法(CSCAN)的c++实现.doc...

    先来先服务(FCFS).最短寻道时间优先(SSTf).扫描算法(SCAN).循环扫描算法(CSCAN) 最后有运行截图. #include #include #include #include int ...

  4. 调度算法先来先服务(FCFS)、最短作业优先(SJF)和最高响应比优先(HRRN)算法

    一.调度算法 (一)先来先服务(FCFS,First Come First Serve) 例题:各进程到达就绪队列的时间.需要的运行时间如下表所示.使用先来先服务调度算法,计算各进程的等待时间.平均等 ...

  5. 操作系统:磁盘调度算法FCFS算法(c语言)

    实验题目: 磁盘调度算法FCFS算法 实验内容: 磁盘访问序列和磁头起始位置(自己输入数据),采用SSTF磁盘调度算法,求平均寻道长度. 实验目的: 本课程设计的目的是通过磁盘调度算法设计一个磁盘调度 ...

  6. 操作系统之先来先服务(FCFS)实现代码

    完成与:2013.12.11 实验步骤: 1. 算法的思想 先来先服务(FCFS)调度算法是一种最简单的调度算法,该算法既可用于作业调度,也可用于进程调度.采用FCFS算法,每次从后备队列中选择一个或 ...

  7. FCFS、SJF、HRRN调度算法以及时间片轮转、优先级调度算法、多级反馈队列算法总结

    先来先服务(FCFS) 算法思想 主要从"公平"角度考虑 算法规则 按照作业/进程到达的先后顺序进行服务 用于作业/进程调度? 用于作业调度时,考虑哪个作业先到达后备队列: 用于进 ...

  8. 进程分配算法(FCFS,SJF,RR)

    一.进程调度算法的背景 在多道程序环境下,内存中存在着多个进程,其数目往往多于处理机数目.这就要求系统能按某种算法,动态地将处理机分配给处于就绪状态的一个进程,使之执行.分配处理机的任务是由处理机调度 ...

  9. 操作系统作业调度(FCFS,JCS,HRRF) c语言

    #include<stdio.h> #include<stdlib.h> struct jcb //作业的JCB块 { char name[20]; float startim ...

最新文章

  1. MyBatis复习笔记5:MyBatis代码生成器
  2. 基于USEARCH或QIIME绘制Alpha多样性稀释曲线(rarefraction curve)
  3. java容器有哪些如何使用_Java容器有哪些?
  4. 2013-10-31 《三天里什么都没干……总之把目前为止的代码发了吧……》
  5. IIS7下 301重定向 添加WWW
  6. Vue使用axios提交表单数据
  7. Git.之.最小化配置
  8. [Java基础]接口组成(默认方法,静态方法,私有方法)
  9. Kali 2.0 采用ssh连接登陆
  10. LV也开启了直播首秀,一个小时吸引超1.5万人观看
  11. 你代码里的 ThreadLocalRandom,真的安全吗?
  12. Linux常用脚本命令总结
  13. json jackson
  14. HIVE数据导入MYSQL实现方式
  15. Python 代码练习
  16. java word导出表格_Java实现word导出(表格带图片)
  17. 简易计算机系统综合设计--函数发生器
  18. General Trainning Strategy in Caffe
  19. cve 爬虫_CVE监控之Python代码实现
  20. 穆穆推荐-软件销售行业软件公司销售参考操作手册-之5-软件行业客户分类及销售人员激励

热门文章

  1. Raw Socket编程
  2. 聚美app之 _sign参数分析
  3. 第42讲:scrapy框架的基本使用
  4. LiveVideoStack Meet | 苏州:视频会议研发中心一日游
  5. 从云计算到低延时,传统编码器与创新技术双剑合璧严把成本质量关
  6. BBR如何让Spotify流媒体更流畅?
  7. 大规模 Node.js 网关架构设计与工程实践
  8. 区块链技术沙龙最全回顾:我们需要做怎样的区块链?
  9. Wireshark网络抓包(一)——数据包、着色规则和提示
  10. cmake使用示例与整理总结