緩衝技術

緩衝技術

緩衝技術是為了協調吞吐速度相差很大的設備之間數據傳送而採用的技術。 為了緩和CPU和I/O設備速度不匹配的矛盾,提高CPU和I/O設備的並行性,在現代作業系統中,幾乎所有的I/O設備在與處理機交換數據時都用了緩衝區,並提供獲得和釋放緩衝區的手段。總結來說,緩衝區技術用到了緩衝區,而緩衝區的引入是為了緩和CPU和I/O設備的不匹配,減少對CPU的中斷頻率,提高CPU和I/O設備的並行性。 在數據到達與離去速度不匹配的地方,就應該使用緩衝技術。緩衝技術好比是一個水庫,如果上游來的水太多,下游來不及排走,水庫就起到“緩衝”作用,先讓水在水庫中停一些時候,等下游能繼續排水,再把水送往下游。

基本信息

簡要介紹

通常CPU的速度要比I/O設備的速度快得多得多,所以可以設定緩衝區,對於從CPU來的數據,先放在緩衝區中,然後設備可以慢慢地從緩衝區中讀出數據。常見的緩衝技術有:單緩衝,雙緩衝,循環緩衝,緩衝池。其中,廣泛流行使用公用緩衝池。

引入

在作業系統中,引入緩衝的主要原因,可歸結為以下幾點:

1.改善CPU與I/O設備間速度不匹配的矛盾

例如一個程式,它時而進行長時間的計算而沒有輸出,時而又陣發性把輸出送到印表機。由於印表機的速度跟不上CPU,而使得CPU長時間的等待。如果設定了緩衝區,程式輸出的數據先送到緩衝區暫存,然後由印表機慢慢地輸出。這時,CPU不必等待,可以繼續執行程式。實現了CPU與I/O設備之間的並行工作。事實上,凡在數據的到達速率與其離去速率不同的地方,都可設定緩衝,以緩和它們之間速度不匹配的矛盾。眾所周知,通常的程式都是時而計算,時而輸出的。

2. 可以減少對 CPU的中斷頻率,放寬對中斷回響時間的限制

如果I/O操作每傳送一個位元組就要產生一次中斷,那么設定了n個位元組的緩衝區後,則可以等到緩衝區滿才產生中斷,這樣中斷次數就減少到1/n,而且中斷回響的時間也可以相應的放寬。

3. 提高 CPU和 I/O設備之間的並行性

緩衝的引入可顯著提高 CPU和設備的並行操作程度,提高系統的吞吐量和設備的利用率。

根據I/O控制方式,緩衝的實現方法有兩種:

一種是採用專用硬體緩衝器一種是在記憶體劃出一個具有n個單元的專用緩衝區,以便存放輸入/輸出的數據。記憶體緩衝區又稱軟體緩衝。

種類

根據系統設定的緩衝器的個數,可把緩衝技術分為:

單緩衝:在設備和處理機之間設定一個緩衝器。設備相處理機交換數據時,先把被交換數據寫入緩衝器,然後,需要數據的設備或處理機從緩衝器取定數據。由於緩衝器屬於臨界資源,即不允許多個進程同時對一個緩衝器操作,因此,儘管單緩衝能匹配設備相處理機的處理速度,但是,設備和設備之間不能通過單緩衝達到並行操作。

緩衝技術 緩衝技術

雙緩衝:解決兩台外設、列印帆和終端之間的並行操作問題的辦法是設定雙緩衝。有了兩個緩衝器之後,CPU可把輸出到印表機的數據放入其中一個緩衝器(區)、讓印表機慢慢列印;然後,它又可以從另一個為終端設定的緩衝器(區)中讀取所需要的輸入數據。

緩衝技術 緩衝技術

多緩衝:是把多個緩衝區連線起來組成兩部分,一部分專門用於輸入,另一部分專門用於輸出的緩衝結構。

多緩衝 多緩衝

緩衝池 把多個緩衝區連線起來統一管理,既可用於輸入又可用於輸出的緩衝結構。

緩衝池的管理

結構

緩衝池由多個緩衝區組成。

而一個緩衝區由兩部分組成:一部分是用來標識該緩衝器和用於管理的緩衝首部,另一部分是用於存放數據的緩衝體。這兩部分有一一對應的映射關係。對緩衝池的管理是通過對每一個緩衝器的緩衝首部進行操作實現的。

緩衝首部包括設備號、設備上的數據塊號(塊設備時)、互斥標識位以及緩衝佇列連線指針和緩衝器號等。

緩衝首部 緩衝首部

系統把各緩衝區按其使用狀況連成三種佇列:

(1) 空白緩衝佇列em,其隊首指針為F(em),隊尾指針為L(em);

(2) 裝滿輸入數據的輸入緩衝佇列in,其隊首指針為F(in),隊尾指針為L(in);

(3) 裝滿輸出數據的輸出緩衝佇列out,其隊首指針為F(out),隊尾指針為L(out)。

緩衝區佇列 緩衝區佇列

另外,在緩衝池中還具有四種工作緩衝區:

(1) 用於收容輸入數據的工作緩衝區(hin);

(2) 用於提取輸入數據的工作緩衝區(sin);

(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中。

相關詞條

相關搜尋

熱門詞條

聯絡我們