1. 程式人生 > >磁碟排程演算法C語言實現

磁碟排程演算法C語言實現

最短尋道時間優先(SSTF)演算法。要求訪問的磁軌,與當前磁頭所在的磁軌距離最近,以使每次的尋道時間最短。

掃描排程(SCAN)演算法。該演算法不僅考慮到欲訪問的磁軌與當前磁軌間的距離,更優先考慮的是磁頭當前的移動方向。例如,當磁頭正在自裡向外移動時,SCAN演算法所考慮的下一個訪問物件,應是其欲訪問的磁軌,既在當前磁軌之外,又是距離最近的。這樣自裡向外的訪問,直至再無更外的磁軌需要訪問時,才將磁軌換向自外向裡移動。

#include<iostream>
#include<ctime>
using namespace std;
void SSTF(int a[],int n);
void CSCAN(int a[],int n);
int main()
{  
   int n;  //磁軌的個數

   int s;   //功能號

   cout<<"請輸入當前磁軌的個數,按Enter鍵顯示生成的隨機磁軌號:"<<endl;

   cin>>n;

   int *a=new int[n];//申請一個整型變數空間,賦初值為n,並定義一個整型指標a指向該地址空間 

   cout<<"生成的隨機磁軌號為:";

   srand((unsigned)time(NULL));

   for(int i=0;i<n;i++)
   {
      a[i]=(rand()%100)+1;
      cout<<a[i]<<" ";
   }
   cout<<endl;

	while(1)
 { 
	cout<<endl;
	cout<<"             ┏━━━━━━━━━━━━━━━━━━━━━━━┓"<<endl;
	cout<<"             ┃        磁碟排程演算法功能列表          ┃"<<endl;
	cout<<"             ┠───────────────────────┨"<<endl;
	cout<<"             ┃     1、最短尋道時間演算法(SSTF)              ┃"<<endl;
	cout<<"             ┠───────────────────────┨"<<endl;
	cout<<"             ┃     2、迴圈掃描演算法(CSCAN)                 ┃"<<endl;
	cout<<"             ┠───────────────────────┨"<<endl;
	cout<<"             ┃     0、退出                                  ┃"<<endl;
	cout<<"             ┗━━━━━━━━━━━━━━━━━━━━━━━┛"<<endl;
	cout<<endl;

   cout<<"請選擇所需功能的前置編號:";

   cin>>s;

   if(s>3)
   {
	cout<<"資料輸入有誤!請重新輸入:"<<endl;
   } 
   else
	{
     switch(s){
		case 0: exit(0);break ;         
        case 1:SSTF(a, n);break;
        case 2:CSCAN(a,n);break;}
	}
}
	 return 0; 
}

//最短尋道時間演算法(SSTF)
void SSTF(int a[],int n)
{
	int temp;
	int k=1;
	int now,l,r;
	int i,j;
	double sum=0;
//將磁軌號按遞增排序
	for(i=0;i<n;i++)
	
		for(j=i+1;j<n;j++){
			if(a[i]>a[j]){
				temp=a[i];
				a[i]=a[j];
				a[j]=temp;
  }
}
	cout<<"按遞增順序排好的磁軌顯示為:"<<endl;

	for(i=0;i<n;i++)
	{
	
		cout<<a[i]<<" ";//輸出排好的磁軌順序
	}
	
	cout<<endl;

	cout<<"請輸入當前的磁軌號:";

	cin>>now;//確定當前磁頭所在位置

	cout<<"磁碟排程順序為:"<<endl;

	if(a[n-1]<=now){//當前磁頭位置大於最外圍欲訪問磁軌(比如21,90,當前的磁軌為91,順序為91,1)
		
		for(i=n-1;i>=0;i--)
		
			cout<<a[i]<<" ";
			sum=now-a[0];
	}

	else 
		
		if(a[0]>=now)//當前磁頭位置小於最裡欲訪問磁軌(比如21,90,當前的磁軌為91,順序為21,91)
  {
		for(i=0;i<n;i++)
			cout<<a[i]<<" ";
			sum=a[n-1]-now;
  }
	else//不大也不小,在範圍之內
  {
    while(a[k]<now)//確定當前磁軌在已排的序列中的位置
	{
     k++;
	}
     l=k-1;//在磁頭位置的前一個欲訪問磁軌
     r=k;//磁頭欲訪問磁軌

    while((l>=0)&&(r<n))
{
     if((now-a[l])<=(a[r]-now))//選擇離磁頭近的磁軌
	 {
		cout<<a[l]<<" ";//(比如37,44,49,64,84,93,當前的磁軌為65,則排程後的循序為:64(為a[l]),49,44,37,84 93)
		sum+=now-a[l];
		now=a[l];
		l=l-1;
	 }
     else
     {
		cout<<a[r]<<" ";//(比如22 26 62 67 88 而當前的磁軌為87,則磁碟排程的順序為88 67 62 23 22 )

		sum+=a[r]-now;

		now=a[r];

		r=r+1;
     }
}
  if(l=-1)//磁頭位置裡側的磁軌已訪問完,這是針對(now-a[l]<a[r]-now的情況)
  {
  for(j=r;j<n;j++)//訪問磁頭位置外側的磁軌
  {
    cout<<a[j]<<" ";
  }
  sum+=a[n-1]-a[0];
  }
	if(r==n)//磁頭位置外側的磁軌已訪問完,這是針對(else的情況)
	{
	for(j=k-1;j>-1;j--) //訪問磁頭位置裡側的磁軌
           {
               cout<<a[j]<<" ";
           }
           sum+=a[n-1]-a[0];
	}
  }
	cout<<endl;
	cout<<"移動的總道數為:"<<sum<<endl;
	cout<<"移動的平均道數為:"<<(sum/n)<<endl;
}

//迴圈掃描演算法(CSCAN)
void CSCAN(int a[],int n)
{
	int temp;
	int now,l,r;
	int i,j;
	double sum=0;
	int k=1;
	for(i=0;i<n;i++)//對訪問磁軌按由小到大順序排列輸出
		for(j=i+1;j<n;j++){
    if(a[i]>a[j])
	{
     temp=a[i];
    a[i]=a[j];
    a[j]=temp;
	}
  }
  cout<<"按遞增順序排好的磁軌為:"<<endl;
  for( i=0;i<n;i++)
  {
		cout<<a[i]<<" ";
  }
		cout<<endl;
		cout<<"請輸入當前的磁軌號:";
		cin>>now;//確定當前磁軌號
	if(a[n-1]<=now)//磁頭位置大於最外圍欲訪問磁軌
{
  for(i=0;i<n;i++)
        cout<<a[i]<<" ";
  sum=now-2*a[0]+a[n-1];
}
    else
        if(a[0]>=now)//磁頭位置小於最裡欲訪問磁軌
        {
            for(i=0;i<n;i++)
            cout<<a[i]<<" ";
            sum=a[n-1]-now;
        }
        else //磁頭位置在最裡側磁軌與最外側磁軌之間
        {    int d;
            while(a[k]<now)
            {
                k++;
            }
           l=k-1;//在磁頭位置的前一個欲訪問磁軌
           r=k;   //磁頭欲訪問磁軌
		   cout<<"請輸入當前磁頭移動的方向 (0 表示向內 ,1表示向外) : ";
           cin>>d;    //確定磁頭訪問的方向
		   cout<<"磁碟排程順序為:";
           if(d==0||d==1)
		   {
               if(d==1)    //磁頭向外側訪問
			   {
                for(j=r;j<n;j++)//先訪問外側磁軌再轉向最裡欲訪問磁軌
				{
                 cout<<a[j]<<" ";
				}
                for(j=0;j<r;j++)
				{
                 cout<<a[j]<<" ";
				}
                 sum=2*a[n-1]-now-2*a[0]+a[l];
			   }
              if(d==0)                //磁頭向內側訪問
			  { 
				 for(j=r-1;j>=0;j--)
				 {
                 cout<<a[j]<<" ";
				 }
			     for(j=n-1;j>=r;j--)
				 {
                 cout<<a[j]<<" ";
				 }
				 sum=2*a[n-1]-2*a[0]+now-a[r];
			  }
		   }
		  else
		  cout<<"請輸入0或1!";
       }
	cout<<endl;
	cout<<"移動的總道數為:"<<sum<<endl;
	cout<<"移動的平均道數為:"<<(sum/n)<<endl;

}