一篇講解緩沖區(qū)管理
在現(xiàn)代操作系統(tǒng)中,幾乎所有的I/O設(shè)備在與處理機(jī)交換數(shù)據(jù)時(shí)都用了緩沖區(qū)。
緩沖的引入 引入緩沖區(qū)的原因有很多,可歸結(jié)為以下幾點(diǎn):
(1) 緩和CPU與I/O設(shè)備間速度不匹配的矛盾。
(2) 減少對(duì)CPU的中斷頻率,放寬對(duì)CPU中斷響應(yīng)時(shí)間的限制。
(3) 解決數(shù)據(jù)粒度不匹配的問題。
(4) 提高CPU和I/O設(shè)備之間的并行性。
單緩沖區(qū)和雙緩沖區(qū)
單緩沖區(qū)(Single Buffer)
在單緩沖情況下,每當(dāng)用戶進(jìn)程發(fā)出一I/O請(qǐng)求時(shí),操作系統(tǒng)便在主存中為之分配一緩沖區(qū),如圖所示。

雙緩沖區(qū)(Double Buffer)
緩沖區(qū)是共享資源,生產(chǎn)者與消費(fèi)者在使用緩沖區(qū)時(shí)必須互斥,故而需要設(shè)置了兩個(gè)緩沖區(qū)來提高效率。實(shí)現(xiàn)外部設(shè)備的并發(fā)。

如果在實(shí)現(xiàn)兩臺(tái)機(jī)器之間的通信時(shí)僅為它們配置了單緩沖,如圖(a)所示,那么,它們之間在任一時(shí)刻都只能實(shí)現(xiàn)單方向的數(shù)據(jù)傳輸。例如,只允許把數(shù)據(jù)從A傳送到B,或者從B傳送到A,而絕不允許雙方同時(shí)向?qū)Ψ桨l(fā)送數(shù)據(jù)。為了實(shí)現(xiàn)雙向數(shù)據(jù)傳輸,必須在兩臺(tái)機(jī)器中都設(shè)置兩個(gè)緩沖區(qū),一個(gè)用作發(fā)送緩沖區(qū),另一個(gè)用作接收緩沖區(qū),如圖(b)所示。

【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦!?。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ??


3.環(huán)形緩沖區(qū)
環(huán)形緩沖區(qū)的組成
(1) 多個(gè)緩沖區(qū)。在環(huán)形緩沖中包括多個(gè)緩沖區(qū),其每個(gè)緩沖區(qū)的大小相同 。作為輸入的多緩沖區(qū)可分為三種類型:用于裝輸入數(shù)據(jù)的空緩沖區(qū)R、已裝滿數(shù)據(jù)的緩沖區(qū)G以及計(jì)算進(jìn)程正在使用的現(xiàn)行工作緩沖區(qū)C,如圖所示。
進(jìn)程之間的同步問題
使用輸入循環(huán)緩沖,可使輸入進(jìn)程和計(jì)算進(jìn)程并行執(zhí)行。相應(yīng)地,指針Nexti和指針Nextg將不斷地沿著順時(shí)針方向移動(dòng),這樣就可能出現(xiàn)下述兩種情況:
(1) Nexti指針追趕上Nextg指針。
(2) Nextg指針追趕上Nexti指針。
緩沖池(Buffer Pool)
緩沖池的組成
緩沖池管理著多個(gè)緩沖區(qū),每個(gè)緩沖區(qū)由用于標(biāo)識(shí)和管理的緩沖首部以及用于存放數(shù)據(jù)的緩沖體兩部分組成。緩沖首部一般包括緩沖區(qū)號(hào)、設(shè)備號(hào)、設(shè)備上的數(shù)據(jù)塊號(hào)、同步信號(hào)量以及隊(duì)列鏈接指針等。為了管理上的方便,一般將緩沖池中具有相同類型的緩沖區(qū)鏈接成一個(gè)隊(duì)列,于是可形成以下三個(gè)隊(duì)列:
(1) 空白緩沖隊(duì)列emq。
(2) 輸入隊(duì)列inq。
(3) 輸出隊(duì)列outq。
緩沖區(qū)的工作方式
緩沖區(qū)可以工作在如下四種工作方式,如圖所示。

