操作系統精髓與設計原理--IO管理和磁盤調度

前言

IO體系結構是計算機系統和外部的接口,同時也是操作系統中設計最難的部分,因爲存在許多不同的設備和它們的應用,難有統一一致的解決方案。 IO體系結構的設計目標是提供一種系統化方法來控制與外部的交互,並且給操作系統提供有效管理IO所需的信息。

IO功能的邏輯結構

操作系統具有層次的特性,分層的原理是操作系統的功能可以根據其複雜度、特徵時間尺度和抽象層次被分開。按照該方法,可以將操作系統組織分成一系列層次。每一層都執行操作系統所需要的功能的一個相關子集,同時給高一層提供服務。理想情況下,這些層被設計爲某一層的變化不會影響其他層的改動。因此我們可以把一個問題分解爲一些更易於控制的子問題。

一般來說,層次越低,處理的時間尺度越短。操作系統的某些部分必須直接與計算機硬件交互,此時一個時間的時間尺度只有幾十個億分之一秒。而另一端,操作系統必須與用戶交互,而用戶以一種比較悠閒的速度發出命令,可能是每幾秒一次。多層結構非常適合這種情況。

把該原理應用於IO機制可以得到如圖所示的組織類型

image.png

組織的細節取決與設備的類型和應用程序。圖中有三個重要邏輯結構,一個特定的操作系統可能並不完全符合這些結構,但他的基本原則是有效的,且大多數操作系統都通過該類似的途徑進行I/O。

本地外圍設備

以一種簡單的方式來進行通信,如字節流或記錄流,會涉及以下幾層

  • 邏輯I/O: 該模塊把設備當做一個邏輯資源來處理,不關心實際控制設備的細節。邏輯I/O模塊代表用戶進程管理的一般I/O功能,允許用戶進程根據設備標識符以及諸如打開、關閉、讀、寫之類的簡單命令與該設備打交道。

  • 設備I/O: 請求的操作和數據(緩衝的數據、記錄等)被轉換成適當的I/O指令序列、通道命令和控制器指令。可以使用緩衝技術來提高使用率。

  • 調度和控制: I/O操作的排隊、調度實際上發生在該層。這一層處理中斷,收集並報告I/O狀態。這一層是與I/O模塊和設備硬件真正發生交互的軟件層。

通信端口

就一個通信設備而言,I/O結構看上去和上面描述的幾乎一樣。注意差別是邏輯I/O模塊被通信體系結構取代,通信體系結果自身也是由許多層組成,一個例子是TCP/IP。

文件系統

該結構常用於支持文件系統的輔存設備上管理I/O。這裏用到了上面沒有提到的三層

  • 目錄管理: 這一層符號文件名爲轉換爲標識符,用標識符可以通過文件描述符表或索引表直接或間接地訪問文件。這一層還處理影響文件目錄的用戶操作,如添加、刪除、重新組織等。

  • 文件系統: 這一層處理文件的邏輯結構以及用戶指定的操作,如打開、關閉、讀、寫等,同時管理訪問權限

  • 物理組織: 就像考慮到分段和分頁結構,虛擬內存地址必須轉換爲物理內存地址一樣。考慮到輔存設備的物理磁道和扇區結構,對於文件和記錄的邏輯訪問也必須轉換爲物理外存地址。輔助存儲空間和內存緩存區的分配通常也在這一層處理。

I/O緩衝

I/O的一個重要方面是使用緩衝區。緩衝區有I/O實用程序控制,而不是由應用程序進程控制。緩衝可以平滑計算機系統內部速度和I/O設備速度之間的差異。使用緩衝區還把實際的I/O傳送從應用程序進程的地址空間分離出來,這就使得操作系統能夠更加靈活地執行存儲器管理功能。

假設某個用戶進程需要從磁盤中讀入多個數據塊,每次讀一塊,每塊的長度爲512字節。這些數據將被讀入用戶進程地址空間的一個區域,如從虛擬地址1000到1511區域。最簡單的方法是對磁盤單元執行一個IO命令,並等待數據傳輸完畢。可以是忙等待(一直測試設備狀態),也可以是進程被中斷掛起。

該方法有兩個問題:

  1. 程序被掛起,等待相對比較慢的I/O完成

  2. 該方法干擾了操作系統的交換決策 在數據塊傳送期間,從1000到1511的虛擬地址單元必須保留在內存中,否則某些數據就可能丟失。如果使用了分頁機制,那麼至少需要將包含目標地址單元的頁鎖定在內存中。因此,儘管該進程的一部分頁面可能被交換到磁盤,但不可能把該進程全部換出,即使操作系統想不這麼做想這麼做也不行。還需要注意的是有可能出現單進程死鎖。如果一個進程發出一個I/O命令並掛起等待結果,然後在開始I/O操作前被換出,那麼該進程被阻塞,其等待I/O事件的發生,此時,I/O操作被阻塞,它等待該進程被換入。爲避免死鎖,在發出I/O請求之前,參與I/O操作的用戶存儲空間必須立即鎖定在內存中,即使這個I/O操作正在排隊,並且在一段時間內不會被執行。

同樣的考慮也適用於輸出操作。如果一個數據塊從用戶進程區域直接傳送到一個I/O模塊,那麼在傳送過程中,該進程被鎖定,並且不會被換出。

爲避免這些開銷和低效操作,優勢爲了方便起見,在輸入請求發出前就開始執行輸入傳送,並且在輸出請求發出一段時間之後纔開始執行輸出傳送,執行技術稱爲緩衝。

在討論各種緩衝方法時,有時候需要區分兩類I/O設備:面向塊的I/O設備和麪向流的I/O設備。

  • 面向塊:的設備將信息保存在快中,快的大小通常是固定的,傳輸過程中一次傳送一塊。通常可以通過塊號訪問數據。磁盤和USB智能卡都是面向塊的設備。

  • 面向流:以字節流的方式輸入輸出數據,沒有塊結構。如終端、打印機、通訊端口、鼠標和其他指示設備以及其他大多數的非輔存設備。

I/O緩衝方案(輸入)

image.png

單緩衝

是操作系統裏最簡單的類型,如圖b,當用戶發出I/O請求時,操作系統給該操作分配一個位於內存中系統部分的緩衝區。 對於面向快的設備,單緩衝方案可以描述如下:輸入傳送的數據被放到系統緩衝區中。當傳送完成時,進程把該快移動到用戶空間,並立即請求另一塊,這稱作預讀,或者預先輸入。這樣做原因是期望這塊數據最終會被使用。對於許多計算類型來說,這個假設在大多數情況下是合理的,因爲數據通常是被順序訪問的。只有在處理序列的最後,纔會讀入一個不必要的塊。

相對於無系統緩衝的情況,這種方法通常會提高系統速度。用戶進程可以在在下一數據塊讀取的同時,處理已讀入的數據塊。由於輸入發生在系統內存中而不是用戶進程內存,因此操作系統可以將該進程換出。但是,這種技術增加了操作系統的邏輯複雜度。操作系統必須記錄給用戶進程分配系統緩衝區的情況。交換邏輯也受到影響:如果I/O操作所涉及的磁盤和用於交換的磁盤是同一磁盤,則磁盤寫操作排隊等待將進程換出到同一個設備上是沒有意義的。若試圖換出進程並釋放內存,則要在I/O操作完成後才能開始,而這個時候把進程換出到磁盤已經不合適了。

類似的考慮也可以用於面向塊的輸出。當準備將數據發送到一臺設備時,首先把這些數據從用戶空間複製到系統緩衝區,其最終是從系統緩衝區中被寫出的。發請求的進程現在可以自由地繼續執行,或者在必要是換出。

關於使用單緩衝與不適用緩衝的粗略比較:T爲輸入一個數據塊的時間、C爲輸入請求的計算時間、M爲從系統緩衝區複製到用戶內存所需要的時間。如果是無緩衝,則每塊的執行時間爲T+C;如果有一個緩衝區,執行時間爲max[C,T]+M。大多數情況使用單緩衝時每塊執行時間顯著小於沒有使用緩衝的情況。

對於面向流的I/O,單緩衝方案能以每次傳送一行的方式或者每次傳送一個字節的方式使用。每次傳送一行的模式適合於滾動模式的終端(又稱爲啞終端)。對於這種類型的終端,用戶每次輸入一行,用回車表示到達行尾,並且輸出到終端時也是類似的每次輸出一行。行式打印機是這類設備的另一個例子。每次傳送一個字節的模式適用於表格模式終端,每次擊鍵對它來說都很重要,還有其他如傳感器和控制器的外設,都屬於這種類型。

對於每次傳送一行的I/O,可以用緩衝區保持單一行數據。在輸入期間用戶進程被掛起,等待整行的到達。對於輸出,用戶進程可以報一行輸出放置在緩衝區,然後繼續執行。它不需要掛起,除非在第一次輸出操作的緩衝區內容清空之前,又需要發生第二行輸出。對於每次傳送一個字節的I/O,操作系統和用戶進程直接的交互參照生產者/消費者模型。

雙緩衝

作爲對單緩衝方案的改進,可以給操作分配兩個系統緩衝區,如圖c所示。在一個進程往一個緩衝區傳送數據(或從這個緩衝區中取數據)的同時,操作系統正在清空(或填充)另一個緩衝區,該技術稱作雙緩衝或緩衝交換。

對於面向塊的傳送,可以粗略地估計執行時間爲max[C,T]。如果C <= T,則有可能使面向塊的設備全速運行;另一方面,如果C > T,雙緩衝能確保該進程不需要等待I/O。在任何一種情況下,比單緩衝都有所提高,但這種提高是以增加了複雜性爲代價的。

對面向流的輸入,再次面臨兩種可選擇的操作模式。對於每次傳送一行的I/O,用戶進程不需要爲輸入或輸出掛起,除非該進程的運行超過雙緩衝的速度。對於每次傳送一個字節的操作,雙緩衝具有兩倍的單緩衝相比,並沒有特別的優勢。這兩個情況都採用生產者/消費者模型。

循環緩衝

雙緩衝方案可以平滑I/O設備和進程之間的數據流。如果關注的焦點是某個特定進程的性能,那麼常常會希望相關I/O操作能夠跟上這個進程。如果該進程需要爆發式的執行大量的I/O操作,僅有雙緩衝就不夠了,在這種情況下,通常使用對於兩個緩衝區的方案來緩解不足。

當使用兩個以上的緩衝區時,這組緩衝區自身被當做循環緩衝區,如圖d,其中的每一個緩衝區是這個循環緩衝區的一個單元。

緩衝的作用

緩衝是用來平滑I/O需求峯值的一種技術,但是當進程的平均需求大於I/O設備的服務能力時,緩衝再多也不能讓I/O設備與這個進程一直並駕齊驅。即使有多個緩衝區,所以得緩衝區終將會被填滿,進程在處理完每一大塊數據後不得不等待。但是在多道程序設計環節中,當存在多種I/O活動和多種進程活動時,緩衝是提高操作系統效率和單個進程性能的一種方法。

磁盤調度與磁盤高速緩存

對整個系統性能產生重要影響的是磁盤I/O,因而關於該領域的研究和設計工作遠遠超過了其他任何一種類型的I/O。爲提高I/O的性能,使用最廣泛的兩個方法是磁盤調度和磁盤高速緩存。

磁盤調度

在任何時候,總是有一個關於同一個磁盤上的I/O請求隊列,這正是磁盤調度的對象,磁盤調度的目的是按某種方式滿足這些請求,並使得磁盤的機械尋道時間最小,從而提高性能。其中被掛起請求的物理佈局與對局部性的考慮在調度中起着主要作用。

磁盤性能參數

當磁盤驅動器工作時,磁盤以一種恆定的速度旋轉。爲了讀或寫,磁頭必須定位於指定的磁道和該磁道中指定的扇區的開始處。磁道旋轉包括在活動頭系統中移動磁頭或者在固定頭系統中電子旋轉一個磁頭。在活動頭系統中,磁頭定位到磁道所需要的時間稱作尋道時間。一旦選擇好磁道,磁盤控制器就開始等待,直到適當的扇區旋轉到磁頭處。磁頭到達扇區開始位置的時間稱作旋轉延遲。尋道時間與旋轉延遲的總和爲存取時間,這是到達讀或寫位置所需要的時間。一旦磁頭定位完成,磁頭就通過下面選擇的扇區執行讀或寫操作。這是操作的數據傳輸部分,傳輸所需時間爲傳輸時間

除了存取時間和傳送時間之外,一次磁盤I/O操作通常還會有一些排隊延遲。當進程發出一個I/O請求時,它必須首先在一個隊列中等待該設備可用。在合適的時候,該設備被分配給這個進程。如果該設備與其他磁盤驅動器共享一個或一組I/O通道,還可能需要額外的等待時間,直到該通道可用,之後纔開始訪問磁盤。

在一些高端服務器系統中,使用了一種稱爲旋轉定位感知的技術。具體工作流程如下:當發出一個尋道命令時,通道被釋放以處理其他I/O操作;當尋道完成後,設備確定何時數據旋轉到磁頭下面;當該扇區接近磁頭時,這個設備視圖重新建立到逐漸的通信路徑;如果控制單元或通道正忙於處理另一個I/O,則重新連接的嘗試失敗,設備必須旋轉一週,然後纔可以再次嘗試重新連接,這一次稱作RPS失敗,是個除上面所述的額外延遲。

  • 尋道時間: 是將磁頭臂移動到指定磁道所需的時間。事實證明這個時間很難減少。尋道時間有兩個重要部分組成:最初啓動時間和訪問臂到達一定速度是橫跨那些必須跨越的磁道所需要的時間。橫跨磁道的時間不是關於磁道數目的線性函數,還包括一個穩定時間(從磁頭定位於目標磁道直到確認磁道標識之間的時間)。許多提高都來自於更小更輕的磁盤部件,以前的磁盤直徑有14英寸,如今常見大學爲3.5英寸,減少磁頭臂所需移動的距離。

  • 旋轉延遲: 旋轉延遲是指將磁盤的待訪問地址區域旋轉到讀/寫磁頭可訪問的位置所需要的時間。是磁盤而非軟盤,器旋轉速度從3600r/m(如數碼相機等手持設備)到15000r/m(15000r/m爲每4ms轉一圈)。因此,在此速度下,平均旋轉延遲爲2ms。軟盤的轉速通常在300r/m到600r/m之間,因而其平均延遲在50ms到100ms之間。

  • 傳送時間: 網磁盤傳送或從磁盤傳送的時間取決於磁盤的旋轉速度,公式爲:

T = b/rNT=b/rN

  • 其中T表示傳送時間,b表示要傳送的字節數,N表示一個磁道中的字節數,r表示旋轉速度(r/s 轉/秒) 因此總的平均存取時間可以表示爲:

Ta = Ts+1/2r+b/rNTa=Ts+1/2r+b/rN

  • 其中,Ts爲平局尋道時間。

  • 時序比較: 通過前面定義的參數,現在考慮兩種不同的I/O操作來說明依賴平均值的危險性。考慮一個典型的磁盤。平均尋道時間爲4ms,轉速爲7500r/m,每個磁道有500個扇區,每個扇區有512個字節。如果讀取一個包含2500個扇區,大小爲1.28M的文件。

  • 首先假設文件儘可能緊湊地保存在磁盤上,即文件佔據5個相鄰磁道中的所有扇區(5磁道*500個扇區/磁道=2500個扇區),這就是通常所說的順序組織。現在,讀第一個磁道的時間爲:平均尋道(4ms)+旋轉延遲(4ms)+讀500個扇區(8ms)=16ms

  • 假設不需要尋道時間而讀取其餘的磁道,即I/O操作可以跟得上來自磁盤的數據流。則最多需要爲隨後的每個磁道處理旋轉延遲。因此後面每個磁道可以在4+8=12ms內讀入,則讀入總文件耗時16+(4*12)=0.064s

  • 如果是隨機訪問的情況下讀相同的數據所需要的時間(對扇區的訪問隨機分佈在磁盤上)。每個扇區所需時間:平均尋道(4ms)+旋轉延遲(4ms)+讀一個扇區(0.016ms)=8.016ms;總時間=2500*8.016=20.04s

  • 顯然,從磁盤讀扇區的順序對I/O的性能有很大的影響。當文件訪問需要讀寫多個扇區時,可以對數據使用扇區的方式進行一定的控制。但即使在訪問同一個文件的多道程序環境中,也會出現I/O請求競爭同一個磁盤的情況。

磁盤調度策略

在前面所述的例子中,產生性能差異的原因可以追溯到尋道時間。如果扇區訪問請求包括隨機選擇磁道,磁道I/O系統的性能非常低。爲提高性能需要減少花費在尋道上的時間。

考慮一種在多道程序環境中的典型情況。操作系統爲每個I/O設備維護一條請求隊列。因此對一個磁盤,隊列中可能有來自多個進程的許多I/O請求(寫和讀)。如果隨機地從隊列中選擇項目,那麼磁道I/O完全是被隨機訪問的,這種情況下的性能最差。隨機調度可用於其他技術進行對比,以評估這些技術。

假設磁盤有200個磁道,磁道請求隊列中是一些隨機請求。被請求的磁道按照磁盤調度程序接收順序分別爲55、58、39、18、90、160、150、38、184。下表給出不同算法的調度結果(都是從磁道100處開始)

調度過程表
FIFO 訪問的磁道FIFO 橫跨磁道數SSTF 訪問的磁道SSTF 橫跨磁道數SCAN 訪問的磁道SCAN 橫跨磁道數C-SCAN 訪問的磁道C-SCAN 橫跨磁道數
554590101505015050
58358321601016010
39195531842418424
18213916909418166
907238158323820
160701820553391
1501015013239165516
3811216010381583
1841461842418209032
平均尋道長度:55.3平均尋道長度:27.5平均尋道長度:27.8平均尋道長度:35.8
磁盤調度算法
名稱解釋特點
RSS隨機調度用於分析和模擬
FIFO先進先出最公平的調度
PRI進程優先級在磁盤隊列管理之外控制
LIFO後進先出局部性最好,資源的使用率最高
SSTF最短服務時間優先使用率高,隊列小
SCAN在磁盤上往復服務分佈比較好
C-SCAN一條道路,快速返回服務變化低
N-step-SCAN一次N個記錄的SCAN服務保證
FSCANN-step-SCAN,N=SCAN循環開始處的隊列大小使用率負載敏感
先進先出 FIFO

最簡單的調度,按順序處理隊列中的項目。改策略具有公平性的優點,因爲每個請求都會得到處理,並且是按照接收到的順序進行處理的。由調度過程表可知,磁盤的訪問順序和請求被最初接收到的順序是一致的。

使用FIFO時,如果只有一些進程需要訪問,且大多數請求是訪問簇聚的文件扇區,則有望達到較好的性能。但是如果有大量進程競爭一個磁盤,這種技術在性能上往往接近於隨機調度。因此需要考慮一些更復雜的調度策略。

進程優先級 PRI

對於基於優先級 PRI的系統,有關調度的控制在磁盤管理軟件控制之外。這種方法並不會優化磁盤的使用率,但可以滿足操作系統的其他目標。通常比較短的批作業和交互作業的優先級高,而較長計算時間的長作業的優先級較低。這就使得大量的短作業能夠迅速地通過系統,並且可以提供比較好的交互響應時間。但是長作業可能不打不等待過長的時間。此外,這種策略可能會導致部分用戶採用對抗手段:把作業分成小塊以應對系統的這種策略。對於數據庫系統,這類策略往往導致性能較差。

後進先出 LIFO

改選取最近請求的策略有許多優點:在事務處理系統中,把設備資源提供給最近的用戶,會導致磁頭臂在一個順序文件中移動時移動得很少,甚至不移動。利用這種局部性潰瘍提高吞吐量,減少隊列長調。只要一個作業積極地使用文件系統,它就可以儘可能地得到處理。但是如果由於工作量大而是磁盤保持忙狀態,就有可能出現餓死的情況。當一個作業已經往隊列中送入一個I/O請求,並且錯過了可以提供服務的位置時,改作業可能永遠得不到服務,除非它前面的隊列變爲空。

FIFO、PRI和LIFI調度都僅僅基於隊列或請求者的屬性。如果調度程序知道當前磁道位置,就可以採用基於被請求項的調度策略

最短服務時間優先 SSTF

選擇磁頭臂從當前位置開始移動最小的磁盤I/O請求。因此,SSTF策略總是選擇導致最小尋道時間的請求。當然總數選擇最小尋道時間並不能保證平均尋道時間最小。但是能提供比FIFO更好的性能。由於磁頭臂可以沿着兩個方向移動,因此可以使用一種隨機選擇算法解決距離相等的情況。

掃描 SCAN

除了FIFO,上面的策略都可能使某些請求直到整個隊列爲空時纔可以完成。即有可能總有新請求到達,並且在隊列存在的請求之前被選擇。爲避免出現這類飢餓的情況,比較簡單的做法是SCAN算法,由於其運行和電梯類似,因此也被稱爲電梯算法。

從調度過程表表可知。假設SCAN最初按照磁道序號遞增的方向,則第一個選擇的磁道是150,因爲該磁道是遞增方向距磁道100最近的磁道。

SCAN和SSTF非常相似,實際上如果在例子開始時磁頭臂沿磁道號減少的方向移動,那麼SSTF和SCAN的調度方式是相同的。但這僅僅是一個靜態的例子,隊列在這期間不會增加新的請求。甚至當隊列動態變化時,除非請求模式不符合常規,否則SCAN仍然類似於SSTF。

SCAN對最近橫跨過的區域不公平,因此在開發局部性方面不如SSTF和LIFO。

SCAN偏愛請求接近最靠裏或靠外的磁道的作業,且偏愛最近的作業。第一個可以通過C-SCAN避免,第二個可通過N-step-SCAN避免。

循環SCAN C-SCAN

掃表一個限定的方向上,因此當訪問到最後一個磁道時,磁頭臂返回到磁盤相反方向磁道的末端,並再次開始掃描。這就減少了新請求的最大延遲,對於SCAN。如果從最裏面的磁道掃描到最外面的磁道的期望時間爲t,則這個外設的扇區期望服務間隔爲2t。而對於C-SCAN,間隔約爲t+s,其中s爲最大尋道時間。

N-step-SCAN N步掃描和FSCAN

SSTF、SCAN和C-SCAN,磁頭臂可能在很長一段時間內不會移動,如果一個或多個進程對應磁道有較高的訪問速度,它們可以通過重複請求這個磁道以壟斷整個設備。高密對多面磁盤比低密度磁盤以及單面或雙面磁盤更容易受到這種特性的影響。爲避免這種“磁頭臂的粘性”,磁盤請求隊列被分成段,一次只有一段被完全處理,這種方法的兩個例子是N-step-SCAN N步掃描和FSCAN

N-step-SCAN策略把請求分成長度爲N的的子隊列,每一次用SCAN處理一個子隊列。在處理一個隊列時,新請求必須添加到其他某個隊列中,如果在掃描的最後剩下的琦琦書小於N,則它們全都將在笑一次掃描是處理。對於比較大的N值,N-step_SCAN的性能與SCAN接近;當N=1時,實踐上就是FIFO。

FSCAN是一種使用兩個子隊列的策略。當掃描開始時,所有請求都在一個隊列中,而另一個隊列爲空。在掃描過程中所有新到的請求都被放入另一個隊列中。因此對新請求的服務延遲到處理完所有老請求之後。

磁盤高速緩存

磁盤高速緩存是一個緩衝區。通常保存在內存中,充當磁盤塊在磁盤存儲器和其餘內存之間的高速緩存。由於局部性的原理,磁盤高速緩存的使用可以充分地減少內存和磁盤之間I/O傳送的快數。

高速緩衝存儲器通常指一個比內存小且比內存快的存儲器,改存儲器位於內存與處理器直接。這種高速緩存存儲器通過利用局部性原理,可以減少平均存儲器存取時間。

同樣的原理可以用於磁盤存儲器。一個磁盤高速緩存是內存中爲磁盤扇區設置的一個緩衝區,它包含有磁盤中某些扇區的副本。當出現一個請求某一特定扇區的I/O請求時,首先進行檢測,以確定改扇區是否在磁盤高速緩存中。如果在則改期可以通過這個高速緩存來滿足;如果不存在,則把被請求的扇區從磁盤讀到磁盤高速緩存中。由於訪問的局部性現象的存在,當一塊數據被取入高速緩存以滿足一個I/O請求時,很有可能將來還會訪問到這一塊數據。

設計考慮

首先,當一個I/O請求從磁盤高速緩存中得到滿足時,磁盤高速緩存中的數據必須傳送到發送請求的進程。這可以通過在內存中把這一塊數據從磁盤高速緩存傳送到分配給改用戶的存儲空間中,或者簡單地通過使用一個共享內存,傳送指向磁盤高速緩存中響應項的指針。後一種方法節省了內存到內存的傳送時間,並且允許其他進程使用讀者-寫者模型進行共享訪問。

其次是置換策略。當一個新扇區被讀入磁盤高速緩存時,必須置換出來一個已存在的塊。最常用的算法是最近最少使用算法LRU:置換在高速緩存中未被訪問的時間最長的塊。邏輯上,高速緩存有一個關於塊的棧組成,最近訪問過的塊在棧頂。當高速緩存中的一塊被訪問到時,它從棧中當前的位置移到棧頂。當一個快從輔存中取入時,包位於棧底的一個移出,並把新到來的塊壓入棧頂。

另一種看的算法是最不常用算法(LFU):置換集合中被訪問次數最少的塊。LFU可以通過給沒個塊關聯一個計數器來實現。當一個塊被讀入時,它的計數器爲1;當每次訪問到這一塊時,它的計數器加1.當需要置換時,選擇計數器最小的塊。直覺上LFU比LRU更適合,因爲LFU使用了關於每個塊的更多的相關信息。

一個簡單的LFU算法有以下問題:可能存在一些塊,從整體看很少發生對它們的訪問,當時它們被訪問時,由於局部性原理,會在一段很短的時間間隔裏出現很多次重複訪問,從而使訪問計數器的值很高。當這個間隔過去後,訪問計數器的值可能會讓人誤解,它並不表示很快又會訪問到這一塊。因此受局部性影響,LFU算法不是一個好的置換算法。

爲克服上面的缺點,有一種基於頻率的置換算法。一個簡化的版本是:塊在邏輯上被組織爲一個棧。棧頂的一部分留作一個新區。當出現一次高速緩存命中時,被訪問的塊移到棧頂。如果該快已經在這個新區中,它的訪問計數器不會增加,否則加1。如果有足夠大的新區,在一個短時間內被重複訪問的塊的訪問計數器不會改變,當有一次未命中時,訪問計數器最小且不在新區的塊被置換出。如果有不只一個這樣的塊,則選擇近期最少使用的塊。

改策略被LRU僅有略微的提高,並存在一下問題:

  • 當出現一次高速緩存未命中時,一個塊被取入新區,計數器爲1。

  • 只有該塊留在新區中,計數器的值保持爲1。

  • 最終這個塊的年齡超出了新區,但它的計數器仍爲1。

  • 如果這個塊沒有很快的被再次訪問到,很有可能被置換,因爲與那些不在新區的塊相比,其訪問計數器爲最小的,最後移出新區後沒有足夠長的時間間隔讓它們建立新的訪問計數。

關於這個問題的進一步改進的方案是,將棧劃爲三個區:新區、中區、老區。類型上面,位於新區的塊,訪問計數器不會增加;老區的塊才符合置換條件。假設有足夠大的中間區,這就使得相對比較頻繁地被訪問到的塊,在它們變成符合置換條件的塊之前,有機會增加自己的訪問計數器。

不論採用哪種特殊的置換策略,置換都可以按需求發送或預先發送。對LRU情況,只有當需要用到存儲槽時才置換這個扇區。對於LFU情況,一次可以釋放許多存儲槽。使用LFU的原因與寫回扇區的要求相關。如果一個扇區被讀入高速緩存,=並且僅僅用於讀,那麼當它被置換時,並不需要寫回磁盤。但是如果改扇區已經被修改了,則在他被置換出之前必須寫回磁盤,這時成簇地寫回並按順序寫以減少尋道時間是非常有意義的。

性能考慮

高速緩存的性能問題可以簡化成是否可以到達某個給定的未命中率,這取決於訪問磁盤的局部性行爲、置換算法和其他設計因素。但是,未命中率主要是關於磁盤高速緩存大小的函數。下圖概括了使用LRU的多個研究結果,一個是運行在VAX上的UNIX系統,一個是IBM大型機操作系統。下圖給出了基於頻率的置換算法的模擬研究結果。通過這兩個圖的比較可以登出這類性能評估的一個風險。這些圖看上去說明了LRU的性能由於基於頻率的置換算法,但是當使用相同高速緩存結構和相同訪問模式時,再對它們比較則基於拼了的置換算法由於LRU。因此訪問模式的順序和相關的設計問題(如塊大小)將對性能產生重要的影響。

image.png

使用LRU的磁盤高速緩存性能的結果


image.png

使用基於頻率置換算法的磁盤高速緩存性能


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章