作業系統移動臂排程演算法
阿新 • • 發佈:2018-12-26
//移動臂.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; }