檔案系統使用一系列i/o緩衝區作為塊裝置的快取記憶體。當程序試圖讀取(dev,blk)標識的磁碟塊時,他首先在緩衝區快取中搜尋分配給磁碟塊的緩衝區。如果緩衝區中存在並且包含有效資料,那麼它只需要從緩衝區中讀取資料,而無需再次從磁碟中讀取資料塊。如果該緩衝區不存在,他會為磁碟塊分配乙個緩衝區,將資料從磁碟讀入到緩衝區,然後從緩衝區讀取資料。
當程序寫入磁碟塊時,他首先會獲取乙個分配給該塊的緩衝區。然後將資料寫入緩衝區,將緩衝區標記為臟,以延遲寫入,並將起釋放到緩衝區快取中,並將其釋放到緩衝區快取中。
在read_file/write_file中,假設他從記憶體中的乙個專用緩衝區進行讀寫。假設buffer是緩衝區的結構型別,而且getblk(dev,blk)從緩衝區快取中飛配乙個指定給(dev,blk)的緩衝區。定義乙個bread函式,他會返回乙個包含有效資料的緩衝區:
buffer *bread(dev,blk) // return a buffer containing valid data
// get a buffer for (dev,blk) if (bp data valid)
return bp;
bp->opcode = read; // issue read operation
start_lo(bp): // ntart i/o on device
wait for i/o completion;
}
從緩衝區讀取資料後,程序通過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
i/o緩衝區:核心中的一系列nbuf緩衝區用作緩衝區快取。每個緩衝區用乙個結構體表示。
typdef struct buf buffer;
裝置表:每個塊裝置用乙個裝置表結構表示。
緩衝區初始化:當系統啟動時,所有i/o緩衝區都在空閒列表中,所有裝置列表和t/o佇列均為空。
緩衝區列表:當緩衝區分配給(dev,blk)時,它會被插入裝置表的dev_list中。如果緩衝區當前正在使用,則會將其標記為busy(繁忙)並從空閒列表中刪除。
unix getblk/brelse演算法:
unix演算法的缺點:
(1)效率低下:該演算法依賴於重試迴圈,例如,釋放緩衝區可能會喚醒兩組程序:需要釋放的緩衝區的程序,以及只需要空閒緩衝區的程序。由於只有乙個程序可以獲取釋放的緩 沖區,所以,其他所有被喚醒的程序必須重新進入休眠狀態。從休眠狀態喚醒後,每個被喚 醒的程序必須從頭開始重新執行演算法,因為所需的緩衝區可能已經存在。這會導致過多的進 程切換。
(2)快取效果不可預知:在unix演算法中,每個釋放的緩衝區都可被獲取'如果緩衝區 由需要空閒緩衝區的程序獲取,那麼將會重新分配緩衝區,即使有些程序仍然需要當前的緩衝區。
(3)可能會出現飢餓:unix演算法基於「自由經濟」原則,即每個程序都有嘗試的機會,但不能保證成功,因此,可能會出現程序飢餓
(4)該演算法使用只適用丁單處理器系統的休眠/喚醒操作
buffer *getb1k(dev,blk):
while(1)(10).enter bp into(tail of) freelist;v(bp);v(free);
}
證明pv演算法正確性:
(1)緩衝區唯一性
(2)無重試迴圈
(3)無不必要喚醒
(4)快取效果
(5)無死鎖和飢餓
第十二章學習筆記
塊裝置將資訊儲存在固定大小的塊中,每個塊都有自己的位址。對作業系統來說,塊裝置是以字元裝置的外觀展現的,雖然對這種字元裝置可以按照位元組為單位進行訪問,但是實際上到塊裝置上卻是以塊為單位 最小512byte,既乙個扇區 這之間的轉換是由作業系統來完成的。扇區 磁碟碟片上的扇形區域,邏輯化資料,方便管...
C Primer Plus 第十二章筆記
1.呼叫複製建構函式 當函式按值傳遞物件或函式返回物件時,都將使用複製建構函式。2.如果類中包含了使用new初始化的指標成員,應當定義乙個複製建構函式,以複製指向的資料,而不是指標,稱為深度賦值。複製的另一種形式只是複製指標值,僅淺淺地複製指標資訊,稱為淺複製。3.將已有的物件賦給另乙個物件時,將使...
Objective C學習筆記第十二章類別
第十二章類別 利用objective c的動態執行時分配機制,可以為現有的類新增新方法,這種為現有的類新增新方法的方式稱為類別catagory,他可以為任何類新增新的方法,包括那些沒有源 的類 類別使得無需建立物件類的子類就能完成同樣的工作 一 建立類別 1 宣告類別 宣告類別與宣告類的形式很相似 ...