磁盘调度算法(FCFS,SSTF,SCAN)

来源:互联网 发布:跨越百年的美丽 知乎 编辑:程序博客网 时间:2024/06/04 18:37
#include<bits/stdc++.h>using namespace std;int a[2000]; //磁道位置 int n; //磁道数量 int begin;  //初始位置 void init(){srand(time(0));n=(rand()%20)+1; // 0-1000for(int i=0;i<n;i++)a[i]=(rand()%20)+1; //0-1000begin= (rand()%20)+1; }int abs(int x){return x<0?-x:x;}int er_fen(int b[],int x){int l=0,r=n-1;//printf("r=%d\n",r);while(l<=r){int mid=(l+r)>>1;if(b[mid]>x){r=mid-1;}elsel=mid+1;}//printf("! %d %d %d\n",x,l,r);return r;}void FCFS() //先来先服务 {int sum=0;printf("路径:\n");printf("%d",begin);int t=begin;   //为了不改变起始点 for(int i=0;i<n;i++)  {sum+=abs(t-a[i]);printf(" --> %d",a[i]);t=a[i];}printf("\n");printf("总移动数: %d\n",sum);} void SSTF() //用二分搜索优化  时间复杂度 O(nlogn) {int sum=0;int b[2000];int vis[2000]={0}; //记录访问过的点 for(int i=0;i<n;i++) //为了不改变原始数据 b[i]=a[i];int t=begin;sort(b,b+n);  //排序用于二分 printf("路径:\n");printf("%d",begin);for(int i=0;i<n;i++){int s=er_fen(b,t);  //二分int l=s,r=s+1;while(l>=0&&vis[l]){l--;} while(r<n&&vis[r]){r++;}if(l>=0&&!vis[l]&&abs(b[l]-t)<abs(b[r]-t)){sum+=abs(b[l]-t);vis[l]=1;t=b[l];}else{sum+=abs(b[r]-t);vis[r]=1;t=b[r];}printf(" --> %d",t);} printf("\n");printf("总移动数: %d\n",sum);}void SCAN_down() //电梯法先下降 {int sum=0;int b[2000];for(int i=0;i<n;i++) //为了不改变原始数据 b[i]=a[i];int t=begin;sort(b,b+n);  //排序用于二分int s=er_fen(b,t);printf("路径:\n");printf("%d",begin);for(int i=s;i<n;i++)  {sum+=abs(t-b[i]);printf(" --> %d",b[i]);t=b[i];}for(int i=0;i<s;i++){sum+=abs(t-b[i]);printf(" --> %d",b[i]);t=b[i];}printf("\n");printf("总移动数: %d\n",sum);}void SCAN_up()  //电梯法先上升 {int sum=0;int b[2000];for(int i=0;i<n;i++) //为了不改变原始数据 b[i]=a[i];int t=begin;sort(b,b+n);  //排序用于二分int s=er_fen(b,t);printf("路径:\n");printf("%d",begin);for(int i=0;i<=s;i++)  {sum+=abs(t-b[i]);printf(" --> %d",b[i]);t=b[i];}for(int i=s+1;i<n;i++){sum+=abs(t-b[i]);printf(" --> %d",b[i]);t=b[i];}printf("\n");printf("总移动数: %d\n",sum);} int main(){init();printf("FCFS:\n");FCFS(); printf("SSTF:\n");SSTF(); printf("SCAN(down):\n");SCAN_down();printf("SCAN(up):\n");SCAN_up();}