操作系统移动臂调度算法

来源:互联网 发布:聊天室软件开发 编辑:程序博客网 时间:2024/05/20 13:05
//移动臂.h
#include "stdafx.h"#include <iostream>#include <iomanip>#include <fstream>#include <stdlib.h>using namespace std;int BeginNum;                  //开始磁道号int N;                         //提出磁盘I/O申请的进程数int SortOrder[100];      //排序后的序列int Track[100];          //磁道序列int FindOrder[100];      //寻好序列int MoveDistance[100];   //移动距离double AverageDistance;        //平均寻道长度void Rfile()                   //读取文件,并将文件中数据附给相应的序列号;{ifstream B_read("Record.txt");if (! B_read.is_open()){        cout << "Error opening B_file"; system("pause");    }while(B_read>>Track[N])                                 //读取文件,并将文件中数据附给相应的序列号;N++;                                                //共有N个I/O申请进程;B_read.close();  }void Wfile(){ofstream B_output("Record.txt");if (B_output.is_open())                         //将书本借出后的新的书库信息入库;{for(int i=0;i<N;i++)B_output <<Track[i]<<" ";B_output.close();}}void init()                     //输入请求{int C;Rfile();cout<<"当前共有"<<N<<"个进程:";for(int i=0;i<N;i++)cout<<Track[i]<<" ";cout<<endl<<"是否需要重新导入I/O申请进程:1->是; 0->否:";cin>>C;if(C){cout<<"请输入提出I/O申请的进程数:";cin>>N;cout<<"请输入要依次访问的磁道号:";for(int i=0;i<N;i++)cin>>Track[i];Wfile();}cout<<"请输入开始的磁道号:";cin>>BeginNum;}void Count()                     //计算每一臂移动距离,平均移动距离{int temp=BeginNum,Sum=0;for(int i=0;i<N;i++){MoveDistance[i]=abs(FindOrder[i]-temp);temp=FindOrder[i];Sum+=MoveDistance[i];}double n=N;AverageDistance=Sum/n;}void Show()                        //输出数据{cout<<setw(10)<<"从"<<BeginNum<<"号磁道开始"<<endl;cout<<setw(15)<<"下一个要访问的磁道"<<setw(15)<<"移动距离"<<endl;for(int i=0;i<N;i++){cout<<"--------------------------------"<<endl;cout<<"|"<<setw(14)<<FindOrder[i]<<"|"<<setw(15)<<MoveDistance[i]<<"|"<<endl;}cout<<"--------------------------------"<<endl;cout<<setw(20)<<"AverageDistance="<<AverageDistance<<endl;}void Sort()                        //磁道排序(升序冒泡排列){for(int i=0;i<N;i++)SortOrder[i]=Track[i];int temp;for(int i=N-1;i>=0;i--){for(int j=0;j<i;j++)if(SortOrder[j]>SortOrder[j+1]){temp=SortOrder[j];SortOrder[j]=SortOrder[j+1];SortOrder[j+1]=temp;}}}void FCFS()                   //先来先服务{for(int i=0;i<N;i++)FindOrder[i]=Track[i];}void SSTF()                   //最短寻道时间优先{int TempDistance=255,TempNum,Temp;cout<<"顺序序列为:";for(int i=0;i<N;i++){cout<<SortOrder[i]<<" ";if(abs(SortOrder[i]-BeginNum)<TempDistance){TempDistance=abs(SortOrder[i]-BeginNum);TempNum=i;                                  //在排序序列中找出下一个访问的磁道Temp=SortOrder[TempNum];}}cout<<endl;for(int i=N;i>0;i--){FindOrder[N-i]=Temp;for(int j=TempNum;j<i-1;j++)SortOrder[j]=SortOrder[j+1];                   //将下一个要访问的磁道从排序序列中去除if(TempNum!=(i-1)&&TempNum!=0)abs(Temp-SortOrder[TempNum-1])<abs(Temp-SortOrder[TempNum])?--TempNum:NULL;    else if(TempNum==i-1){for(int k=N-i;k<N;k++)FindOrder[k]=SortOrder[N-k-1];break;}Temp=SortOrder[TempNum];}}void Scan()                 //扫描算法{int D,OutNum,InNum;cout<<"顺序序列为:";for(int i=0;i<N;i++)cout<<SortOrder[i]<<" ";cout<<endl<<"请输入:1->向外; 0->向里:";cin>>D;for(int i=0;i<N;i++)               if(SortOrder[i]>BeginNum){OutNum=i;                    //标出开始磁道的外圈InNum=i-1;                   //标出开始磁道的内圈break;}if(D){for(int i=0;i<N-OutNum;i++)FindOrder[i]=SortOrder[i+OutNum];for(int i=N-OutNum;i<N;i++)FindOrder[i]=SortOrder[N-i-1];}else{for(int i=0;i<=InNum;i++)FindOrder[i]=SortOrder[InNum-i];for(int i=OutNum;i<N;i++)FindOrder[i]=SortOrder[i];}}
// 移动臂调度算法.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include"移动臂.h"int main(){init();int a;while(1){cout<<"请选择:1->FCFS; 2->SSTF; 3->SCAN; 4->EXIT:";cin>>a;switch(a){case 1:FCFS();Count();Show();break;case 2:Sort();SSTF();Count();Show();break;case 3:Sort();Scan();Count();Show();break;    case 4:exit(0);    default:cout<<"Error,输入有误,请输入1~4的数字!";break;}system("pause");}return 0;}

原创粉丝点击