1. 程式人生 > >作業系統移動臂排程演算法

作業系統移動臂排程演算法

//移動臂.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;
}