在現代OS中,幾乎所有的I/O設備在與處理機(內存)交換數據時,都使用了緩沖區。因
為提高I/O速度和設備的利用率,在很大程度上都需要借助于緩沖技術來實現。緩沖管理的主要
功能是組織好這些緩沖區,并提供獲得和釋放緩沖區的手段。
OS提供以下幾種緩沖形式:
緩沖的引入
在操作系統中,引入緩沖的主要原因,可歸納為以下三點:
緩和CPU與I/O設備間速度不匹配的矛盾;
減少對CPU的中斷頻率,防寬對中斷響應時間的限制;
提高CPU和I/O設備之間的并行性;
△ 利用緩沖寄存器實現緩沖
單緩沖
單緩沖是OS提供的最簡單的一種緩沖形式。每當一個用戶進程發出一I/O請求時,操
作系統便在主存中為之分配一緩沖區,如下圖(a):
在塊設備輸入時,緩沖區用于暫存塊
設備輸入的一塊數據;
在字符設備輸入時,緩沖區用于暫存
用戶輸入的一行數據。
雙緩沖
為了加快輸入、輸出速度和提高設備利用率,又引入了雙緩沖工作方式,也稱為緩沖
對換(Buffer Swapping)方式。如下圖(b):
在設備輸入時,先將數據輸入第一緩
沖區,裝滿后便轉向第二緩沖區。
此時操作系統可從第一緩沖區中移出
數據送用戶進程區,接著由CPU對數據進
行計算。
如果我們在實現兩臺機器之間的通信時,僅為它們配置了單緩沖,如下圖(a):
為了實現雙向數據傳輸,必須在兩臺機器中都設置兩個緩沖區,分別用作發送和接收緩
沖區。如上圖(b):
循環緩沖
當輸入、輸出或生產者--消費者的速度相差甚遠時,雙緩沖的效果則不夠理想,但可
以增加緩沖區數量而使情況有所改善。因此,引入了多緩沖,并將多緩沖組織成循環緩沖形
式。如下圖(c):
循環緩沖的組成
多個緩沖區
在循環緩沖中含有多個緩沖區,每個緩沖區的大小相同。緩沖區可分成三種類型:
空緩沖區R;
已裝滿數據的緩沖區G;
現行工作緩沖區C;
多個指針
Nextg----指示計算進程下一個可用的緩沖區G;
Nexti----指示輸入進程下次可用的空緩沖區R;
Current----指示計算進程正在使用的緩沖區單元。
循環緩沖的組成如下圖:
緩沖區的使用
計算進程和輸入進程可利用下述兩個過程來使用循環緩沖區:
Getbuf過程
Releasebuf過程
進程同步
使用輸入緩沖可使輸入進程和計算進程并行執行。相應地,指針Nexti和Nexitg將不
斷地沿順時針方向移動,這樣就可能出現下述兩種情況:
Nexti 指針追趕上Nextg 指針
Nextg 指針追趕上Nexti 指針
緩沖池
上述的循環緩沖屬專用緩沖。當系統較大時,為了提高緩沖區的利用率,目前廣泛流
行公用緩沖池,池中的緩沖區可供多個進程共享。
緩沖池(Buffer Pool)的組成
對于既可用于輸入和輸出的公用緩沖區,至少應含有以下三種類型的緩沖區:
空(閑)緩沖區; 裝滿輸入數據的緩沖區; 裝滿輸出數據的緩沖區;
為了管理上的方便,可將相同類型的緩沖區鏈成一個隊列,形成以下三個隊列:
空緩沖隊列emq;
輸入隊列inq;
輸出隊列outq;
除了上述三種(個)隊列外,還應具有四種工作緩沖區:
用于收容輸入數據的工作緩沖區;
用于提取輸入數據的工作緩沖區;
用于收容輸出數據的工作緩沖區;
用于提取輸出數據的工作緩沖區;
Getbuf過程和Putbuf過程
為使諸進程能互斥地和同步地訪問緩沖池隊列,可分別為每一隊列設置一個互斥信號
量MS(type)和資源信號量RS(type),過程描述如下:
緩沖區的工作方式
緩沖區可以工作在收容輸入、提取輸入、收容輸出、提取輸出四種工作方式下,如下
圖: