数据缓冲区高速缓冲
數(shù)據(jù)緩沖區(qū)高速緩沖
緩沖頭部
一個(gè)緩沖區(qū)有兩部分組成:一個(gè)含有磁盤(pán)上數(shù)據(jù)的存儲(chǔ)數(shù)組和一個(gè)標(biāo)識(shí)該緩
沖區(qū)的緩沖頭部。
一個(gè)緩沖區(qū)的數(shù)據(jù)與文件系統(tǒng)上一個(gè)邏輯磁盤(pán)塊中的數(shù)據(jù)相對(duì)應(yīng),并且通過(guò)
考察緩沖頭部中的標(biāo)識(shí)字段來(lái)識(shí)別緩沖區(qū)內(nèi)容。緩沖區(qū)是磁盤(pán)塊在主存中的拷貝,
磁盤(pán)塊的內(nèi)容映射到緩沖區(qū)中。但是同一時(shí)刻,一個(gè)磁盤(pán)塊不能映射到多個(gè)緩沖
區(qū)中。
設(shè)備號(hào)字段和塊號(hào)字段指明了文件系統(tǒng)和磁盤(pán)上數(shù)據(jù)的塊號(hào),唯一地標(biāo)識(shí)了
該緩沖區(qū)。設(shè)備號(hào)是邏輯文件系統(tǒng)號(hào),不是物理設(shè)備號(hào)。緩沖區(qū)的數(shù)據(jù)部分必須
大于等于磁盤(pán)塊的大小。
緩沖區(qū)的狀態(tài)是有下列條件的組合:
1)緩沖區(qū)當(dāng)前為“上鎖”(忙)
2)緩沖區(qū)包含有效數(shù)據(jù)
3)內(nèi)核把某緩沖區(qū)重新分配出去之前必須把該緩沖區(qū)內(nèi)容寫(xiě)到磁盤(pán)上(延遲寫(xiě))
4)內(nèi)核當(dāng)前正從磁盤(pán)往緩沖區(qū)讀信息或把緩沖區(qū)的內(nèi)容寫(xiě)到磁盤(pán)上
5)一個(gè)進(jìn)程當(dāng)前正在等候緩沖區(qū)變?yōu)殚e。
緩沖池
內(nèi)核按照最近最少使用算法把數(shù)據(jù)緩存于緩沖池中,內(nèi)核維護(hù)一個(gè)緩沖區(qū)的
空閑表(雙向鏈表),它保存最近被使用的次序。離空閑表最近的緩沖區(qū)比離空
閑表頭遠(yuǎn)的緩沖區(qū)是最近最少使用的。
散列隊(duì)列
內(nèi)核把緩沖區(qū)組織成一個(gè)個(gè)隊(duì)列,這些隊(duì)列是按照設(shè)備號(hào)和塊號(hào)散列的。內(nèi)
核把一個(gè)散列隊(duì)列上的緩沖區(qū)鏈接成一個(gè)個(gè)類(lèi)似空閑表結(jié)構(gòu)的雙向鏈接循環(huán)表,
內(nèi)核使用的散列函數(shù)也是簡(jiǎn)單的,這樣保證性能。
一個(gè)緩沖區(qū)必須在散列隊(duì)列里面,也可以在空閑表中。
緩沖區(qū)的檢索
若果一個(gè)進(jìn)程想要都一個(gè)文件中的數(shù)據(jù),則內(nèi)核需要判定數(shù)據(jù)在哪個(gè)文件系統(tǒng)
的哪個(gè)塊上。當(dāng)要從一個(gè)特定的磁盤(pán)上讀取數(shù)據(jù)時(shí),內(nèi)核檢測(cè)數(shù)據(jù)是否在緩沖區(qū)上,
若是在就直接可以從緩沖區(qū)上讀取數(shù)據(jù);否則,分一個(gè)空閑緩沖區(qū)。
讀寫(xiě)磁盤(pán)塊--算法getblk
內(nèi)核給緩沖區(qū)分配磁盤(pán)塊時(shí),可能出現(xiàn)五種情況:
1)內(nèi)核在散列隊(duì)列找到該塊,并且它的緩沖區(qū)是空閑的
2)內(nèi)核在散列隊(duì)列中找不到該塊,因此,從空閑表中分配一個(gè)緩沖區(qū)
3)內(nèi)核在散列隊(duì)列中找不到該塊,試圖從空閑表中分配一個(gè)緩沖區(qū)的時(shí)候,
在空閑表中找到一個(gè)已經(jīng)表上“延遲寫(xiě)”標(biāo)記的緩沖區(qū)。內(nèi)核必須該緩沖區(qū)的
內(nèi)容寫(xiě)到磁盤(pán)上,并分配另外一個(gè)緩沖區(qū)。
4)內(nèi)核在散列隊(duì)列中找不到該塊,并且空閑表已空。
5)內(nèi)核在散列隊(duì)列中找到該塊,但是它的緩沖區(qū)為忙。
算法:getblk 輸入:文件系統(tǒng)號(hào) 塊號(hào) 輸出:現(xiàn)在能被磁盤(pán)塊使用的上了鎖的緩沖區(qū) {while(沒(méi)有找到緩沖區(qū)){if(塊在散列隊(duì)列中){if(塊忙){/*第5種情況*/sleep(等待“緩沖區(qū)變?yōu)榭臻e”事件);continue;}為緩沖區(qū)標(biāo)記上“忙”;從空閑表中摘下緩沖區(qū);return (緩沖區(qū));}else{if(空閑表中沒(méi)有緩沖區(qū)){/*第4種情況*/sleep(等待“任何緩沖區(qū)變?yōu)榭臻e”事件);continue;}從空閑表中摘下緩沖區(qū);if(緩沖區(qū)標(biāo)記著延遲寫(xiě)){/*第3種情況*/把緩沖區(qū)異步寫(xiě)到磁盤(pán)上;continue;}從舊散列隊(duì)列中摘下緩沖區(qū);把緩沖區(qū)投入新散列隊(duì)列;return (緩沖區(qū));}} }
釋放緩沖區(qū)算法brelse
算法:brelse 輸入:上鎖態(tài)的緩沖區(qū) 輸出:無(wú) {喚醒正在等待緩沖區(qū)變?yōu)榭臻e的所有進(jìn)程;喚醒正在等待任何緩沖區(qū)變?yōu)榭臻e的所有進(jìn)程;提高處理機(jī)執(zhí)行級(jí)以封鎖中斷;if(緩沖區(qū)所有內(nèi)容有效且緩沖區(qū)非舊)將緩沖區(qū)送入空閑表尾部else將緩沖區(qū)送入空閑表頭部降低處理機(jī)執(zhí)行級(jí)以允許中斷;給緩沖區(qū)解鎖;}
情況1:內(nèi)核搜索塊4的實(shí)例圖
? ? ? ?圖--在散列隊(duì)列上搜索塊4
? ? ? ? 圖--從空閑表上摘下第4塊
情況2:從緩沖區(qū)上找第21塊
圖--在緩沖區(qū)上搜索第21塊
圖--從空閑表中摘下第一個(gè)緩沖區(qū),分配給第21塊
重新給該塊的緩沖區(qū)安置在相應(yīng)的散列隊(duì)列里面。
情況3:內(nèi)核必須從空閑表中分配到一個(gè)緩沖區(qū)。
從空閑表中摘下的緩沖區(qū)已經(jīng)被標(biāo)上“延遲寫(xiě)”,因此,它必須在使用該緩沖區(qū)之前,
將緩沖區(qū)的內(nèi)容寫(xiě)到磁盤(pán)上。內(nèi)核開(kāi)始了一個(gè)異步寫(xiě),并且試圖從空閑表上分配到
另外一個(gè)緩沖區(qū)。當(dāng)異步寫(xiě)完成時(shí),內(nèi)核把該緩沖區(qū)釋放,并把它放到空閑表的首部。
? ? ? ? 圖-- 搜索第21塊,空閑表上頭兩個(gè)緩沖區(qū)標(biāo)記著延遲寫(xiě)
圖--寫(xiě)第3塊、第5塊,把第4塊的緩沖區(qū)分配該第21塊
情況4:散列隊(duì)列找不到該塊,并且空閑表為空
進(jìn)程A進(jìn)入睡眠狀態(tài),直到有另外一個(gè)進(jìn)程執(zhí)行算法brelse,釋放一個(gè)緩沖區(qū)。當(dāng)內(nèi)核
調(diào)度到進(jìn)程A時(shí),它必須重新為該塊重新搜索散列隊(duì)列,此舉保證僅有一個(gè)緩沖區(qū)包含
該塊。
情況5:進(jìn)程B等待進(jìn)程A正在使用的塊(忙),進(jìn)程B將進(jìn)入睡眠狀態(tài)
進(jìn)程A執(zhí)行算法brelse,釋放該緩沖區(qū),這時(shí)將喚醒”緩沖區(qū)變?yōu)榭臻e“上睡眠的所
有進(jìn)程,包括進(jìn)程B。當(dāng)內(nèi)核調(diào)度到進(jìn)程B執(zhí)行時(shí),進(jìn)程B需要再次搜索該磁盤(pán)塊。
總結(jié)
- 上一篇: Vectorcast 2021 sp4
- 下一篇: C语言程序设计第五版谭浩强 第七章答案