操作系統學習筆記(12)——緩沖技術和驅動調度技術




1、緩沖技術

  • 緩沖技術的基本思想是:當一個進程輸出數據時,先向系統申請一塊內存作為輸出緩沖區;然后,將輸出數據高速輸出到緩沖區;不斷把數據填到緩沖區,直到緩沖區被裝滿為止;此后,進程可以繼續它的計算,同時,系統將緩沖區內容寫到I/O設備上。當一個進程執行讀操作輸入數據時,過程與此類似。
  • 單緩沖
    • 單緩沖是在設備和CPU之間設置一個緩沖器。
    • 對於塊設備而言,假定從磁盤把一塊數據輸入到緩沖的時間為T,操作系統將該緩沖區中的數據傳送到用戶區的時間為M,CPU對這一塊數據計算的時間為C。如果不采用緩沖,數據直接從磁盤到用戶區,每塊數據的處理時間為T+C。若采用單緩沖,每塊數據的處理時間為max(C, T)+M。通常來說M要遠遠小於C或者T,因此采用緩沖技術,輸入的效率提高了很多。

 

  • 雙緩沖:為加快輸入輸出速度和提高設備利用率,引入了雙緩沖。首先將數據送入緩沖區1,裝滿后使轉向緩沖區2。此時操作系統可從緩沖區1中移出數據送至用戶進程區,由CPU對數據進行計算。兩個緩沖區交替使用,使得CPU和I/O設備、設備和設備的並行性進一步提高。在雙緩沖時,系統處理一塊數據的時間可粗略地認為是max(C,T)。

 

  • 循環緩沖
    • 使用循環緩沖的原因:當輸入與輸出的速度基本相匹配時,雙緩沖能獲得較好的效果,使輸入與輸出基本上能並行操作。若兩者的速度相差甚遠,雙緩沖的作用則不夠理想,不過可以增加緩沖區數量,從而改善這些問題。因此,又引入了多緩沖機制。並將多緩沖組織成循環緩沖形式。
    • 循環緩沖的組成:
      • 多個緩沖區。在循環緩沖中包含了多個緩沖區,每個緩沖區的大小相同。緩沖區可分為三種類型:空緩沖區R;已裝滿數據的緩沖區G;計算進程正在使用的緩沖區C。
      • 多個指針。對用於輸入的多緩沖,可設置這樣三個指針。Nextg指示計算進程下一個可用的緩沖區G;Nexti指示輸入進程下次可用的空緩沖區R;Current指示計算進程正在使用的緩沖區C。

    • 循環緩沖的使用
      • GetBuffer過程。對於計算進程而言,調用GetBuffer過程,通過Nextg獲得要進行計算的緩沖區,相應地將該緩沖區改為C,將Current指向該緩沖區,Nextg指向下一個G緩沖區。對於輸入進程而言,調用GetBuffer過程,通過Nexti獲取可用的緩沖區,相應地將該緩沖區改為C,將Current指向該緩沖區,Nexti指向下一個R緩沖區。

      • ReleaseBuffer過程。當計算進程提取完畢后,當前的緩沖區空出來了,調用Release過程,將C改為R。類似輸入進程輸入完畢,調用Release過程,將該緩沖區改為G。

    • 利用循環緩沖實現進程同步
      • 指針Nexti和Nextg不斷順時針運行,可能會出現以下情況——

      1. Nexti指針追上Nextg指針。意味着輸入進程輸入數據的速度大於計算進程處理數據的速度,已把全部可用的空緩沖裝滿,再無緩沖區可用。此時,輸入進程應該阻塞,直到有計算進程計算完畢,將某個緩沖區釋放,輸入進程才被喚醒。
      2. Nextg指針追上Nexti指針。意味着計算進程處理數據的速度大於輸入進程輸入數據的速度,已把所有輸入數據的緩沖區處理完畢,再無有數據的緩沖區供計算進程使用。此時,計算進程應該阻塞,直到有輸入進程輸入數據,將某個緩沖區釋放,計算進程才被喚醒。
  • 緩沖池
    • 緩沖池的組成
      • 空閑緩沖區隊列emq:由空閑緩沖區所連成的隊列。其隊首指針F(emq)和隊尾指針L(emq)分別指向該隊列的首尾緩沖區

      • 輸入隊列inq:這是由裝滿輸入數據的緩沖區所連成的隊列。其隊首指針F(inq)和隊尾指針L(inq)分別指向該隊列的首、尾緩沖區。

      • 輸出隊列outq:這是由裝滿輸出數據的緩沖區所連成的隊列。其隊首指針F(outq)和隊尾指針L(outq)分別指向該隊列的首、尾緩沖區。

      • 除了上述三個隊列外,還應具有4種工作緩沖區。① 用於收容輸入數據的工作緩沖區(hin)。② 用於提取輸入數據的工作緩沖區(sin)。③ 用於收容輸出數據的工作緩沖區(hout)。④ 用於提取輸出數據的工作緩沖區(sout)。

    • 緩沖池管理的基本操作 Getbuf 過程和 Putbuf 過程
      • 緩沖池中兩個基本操作。
      1. Getbuf(type):用於從type所指定的隊列的隊首摘下一個緩沖區。
      2. Putbuf(type,number):用於將由參數number所指示的緩沖區掛在type隊列上。
      • 需要注意的是,緩沖池是一個臨界資源。在Getbuf和Putbuf過程中必須遵循進程同步的原則。 
  • 緩沖池工作的基本方式

 

 

    • 收容輸入工作方式:在輸入進程需要輸入數據時,調用Getbuf(emq)過程,從空緩沖區隊列emq的隊首摘下一個空緩沖區,把它作為收容輸入工作緩沖區hin。然后,把數據輸入其中,裝滿后再調用Putbuf(inq,hin)過程,將該緩沖區掛在輸入隊列inq的隊尾。
    • 提取輸入工作方式:當計算進程需要輸入數據時,調用Getbuf(inq)過程,從輸入隊列取一個緩沖區作為提取輸入工作緩沖區sin,計算進程從中提取數據。計算進程用完該數據后,再調用Putbuf(emq,sin)過程,將該緩沖區掛到空緩沖隊列emq上。
    • 收容輸出工作方式:當計算進程需要輸出時調用Getbuf(emq)過程,從空緩沖隊列emq的隊首取得一個空緩沖,作為收容輸出工作緩沖區hout。當其中裝滿輸出數據后,又調用Putbuf(outq,hout)過程,將該緩沖區掛在輸出隊列outq末尾。
    • 提取輸出工作方式:要輸出時,由輸出進程調用Getbuf(outq)過程,從輸出隊列的隊首取一個裝滿輸出數據的緩沖區,作為提取輸出工作緩沖區sout。在數據提取完后,再調用Putbuf(emq,sout)過程,將它掛在空緩沖隊列emq的末尾。


 2、驅動調度技術

  •  磁盤的物理結構:磁盤是一種直接存取存儲設備,又叫隨機存取存儲設備。它的每個物理塊有確定的位置和唯一的地址,存取任何一個物理塊所需的時間幾乎不依賴於此信息的位置。每個盤面有一個讀寫磁頭,所有的讀寫磁頭都固定在唯一的移動臂上同時移動。在一個盤面上的讀寫磁頭的軌跡稱磁道,在磁頭位置下的所有磁道組成的圓柱體稱柱面,一個磁道又可被划分成一個或多個物理塊。文件的信息通常不是記錄在同一盤面的各個磁道上,而是記錄在同一柱面的不同磁道上,這樣可使移動臂的移動次數減少,縮短存取信息的時間。為了訪問磁盤上的一個記錄,必須給出3個參數:柱面號、磁頭號和塊號。

 

  • 磁盤訪問時間
    • 尋道時間:尋道時間(Ts)是指把磁臂(磁頭)移動到指定磁道上所經歷的時間。該時間是啟動磁臂的時間s與磁頭移動n條磁道所花費的時間之和,即——Ts=m×n +s。其中,m是一常數,與磁盤驅動器的速度有關,對一般磁盤,m=0.2;對高速磁盤,m≤0.1,磁臂的啟動時間約為2ms。這樣,對一般的硬盤,其尋道時間將隨尋道距離的增加而增大,大體上是5~30ms。

    • 旋轉延遲時間:旋轉延遲時間()是指定扇區移動到磁頭下面所經歷的時間。對於硬盤,典型的旋轉速度大多為5400r/min,每轉需時11.1 ms,平均旋轉延遲時間為5.55ms;對於軟盤,其旋轉速度為300r/min或600r/min,這樣,平均為50~100ms。

    • 傳輸時間:傳輸時間(Tt)是指把數據從磁盤讀出或向磁盤寫入。Tt的大小與每次所讀/寫的字節數b和旋轉速度有關。

    • 可將訪問時間Ta表示為

      其中,r為磁盤每秒鍾的轉數;N為一條磁道上的字節數 

  • 磁盤調度
    • 磁盤是可供多個進程共享的設備,當有多個進程都要求訪問磁盤時,應采用一種最佳的調度算法,以使各進程對磁盤的平均訪問時間最小。由於在磁盤訪問的時間中,主要是尋道時間,因此,磁盤調度的目標,是使磁盤的平均尋道時間最少。
    • 先來先服務:先來先服務(FCFS)是最簡單的磁盤調度算法。它根據進程請求訪問磁盤的先后次序進行調度。此算法的優點是公平、簡單,且每個進程的請求都能依次得到處理,不會出現某一進程的請求長期得不到滿足的情況。但會致使平均尋道時間長。 

 

    •  最短尋道時間優先:最短尋道時間優先(SSTF)算法總是先執行查找時間最短的那個磁盤請求。從而,較“先來先服務”算法有較好的性能。但是本算法存在“飢餓”現象,隨着源源不斷靠近當前磁頭位置讀寫請求的到來,使早來的但距離當前磁頭位置遠的讀寫請求服務被無限期推遲

 

 

    • 掃描算法:掃描算法(SCAN)每次總是選擇沿臂的移動方向最近的那個柱面。如果沿這個方向沒有訪問的請求時,就改變臂的移動方向,這非常類似於電梯的調度規則。掃描算法克服了“飢餓”這一缺點。掃描算法偏愛那些最接近里面或靠外的請求,對最近掃描跨過去的區域響應會較慢。

 

    • 循環掃描算法(CSCAN):移動臂總是從0號柱面至最大號柱面順序掃描,然后,直接返回0號柱面重復進行,歸途中不再服務,構成了一個循環,這就減少了處理新來請求的最大延遲。CSCAN算法規定磁頭單向移動。 

 

    • 分步掃描N-Step-SCAN算法:將磁盤請求隊列分成若干個長度為N的子隊列,磁盤調度將按FCFS算法依次處理這些子隊列。而每處理一個隊列時又是按SCAN算法,對一個隊列處理完后,再處理其他隊列。 當正在處理某子隊列時,如果又出現新的磁盤I/O請求,便將新請求進程放入其他隊列,這樣就可避免出現粘着現象。當N值取得很大時,會使N步掃描法的性能接近於SCAN算法的性能;當N=1時,N步SCAN算法便蛻化為FCFS算法。

    • FSCAN算法:FSCAN算法實質上是N步SCAN算法的簡化, 即FSCAN只將磁盤請求隊列分成兩個子隊列。一個是由當前所有請求磁盤I/O的進程形成的隊列,由磁盤調度按SCAN算法進行處理。在掃描期間,將新出現的所有請求磁盤I/O的進程, 放入另一個等待處理的請求隊列。這樣,所有的新請求都將被推遲到下一次掃描時處理。

  • 提高I/O速度的方法
    • 提前讀:用戶經常采用順序方式訪問文件的各個盤塊上的數據,在讀當前盤塊時已能知道下次要讀出的盤塊的地址,因此,可在讀當前盤塊的同時,提前把下一個盤塊數據也讀入磁盤緩沖區。這樣一來,當下次要讀盤塊中的那些數據時,由於已經提前把它們讀入了緩沖區,便可直接使用數據,而不必再啟動磁盤I/O,從而,減少了讀數據的時間,也就相當於提高了磁盤I/O速度。
    • 延遲寫:在執行寫操作時,磁盤緩沖區中的數據本來應該立即寫回磁盤,但考慮到該緩沖區中的數據不久之后再次被輸出進程或其他進程訪問,因此,並不馬上把緩沖區中數據寫盤,而是把它掛在空閑緩沖區隊列的末尾。隨着空閑緩沖區的使用,存有輸出數據的緩沖區也不停地向隊列頭移動,直至移動到空閑緩沖區隊列之首。當再有進程申請緩沖區,且分到了該緩沖區時,才把其中的數據寫到磁盤上。只要存有輸出數據的緩沖區還在隊列中,任何訪問該數據的進程,可直接從中讀出數據,不必再去訪問磁盤。這樣做,可以減少磁盤的I/O時間。

    • 虛擬盤:虛擬盤是指用內存空間去仿真磁盤。該盤的設備驅動程序可以接受所有標准的磁盤操作,但這些操作的執行,不是在磁盤上而是在內存中。操作過程對用戶是透明的,即用戶並不會發現這與真正的磁盤操作有什么不同,而僅僅是更快一些。虛擬盤是易失性存儲器,一旦系統或電源發生故障,或重新啟動系統時,原來保存在虛擬盤中的數據會丟失。因此,該盤常用於存放臨時文件。


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM