簡要介紹
通常CPU的速度要比I/O設備的速度快得多得多,所以可以設定
緩衝區,對於從CPU來的數據,先放在緩衝區中,然後設備可以慢慢地從緩衝區中讀出數據。常見的
緩衝技術有:單緩衝,
雙緩衝,循環緩衝,緩衝池。其中,廣泛流行使用公用緩衝池。
引入
在作業系統中,引入
緩衝的主要原因,可歸結為以下幾點:
1.改善CPU與I/O設備間速度不匹配的矛盾
例如一個程式,它時而進行長時間的計算而沒有輸出,時而又陣發性把輸出送到印表機。由於印表機的速度跟不上CPU,而使得CPU長時間的等待。如果設定了
緩衝區,程式輸出的數據先送到緩衝區暫存,然後由印表機慢慢地輸出。這時,CPU不必等待,可以繼續執行程式。實現了CPU與I/O設備之間的並行工作。事實上,凡在數據的到達速率與其離去速率不同的地方,都可設定
緩衝,以緩和它們之間速度不匹配的矛盾。眾所周知,通常的程式都是時而計算,時而輸出的。
2. 可以減少對 CPU的中斷頻率,放寬對
中斷回響時間的限制
如果I/O操作每傳送一個位元組就要產生一次中斷,那么設定了n個位元組的
緩衝區後,則可以等到緩衝區滿才產生中斷,這樣中斷次數就減少到1/n,而且
中斷回響的時間也可以相應的放寬。
緩衝的引入可顯著提高 CPU和設備的並行操作程度,提高系統的吞吐量和設備的利用率。
一種是採用專用硬體
緩衝器一種是在記憶體劃出一個具有n個單元的專用緩衝區,以便存放輸入/輸出的數據。記憶體
緩衝區又稱軟體緩衝。
種類
單緩衝:在設備和
處理機之間設定一個
緩衝器。設備相
處理機交換數據時,先把被交換數據寫入
緩衝器,然後,需要數據的設備或處理機從緩衝器取定數據。由於緩衝器屬於
臨界資源,即不允許多個進程同時對一個緩衝器操作,因此,儘管單緩衝能匹配設備相
處理機的處理速度,但是,設備和設備之間不能通過單緩衝達到並行操作。
雙緩衝:解決兩台外設、列印帆和終端之間的並行操作問題的辦法是設定雙緩衝。有了兩個
緩衝器之後,CPU可把輸出到印表機的數據放入其中一個緩衝器(區)、讓印表機慢慢列印;然後,它又可以從另一個為終端設定的緩衝器(區)中讀取所需要的輸入數據。
多緩衝:是把多個緩衝區連線起來組成兩部分,一部分專門用於輸入,另一部分專門用於輸出的緩衝結構。
緩衝池:把多個緩衝區連線起來統一管理,既可用於輸入又可用於輸出的緩衝結構。
緩衝池的管理
結構
而一個
緩衝區由兩部分組成:一部分是用來標識該緩衝器和用於管理的緩衝首部,另一部分是用於存放數據的緩衝體。這兩部分有一一對應的映射關係。對
緩衝池的管理是通過對每一個緩衝器的緩衝首部進行操作實現的。
緩衝首部包括設備號、設備上的
數據塊號(塊設備時)、互斥標識位以及緩衝
佇列連線
指針和緩衝器號等。
系統把各
緩衝區按其使用狀況連成三種
佇列:
(1) 空白
緩衝佇列em,其隊首指針為F(em),隊尾指針為L(em);
(2) 裝滿輸入數據的輸入
緩衝佇列in,其隊首
指針為F(in),隊尾指針為L(in);
(3) 裝滿輸出數據的輸出
緩衝佇列out,其隊首
指針為F(out),隊尾指針為L(out)。
另外,在
緩衝池中還具有四種工作緩衝區:
(3) 用於收容輸出數據的工作
緩衝區(hout);
(4) 用於提取輸出數據的工作
緩衝區(sout)。 可見,
緩衝區工作在收容輸入、提取輸入、收容輸出和提取輸出四種工作方式如下:
管理
(1)從三種
緩衝區
佇列中按一定的選取規則取出一個緩衝區的過程take_buf(type);
(2)把
緩衝區按一定的選取規則插入相應的緩衝區
佇列的過程add_buf(type,number);
(3)供進程申請
緩衝區用的過程get_buf(type,number);
(4)供進程將
緩衝區放入相應緩衝區佇列的過程put_buf(type,work_buf)。
其中,參數type表示
緩衝佇列類型,number為緩衝區號,而work_buf則表示工作緩衝區類型。
工作過程
首先,輸入進程調用get_uf(em,number)過程從空白
緩衝區佇列中取出一個緩衝號為number的空白緩衝區,將其作為收容輸入緩衝區hin,當hin中裝滿了由
輸入設備輸入的數據之後,系統調用過程put_buf(in,hin)將該緩衝區插入輸入緩衝區佇列in中。
另外,當進程需要輸出數據數據時,輸出進程經過
緩衝管理程式調用過程get_buf(em,number)從空白緩衝區佇列中取出一個空白緩衝區number作為收容輸出緩衝區hout,待hout中裝滿輸出數據之後,系統再調用過程Put_buf(out,hout)將該緩衝區插入輸出緩衝區佇列out.
對
緩衝區的輸入數據和輸出數據的提取也是由過程get_buf和put_buf實現的。get_buf(out,number)從輸出
緩衝佇列中取出裝滿輸出數據的緩衝區number,將其作為sout。當sout中數據輸出完畢時,系統調用過程put_buf(em,sout)將該
緩衝區插入空白緩衝佇列。而get_buf(in,number)則從輸入
緩衝佇列中取出一個裝滿輸入數據的緩衝區number作為輸入緩衝區sin,當CPU從中提取完所需數據之後,系統調用過程put_buf(em,sin)將該緩衝區釋放和插入空白緩衝佇列em中。