磁道调度算法实现(C++)
来源:互联网 发布:qq音乐三巨头知乎 编辑:程序博客网 时间:2024/06/06 01:00
#include<stdio.h> #include<time.h>#include<stdlib.h>#define N 100 //设置需要扫描轨道个数的最大值 /*变量说明currentTrack 当前轨道scanTrackNum 一次扫描的轨道scanTrackAll 总共扫描的轨道averageTracks 平均每次扫描的轨道 */ //冒泡排序算法,从小到大排序 SCAN和CSCAN方法有用 void Sort(int *Array,int n) {int i,j,scanTrackNum;for(i=1;i<n;i++)for(j=0;j<n-i;j++)if(Array[j]>Array[j+1]){scanTrackNum=Array[j];Array[j]=Array[j+1];Array[j+1]=scanTrackNum;}}//输出函数 void Output(int *Track,int currentTrack,int n){int i;printf("请求的磁道序列为:");for(i=0;i<n;i++){printf(" %d ",Track[i]);}printf("\n");printf("当前所在磁道号是:%d\n",currentTrack);}/*********************先来先服务调度算法**************************/void FCFS(int *Track,int currentTrack,int n){int i,scanTrackNum;int scanTrackAll=0;float averageTracks=0.0;printf("*********************先来先服务调度算法**************************\n\n");Output(Track,currentTrack,n);for(i=0;i<n;i++){if(currentTrack<Track[i])scanTrackNum=Track[i]-currentTrack;else scanTrackNum=currentTrack-Track[i];currentTrack=Track[i];scanTrackAll+=scanTrackNum;}averageTracks=(float)scanTrackAll/n;printf("磁道访问的序列为:");for(i=0;i<n;i++)printf(" %d ",Track[i]);printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}/**********************最短寻道时间优先调度算法********************/void SSTF(int *Track,int currentTrack,int n){int i,j,Ttrack[N],Disk[N];int min,minj,Dcount=0;int scanTrackAll=0;float averageTracks=0.0;printf("**********************最短寻道时间优先调度算法********************\n\n");Output(Track,currentTrack,n);for(i=0;i<n;i++){Ttrack[i]=0;}for(j=0;j<n;j++){for(i=0;i<n;i++){if(Ttrack[i]==-1)continue;else{if(currentTrack<Track[i]) Ttrack[i]=Track[i]-currentTrack;else Ttrack[i]=currentTrack-Track[i];}}min=200;minj=0;for(i=0;i<n;i++){if(Ttrack[i]==-1) continue;else{if(Ttrack[i]<min){min=Ttrack[i];minj=i;}}}currentTrack=Track[minj];Disk[Dcount++]=currentTrack; scanTrackAll=scanTrackAll+Ttrack[minj];Ttrack[minj]=-1;}averageTracks=(float)scanTrackAll/n;printf("磁道访问的序列为:");for(i=0;i<n;i++)printf(" %d ",Disk[i]); printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}/*****************************扫描调度算法*******************************/void SCAN(int *Track,int currentTrack,int n){int i,j,k=0,r=0,l=0,choose;int scanTrackNum[N];int scanTrackAll=0;float averageTracks=0.0;printf("*****************************扫描调度算法*******************************\n\n");Output(Track,currentTrack,n);for(i=0;i<N;i++) scanTrackNum[i]=Track[i]; Sort(scanTrackNum,n); //将访问序列从小到大排序 while(scanTrackNum[k]<currentTrack) //找到currentTrack在访问序列所在的位置{ k++;} l=k-1; r=k; printf("请输入移动臂移动方向 (1 表示比当前磁道号大的方向 ,0表示比当前磁道小的方向) : ");scanf("%d",&choose); if(choose==0){printf("磁道访问的序列为:"); for(j=l;j>=0;j--){ printf(" %d ",scanTrackNum[j]); } for(j=r;j<n;j++){ printf(" %d ",scanTrackNum[j]); } scanTrackAll=currentTrack-2*scanTrackNum[0]+scanTrackNum[n-1]; } else{ printf("磁道访问的序列为:"); for(j=r;j<n;j++) { printf(" %d ",scanTrackNum[j]); } for(j=l;j>=0;j--) { printf(" %d ",scanTrackNum[j]); } scanTrackAll=currentTrack-scanTrackNum[0]+2*scanTrackNum[n-1]; } averageTracks=(float)scanTrackAll/n;printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}/************************循环扫描调度算法*****************************/void C_SCAN(int *Track,int currentTrack,int n){ int i,j,k=0,r=0,l=0;int scanTrackNum[N];int scanTrackAll=0;float averageTracks=0.0;printf("************************循环扫描调度算法*****************************\n\n");Output(Track,currentTrack,n);for(i=0;i<N;i++) scanTrackNum[i]=Track[i]; Sort(scanTrackNum,n); printf("磁道访问的序列为:"); while(scanTrackNum[k]<currentTrack){ k++; } l=k-1; r=k; for(j=r;j<n;j++){ printf(" %d ",scanTrackNum[j]); } for(j=0;j<r;j++){printf(" %d ",scanTrackNum[j]);} scanTrackAll=2*scanTrackNum[n-1]+scanTrackNum[l]-currentTrack-2*scanTrackNum[0]; averageTracks=(float)(scanTrackAll)/(float)(n);printf("\n平均寻道长度为:%.2f\n\n",averageTracks);}int main(){ int Input,i,currentTrack;int Track[1000];int n;printf("************* 磁盘调度算法 ***********\n");printf("*******************************************************************\n");printf("请输入需要扫描轨道个数(1-99):"); scanf("%d",&n);printf("\n"); srand((int)time(0)); for(i=0;i<n;i++) { Track[i]=1+(int)(200.0*rand()/(RAND_MAX+1.0)); }printf("\n");currentTrack=1+(int)(200.0*rand()/(RAND_MAX+1.0)); while(1){printf("************* 请选择要使用的算法 ***********\n");printf("********** ********\n");printf("***** 1、先来先服务调度算法(FCFS) *****\n");printf("***** 2、最短寻道时间优先调度算法(SSTF) *****\n");printf("***** 3、扫描调度算法(SCAN) *****\n");printf("***** 4、循环扫描调度算法(CSCAN) *****\n");printf("***** 5、调用五种算法,进行比较 *****\n");printf("***** 6、退出 *****\n");printf("********** ********\n");printf("************* ***********\n");printf("*******************************************************************\n\n");printf("请选择算法:");scanf("%d",&Input);printf("\n"); switch(Input) { case 1: //使用FCFS算法 FCFS(Track,currentTrack,n); break; case 2: //使用SSTF算法 SSTF(Track,currentTrack,n); break; case 3: //使用SCAN算法 SCAN(Track,currentTrack,n); break; case 4: //使用CSCAN算法 C_SCAN(Track,currentTrack,n); break; case 5: FCFS(Track,currentTrack,n); SSTF(Track,currentTrack,n); SCAN(Track,currentTrack,n); C_SCAN(Track,currentTrack,n); break; case 6: exit(0); break; } } return 0;}
阅读全文
0 0
- 磁道调度算法实现(C++)
- 操作系统磁道调度算法
- 处理机调度算法C语言实现(注释得当!!)
- 模拟先来先服务调度算法(C++)
- 轮转调度算法(C语言描述)
- 【操作系统】C语言模拟操作系统实现磁盘调度算法——电梯调度算法
- 多机调度问题(C语言实现)——贪心算法应用(4)
- c语言实现fcfs,rr_1,spn,srt4种调度算法(无数据结构)
- 多级反馈队列调度算法 C语言模拟实现
- 进程的优先调度算法的c语言实现
- C语言实现多级反馈队列调度算法
- 时间片轮转调度算法的C语言模拟实现
- 作业调度之先来先服务算法C语言实现
- 作业优先调度算法 先来先服务、短作业调度算法(c语言描述)
- 【C++】线程调度算法题
- 时间片轮转算法和优先级调度算法 C语言模拟实现
- 时间片轮转算法和优先级调度算法 C语言模拟实现
- NACHOS调度算法的实现
- 安卓四大组件-Activity
- Tomcat server.xml详解
- SpringAOP环绕通知的使用
- 想修改.class文件?其实可以试试这样做!
- Python学习 Python3.5+PyQt5环境--------02、代码与界面GUI分离
- 磁道调度算法实现(C++)
- 字符串数组(String []) 去掉重复值的方法
- hadoop FileSystem源码分析
- 利用github创建博客,全攻略
- JDK动态代理与CGLIB代理
- 签名
- 银联测试环境换上生产环境证书
- 完全卸载VS2013
- javaSwing_1概述