標籤:

設備管理 | 緩衝管理

緩衝的定義

緩衝是在兩種不同速度的設備之間傳輸信息時平滑傳輸過程的常用手段。

緩衝的引入

(1)緩和CPU與I/O設備間速度不匹配的矛盾。

(2)提高CPU和I/O設備之間的並行性。

但進行輸出的時候,CPU快速的把輸出數據暫時存放在緩衝中,此時對於CPU來說已經完成了這次的輸出操作,可以繼續做其餘的工作。

而此時設備可以根據自己的輸出速度從緩衝中取出數據,慢慢的實現輸出操作。

所以CPU和設備之間就實現了部分的並行,從而提高了CPU的利用率。

(3)解決數據處理單位與傳輸單位不匹配的問題。

對於塊設備來說,它的數據傳輸單位是固定長度的數據塊,比如最少一個扇區的數據。而進程在處理數據的時候往往不是按照塊來進行的,比如一個進程在查詢某門功課的成績,只需要幾個位元組。

使用緩衝後,可以從塊設備上取出一個扇區的數據,然後進程再從緩衝中取出若干個需要的位元組的數據,轉存到用戶進程的工作區。

(4)減少對CPU的中斷頻率, 放寬對CPU中斷響應時間的限制。

例:在一個遠程通信系統中,在本地接收從遠程終端發來的數據,速率為9.6 kb/s。

其CPU中斷頻率為 9.6K;由於我們需要在下一個數據到來之前,將緩衝中的數據轉移到內存,所以CPU響應時間:0.1ms。

使用多位緩衝可以減少CPU的中斷頻率,但是對CPU響應時間沒有影響。

CPU中斷頻率:1.2K;CPU響應時間: 0.1ms;

使用兩組緩衝區,但一個緩衝區滿的時候並不需要立即移走緩衝區中的數據,可以將新到達的數據填寫到另一個緩衝中,只要當另一個緩衝區滿前能夠移走就行了。

所以,CPU中斷頻率:1.2K;CPU響應時間: 0.8ms;

利用緩衝技術如何進行I/O操作

(1) 進程請求從某設備讀入數據

①為本次的輸入操作設置一個空的緩衝

②從輸入設備上將數據轉到緩衝中

③從緩衝中取出數據,送到進程的工作區中。

(2) 進程請求從輸出設備輸出數據

①為本次的輸出操作設置一個空的緩衝

②從進程的工作區中把數據送到緩衝中

③把數據從緩衝中通過輸出設備進行輸出操作

單緩衝和雙緩衝

(1)單緩衝(Single Buffer)

單緩衝就是在用戶進程的工作區與設備之間只設置一個緩衝區。

其中 M 與 T之間是一個串列工作過程,C與M之間也是一個串列工作過程。不過當用戶進程在處理工作區數據的時候,緩衝區已經空,輸入設備可以繼續輸入第二組數據到緩衝區。所以C和T之間是部分並行的工作狀態。所以系統對一塊數據的處理時間:Max(C,T)+M

(2)雙緩衝(Double Buffer)

在這裡M與T之間是一個並行的工作狀態,C與M是串列的,C與T之間是並行的。所以系統對一塊數據的處理時間:Max(C+M,T) 。

緩衝池(Buffer Pool)

緩衝池是指在系統中設置一組公用的緩衝區,任何一個需要進行IO操作的進程都可以去公共緩衝區中申請一個空閑的緩衝區來使用。使用完成後及時的歸還給系統。這些公用的緩衝區是循環重複的使用的。

(1)緩衝隊列管理

由於系統中有多個緩衝區,所以一般組建成一個隊列,來進行管理。

由內存中一組緩衝區組成,由系統統一管理。

①空緩衝區:空緩衝隊列emq;

②裝滿輸入數據的緩衝區:空緩衝隊列emq;

③裝滿輸出數據的緩衝區:輸出隊列outq。

(2)緩衝池的使用

① Getbuf ( type): 申請一個緩衝區;

② Putbuf (type, number): 釋放一個緩衝區;

由於 getbuf 和 putbuf 都是針對系統中的相應的緩衝隊列進行,因此系統中的緩衝隊列,是多個進程之間需要互斥使用的臨界資源。

所以設置相應的信號量如下:

  • 資源信號量:表示某類緩衝隊列中緩衝區的數量:
    • RS(emq)=n; RS(inq)=0; RS(outq)=0;
  • 互斥信號量:實現相應緩衝隊列的互斥使用:
    • MS(emq)=MS(inq)=MS(outq)=1;

Getbuf 過程

Procedure Getbuf(type) begin P(RS(type)); // 判斷當前隊列中含有相應的緩衝區 P(MS(type)); // 申請隊列的使用權 B(number) = Takebuf(type); V(MS(type)); // 釋放緩衝隊列 end

Putbuf 過程

// type: 緩衝隊列// number:要歸還的緩衝區Procedure Putbuf(type, number) begin P(MS(type)); // 申請緩衝隊列的使用權 Addbuf(type, number); //掛載緩衝區到指定的緩衝隊列上 V(MS(type)); V(RS(type)); // 空閑資源+1 end

(3)緩衝池的工作方式

UNIX系統的緩衝區管理(塊緩衝)

(1)UNIX系統緩衝管理的思路

減少對磁碟的I/O操作次數,加快系統響應。主要有預先緩存和延遲發送這兩種技術。

預先緩存: 當進程要從磁碟讀數據時,首先從高速緩衝中讀。

如果高速緩衝中有想要的數據就直接從告訴緩衝中取出數據送到用戶進程,從而減少啟動磁碟的次數。

延遲發送:當進程要寫數據到磁碟時,先寫入高速緩衝中。

首先寫入告訴緩衝中暫時存放,並且做好延遲寫的標記,以後在恰當的時候執行寫磁碟的操作,一次性寫出多個數據,從而減少寫磁碟的操作。

(2)緩衝管理數據結構

① 緩衝區的組成

  • 緩存數組 —— 含有磁碟上的數據的存儲器數組
  • 緩存首部 —— 描述緩衝區特性的數據結構,其中有一個指針指向緩存數組。所以它們在物理上可以不存放在一起。

② 緩存首部結構

  • 設備號dev
    • 緩衝區所包含的信息所屬設備的設備號
  • 塊號blkno
    • 由設備號指出的設備上相對於第0塊的塊號
  • 狀態flag——描述了緩衝區當前的狀態
    • 忙標誌BUSY:緩衝區當前正「忙」
    • 有效位AVE:緩衝包含的數據有效
    • 延遲寫DELWR :核心在某緩衝區重新分配出去之前必須把緩衝區內容寫到磁碟上
    • 寫標誌WRITE: 核心當前正把緩衝區的內容寫到磁碟
    • 讀標誌READ:核心當前正從磁碟往緩衝區寫信息
    • 等待位 WAIT: 一個進程當前正在等候緩衝區變為空閑

③ 緩衝區隊列結構

  • 設備緩衝區隊列
    • 某類設備有關的所有緩衝區組成的隊列稱為設備緩衝區隊列,簡稱b鏈

  • 空閑緩衝區隊列
    • 可供重新分配使用的緩衝區組成的隊列稱為空閑緩衝區隊列,簡稱av鏈

(3)UNIX緩衝管理演算法:LRU演算法

①分配一個buf讀/寫某設備上的塊

  • 首先尋找該設備的b鏈,若找到:
    • B_BUSY=0(表示沒有被任何進程佔用):移出av鏈,B_BUSY=1 ;使用完後, B_BUSY=0,鏈入av鏈隊尾。
    • B_ BUSY=1(這塊數據正在被某個進程使用,則等待):緩衝區不在av鏈上,該進程睡眠。
  • 若b鏈中找不到: 取av鏈 (空閑buf隊列) 的首元素:
    • 若無延遲寫標記,直接分配,插入b鏈,B_BUSY=1 ;用完後,鏈入av鏈隊尾, B_BUSY=0
    • 若有延遲寫標記(該塊數據與緩存區內的數據不一致,該塊數據需要被寫入磁碟):分配下一個空閑緩衝區,然後同上一點。

② 釋放一個緩衝區

緩衝區讀寫操作結束後,保留在b鏈,並插入av鏈尾。

③ 對延遲寫的處理

當一個具有延遲寫標記的buf移到av鏈頭,要用於分配時,立即進行寫操作:從av鏈上摘除,使用完後又送入av頭部,同時仍保留在原b鏈中。方便下次從高速緩衝中直接查找到該數據,減少從磁碟中查找的次數。

(4)緩衝區的檢索演算法

① 分配一個緩衝區

② 釋放一個緩衝區

(5)讀磁碟塊與寫次盤塊

① 讀磁碟塊

② 寫磁碟塊

推薦閱讀:

一個Mac小白的自我修養
命令行中四個常見命令的使用
操作系統精髓與設計原理讀書筆記5
超級強大的系統清理工具CCleaner
操作系統引論 | 操作系統的發展過程

TAG:操作系統 |