檔案系統使用一系列i/o緩衝區作為塊裝置的快取記憶體。當程序試圖讀取(dev, blk)標識的磁碟塊時,它首先在緩衝區快取中搜尋分配給磁碟塊的緩衝區。如果該緩衝區存在並且包含有效資料,那麼它只需從緩衝區中讀取資料,而無須再次從磁碟中讀取資料塊。
大多數檔案系統使用i/o緩衝來減少進出儲存裝置的物理i/o數量一合理設計的i/o緩衝方案可顯著提高檔案i/o效率並增加系統吞吐量。
檔案系統使用一系列io緩衝區作為塊裝置的快取記憶體。當程序試圖讀取(dev,blk)標識的磁碟塊時,它首先在緩衝區快取中搜尋分配給磁碟塊的緩衝區。如果該緩衝區存在並且包含有效資料,那麼它只需從緩衝區中讀取資料,而無須再次從磁碟中讀取資料塊。如果該緩衝區不存在,它會為磁碟塊分配乙個緩衝區,將資料從磁碟讀入緩衝區,然後從緩衝區讀取資料。當某個塊被讀入時,該緩衝區將被儲存在緩衝區快取中,以供任意程序對同乙個塊的下一次讀/寫請求使用。同樣,當程序寫入磁碟塊時,它首先會獲取乙個分配給該塊的緩衝區。然後,它將資料寫入緩衝區,將緩衝區標記為臟,以延遲寫人,並將其釋放到緩衝區快取中。由於髒緩衝區包含有效的資料,因此可以使用它來滿足對同一塊的後續讀/寫請求,而不會引起實際磁碟l/o。髒緩衝區只有在被重新分配到不同的塊時才會寫入磁碟。
定義乙個bread(dev, blk)函式,它會返回乙個包含有效資料的緩衝區(指標)。
buffer *bread(dev,blk)
// get a buffer for (dev,blk) if (bp data valid)
return bp;
bp->opcode = read; ii issue read operation
start_lo(bp): // ntart i/o on device
wait for i/o completion
write_block(devf blk, data)
bwrite(buffer *bp)( bp->opcode = write; start_io(bp); wait for i/o completion; brelse(bp); // release bp
buffer *bp = bread(dev,blk); // read in the disk block first
write data to bp;
(synchronous write)? bwrite(bp) : dwrite(bp);
從緩衝區讀取資料後,程序通過brelse(hp)格緩衝區釋放回緩衝區快取。同理,定義乙個 write_block(dev, blk, data)函式:
write_block(devf blk, data)
buffer *bp = bread(dev,blk); // read in the disk block first
write data to bp;
(synchronous write)? bwrite(bp) : dwrite(bp);
bwrite(buffer *bp)( bp->opcode = write; start_io(bp);
wait for i/o completion;
brelse(bp); // release bp
dwrite(buffer *bp)( mark bp dirty for delay_write;
brelse(bp); // release bp
unix演算法的缺點:
效率低下:該演算法依賴於重試迴圈,例如,釋放緩衝區可能會喚醒兩組程序:需要釋放的緩衝區的程序,以及只需要空閒緩衝區的程序。由於只有乙個程序可以獲取釋放的緩衝區,所以,其他所有被喚醒的程序必須重新進入休眠狀態。從休眠狀態喚醒後,每個被喚醒的程序必須從頭開始重新執行演算法,因為所需的緩衝區可能已經存在。這會導致過多的程序切換。
快取效果不可預知:在unix演算法中,每個釋放的緩衝區都可被獲取'如果緩衝區 由需要空閒緩衝區的程序獲取,那麼將會重新分配緩衝區,即使有些程序仍然需要當前的緩衝區。
可能會出現飢餓:unix演算法基於「自由經濟」原則,即每個程序都有嘗試的機會,但不能保證成功,因此,可能會出現程序飢餓。
該演算法使用只適用丁單處理器系統的休眠/喚醒操作。
typdef struct buf buffer;
buffer buf[nbuf], *freelist; // nbuf buffers and free buffer list
(1)效率低下:該演算法依賴於重試迴圈,例如,釋放緩衝區可能會喚醒兩組程序:需要釋放的緩衝區的程序,以及只需要空閒緩衝區的程序。由於只有乙個程序可以獲取釋放的緩衝區,所以,其他所有被喚醒的程序必須重新進入休眠狀態。從休眠狀態喚醒後,每個被喚醒的程序必須從頭開始重新執行演算法,因為所需的緩衝區可能已經存在。這會導致過多的程序切換。
(2)快取效果不可預知:在unix演算法中,每個釋放的緩衝區都可被獲取'如果緩衝區 由需要空閒緩衝區的程序獲取,那麼將會重新分配緩衝區,即使有些程序仍然需要當前的緩衝區。
(3)可能會出現飢餓:unix演算法基於「自由經濟」原則,即每個程序都有嘗試的機會,但不能保證成功,因此,可能會出現程序飢餓。
(4)該演算法使用只適用丁單處理器系統的休眠/喚醒操作。
使用訊號量的緩衝區管理演算法
假設有乙個單處理器核心(一次執行乙個程序)。使用計數訊號量上的p/v來設計滿足以下要求的新的緩衝區管理演算法:
(1)保證資料一致性
(2)良好的快取效果
(3)高效率:沒有重試迴圈,沒有不必要的程序「喚醒」
(4)無死鎖和飢餓
buffer *getb1k(dev,blk):
while(1)(10).enter bp into(tail of) freelist;v(bp);v(free);
}
**具體展示#include #include #include int main ()
return 0;
}
C Prinmer Plus筆記第1 2章
超簡潔版 大一學過了現在大三上課被老師dissc語言基礎不紮實 再加上看了大佬們寫的遊戲開發面試題 決定重新從頭學一遍c語言 高效 可移植 強大而靈活 面向程式設計師 使用c語言的7個步驟 1.定義程式的目標 2.設計程式 3.編寫 4.編譯 5.執行程式 6.測試和除錯程式 7.維護和修改程式 鏈...
TCP IP學習筆記 卷1 第12章
多播和廣播僅用於udp tcp是面向連線的 多播 將資料幀傳給同一網路上的多播組內的多個主機 廣播 將資料幀傳給同一網路上的所有主機。網絡卡判斷目的位址為網絡卡實體地址或廣播 多播位址的幀,傳送給驅動程式 多播的出現減少了對應用不感興趣主機的處理負荷。廣播 應用對廣播的支援情況 ping 設計上的緣...
Qt快速入門 學習筆記 第1,2章
建立初始helloworld專案專案名和路徑都不能出現中文。文字模式寫入main.cpp qtextcodec setcodecfortr qtextcodec codecforlocal 提供文字碼轉換功能,否則中文將是亂碼 qtextcodec codecforlocal使用系統指定字符集可更改...