1. 程式人生 > >磁碟排程演算法-java實現

磁碟排程演算法-java實現

磁碟排程在多道程式設計的計算機系統中,各個程序可能會不斷提出不同的對磁碟進行讀/寫操作的請求。由於有時候這些程序的傳送請求的速度比磁碟響應的還要快,因此我們有必要為每個磁碟裝置建立一個等待佇列,常用的磁碟排程演算法有以下四種:

先來先服務演算法(FCFS),

最短尋道時間優先演算法(SSTF),

掃描演算法(SCAN),

迴圈掃描演算法(CSCAN)

:假定某磁碟共有200個柱面,編號為0-199,如果在為訪問143號柱面的請求者服務後,當前正在為訪問125號柱面的請求服務,同時有若干請求者在等待服務,它們每次要訪問的柱面號為   861479117794150102175130

1、先來先服務演算法(FCFS

)First Come First Service

這是一種比較簡單的磁碟排程演算法。它根據程序請求訪問磁碟的先後次序進行排程。此演算法的優點是公平、簡單,且每個程序的請求都能依次得到處理,不會出現某一程序的請求長期得不到滿足的情況。此演算法由於未對尋道進行優化,在對磁碟的訪問請求比較多的情況下,此演算法將降低裝置服務的吞吐量,致使平均尋道時間可能較長,但各程序得到服務的響應時間的變化幅度較小。

先來先服務(12586.147.91.177.94.150.102.175.130

 public void fcfs(){
      String stext="被訪問的下一個磁軌         磁軌號移動距離"+'\n';
      int su=kai;
      sum=0;
      for(int i=0;i<num;i++)
      { if(su<s[i])
      s1[i]=s[i]-su;
      else
      s1[i]=su-s[i];
      su=s[i];
      sum+=s1[i];
      }
      sum=sum/num;
      for(int i=0;i<num;i++)
       {stext+="         "+s[i]+"                                 "+s1[i]+"   ";
        stext+='\n';
       }
       stext+="平均尋道長度:"+sum+" ";
       jt.setText(stext);
    	}

2、最短尋道時間優先演算法(SSTF) Shortest Seek Time First

該演算法選擇這樣的程序,其要求訪問的磁軌與當前磁頭所在的磁軌距離最近,以使每次的尋道時間最短,該演算法可以得到比較好的吞吐量,但卻不能保證平均尋道時間最短。其缺點是對使用者的服務請求的響應機會不是均等的,因而導致響應時間的變化幅度很大。在服務請求很多的情況下,對內外邊緣磁軌的請求將會無限期的被延遲,有些請求的響應時間將不可預期。

最短尋道時間優先(125130.147.150.175.177.102.94.91.86

public void sstf(){
      String stext="被訪問的下一個磁軌         磁軌號移動距離"+'\n';
      int su=kai;
      int s2[]=new int[100];
      sum=0;
      
      for(int i=0;i<m;i++)
      s2[i]  =c1[i];//c1[i]是已排好序的,比當前磁軌大的磁軌
      for(int i=0;i<n;i++)
      s2[i+m]=c2[i];//c2[i]已排好序的,比當前磁軌小的磁軌
      for(int i=0;i<num;i++)
      { if(su<s2[i])
      s1[i]=s2[i]-su;
      else
      s1[i]=su-s2[i];
      su=s2[i];
      sum+=s1[i];
      }
      sum=sum/num;
      for(int i=0;i<num;i++)
       {stext+="         "+s2[i]+"                                 "+s1[i]+"   ";
        stext+='\n';
       }
       stext+="平均尋道長度:"+sum+" ";
     
       jt.setText(stext);
    	}


3、掃描演算法(SCAN)電梯排程

掃描演算法不僅考慮到欲訪問的磁軌與當前磁軌的距離,更優先考慮的是磁頭的當前移動方向。例如,當磁頭正在自裡向外移動時,掃描演算法所選擇的下一個訪問物件應是其欲訪問的磁軌既在當前磁軌之外,又是距離最近的。這樣自裡向外地訪問,直到再無更外的磁軌需要訪問才將磁臂換向,自外向裡移動。這時,同樣也是每次選擇這樣的程序來排程,即其要訪問的磁軌,在當前磁軌之內,從而避免了飢餓現象的出現。由於這種演算法中磁頭移動的規律頗似電梯的執行,故又稱為電梯排程演算法。此演算法基本上克服了最短尋道時間優先演算法的服務集中於中間磁軌和響應時間變化比較大的缺點,而具有最短尋道時間優先演算法的優點即吞吐量較大,平均響應時間較小,但由於是擺動式的掃描方法,兩側磁軌被訪問的頻率仍低於中間磁軌。

電梯排程(125102.94.91.86.130.147.150.175.177

 String stext="被訪問的下一個磁軌         磁軌號移動距離"+'\n';
      int su=kai;
      int s2[]=new int[100];
      sum=0;
      for(int i=0;i<n;i++)
      s2[i]  =c2[i];
      for(int i=0;i<m;i++)
      s2[i+n]=c1[i];
      for(int i=0;i<num;i++)
      { if(su<s2[i])
        s1[i]=s2[i]-su;
        else
        s1[i]=su-s2[i];
        su=s2[i];
        sum+=s1[i];
      }
      sum=sum/num;
      for(int i=0;i<num;i++)
       {stext+="         "+s2[i]+"                                 "+s1[i]+"   ";
        stext+='\n';
       }
       stext+="平均尋道長度:"+sum+" ";


4、迴圈掃描演算法(CSCAN

迴圈掃描演算法是對掃描演算法的改進。如果對磁軌的訪問請求是均勻分佈的,當磁頭到達磁碟的一端,並反向運動時落在磁頭之後的訪問請求相對較少。這是由於這些磁軌剛被處理,而磁碟另一端的請求密度相當高,且這些訪問請求等待的時間較長,為了解決這種情況,迴圈掃描演算法規定磁頭單向移動。例如,只自裡向外移動,當磁頭移到最外的被訪問磁軌時,磁頭立即返回到最裡的欲訪磁軌,即將最小磁軌號緊接著最大磁軌號構成迴圈,進行掃描。

迴圈掃描 (125130.147.150.175.177.86.91.94.102

  public void cscan(){
      String stext="被訪問的下一個磁軌         磁軌號移動距離"+'\n';
      int su=kai;
      int j=0;
      int s2[]=new int[100];
      sum=0;
      for(int i=0;i<n;i++)
      s2[i]  =c2[i];
      for(int i=m-1;i>=0;j++,i--)
      s2[j+n]=c1[i];
      for(int i=0;i<num;i++)
      { if(su<s2[i])
        s1[i]=s2[i]-su;
        else
        s1[i]=su-s2[i];
        su=s2[i];
        sum+=s1[i];
      }
      sum=sum/num;
      for(int i=0;i<num;i++)
       {stext+="         "+s2[i]+"                                 "+s1[i]+"   ";
        stext+='\n';
       }
       stext+="平均尋道長度:"+sum+" ";
     
       jt.setText(stext);
    	}