塊設備緩沖區管理
盤塊緩沖區及其首部
盤塊緩沖池結構
盤塊緩沖區的分配
() getblk( )過程
該過程用於從空閒緩沖區隊列中獲得任一空閒緩沖區該過程首先檢查空閒塊緩沖隊列是否為空若空便調用sleep過程睡眠等待直至在空閒塊緩沖隊列中出現空閒緩沖區為止否則從空閒塊緩沖隊列中摘下第一個緩沖區若在其緩沖首部中還有延遲寫標志則還須調用bdwrite過程將此緩沖區中的數據寫回到磁盤中再從空閒隊列中取得一個空緩沖區否則便將bflag中的b[CD*]busy標志置為 並返回指向該緩沖區的指針bp
() getblk(dev blkno)過程
該過程用於為指定設備dev和盤塊號為blkno的盤塊申請一個緩沖區核心首先檢查要讀入的盤塊內容是否已在某個緩沖區中若發現已在某緩沖區中便不再從磁盤上讀 否則核心須從磁盤上將數據讀入這時才需為其分配一個空緩沖區類似地當要把數據寫入一特定盤塊時核心先檢查該盤塊的內容是否已在某緩沖區僅當該塊的內容尚不在緩沖區中時才需調用getblk( )過程分配一個空緩沖區
盤塊緩沖區的回收
當核心用完某緩沖區時可調用brelse過程將之收回此前可能有些進程因等待使用該緩沖區而睡眠此時釋放者進程應將睡眠隊列的隊首進程喚醒此外還有可能有進程因空閒鏈表空而處於等待狀態同樣也應將之喚醒如果在所釋放的緩沖區中的數據是有效的為使以後在某進程需要它時也能直接從緩沖區中讀出而不必啟動磁盤的I/O操作可將該緩沖區鏈入空閒鏈表的末尾否則(緩沖區中數據無效)應將它鏈入空閒隊列的頭部空閒鏈表屬於臨界資源為了保證對它操作的互斥性UNIX系統通過提高處理機的運行級對中斷加以屏蔽的方法來實現
——返回教材目錄
了解更多計算機相關基礎課程視頻
From:http://tw.wingwit.com/Article/program/czxt/201311/24272.html