本章討論了塊裝置 i/o 和緩衝區管理;解釋了塊裝置 i/o 的原理和 i/o 緩衝的優點;論述了 unix 的緩衝區管理演算法。
塊裝置i/o緩衝區
i/o 緩衝的基本原理非常簡單。檔案系統使用一系列 i/o 緩衝區作為塊裝置的快取記憶體。當程序試圖讀取 (dev, blk) 標識的磁碟塊時,它首先在緩衝區快取中搜尋分配給磁碟塊的緩衝區。如果該緩衝區存在並且包含有效資料,那麼它只需從緩衝區中讀取資料,而無須再次從磁碟中讀取資料塊。如果該綏沖區不存在,它會為磁碟塊分配乙個緩衝區,將資料從磁碟讀入緩衝區,然後從緩衝區讀取資料。當某個塊被讀入時,該緩衝區將被儲存在緩衝區快取中,以供任意程序對同乙個塊的下一次讀/寫請求使用。同樣,當程序寫入磁碟塊時,它首先會獲取乙個分配給該塊的緩衝區。然後,它將資料寫入綏沖區,將緩衝區標記為臟,以延遲寫入,並將其釋放到緩衝區快取中。由於髒緩衝區包含有效的資料,因此可以使用它來滿足對同一塊的後續讀/寫請求,而不會引起實際磁碟i/o。髒緩衝區只有在被重新分配到不同的塊時才會寫入磁碟。
unix i/o緩衝區管理演算法
i/o 緩衝區:核心中的一系列nbuf緩衝區用作緩衝區快取。每個緩衝區用乙個結構體表示。緩衝區結構體由兩部分組成; 用於緩衝區管理的緩衝頭部分和用於資料塊的資料部分。為了保護核心記憶體, 狀態字段可以定義為乙個位向扭, 其中每個位表示乙個唯一的狀態條件。
裝置表:每個塊裝置用乙個裝置表結構表示。
緩衝區初始化: 當系統啟動時 , 所有i/o緩衝區都在空閒列表中, 所有裝置列表和i/o佇列均為空。
緩衝區列表: 當緩衝區分配給 (dev, blk) 時, 它會被插人裝置表的dev_list 中。 如果緩衝區當前正在使用, 則會將其標記為busy (繁忙)並從空閒列表中刪除。繁忙緩衝區也可能會在裝置表的 i/o 佇列中。 由於乙個緩衝區不能同時處於空閒狀態和繁忙狀態, 所以可通過使用相同的 next_free 指標來維護裝置 i/o 佇列。 當緩衝區不再繁忙時, 它會被釋放回空閒列表, 但仍保留在 dev_list 中, 以便可能重用。 只有在重新分配時, 緩衝區才可能從乙個 dev_list 更改到另乙個 dev_list 中。 如前文所述, 讀/寫磁碟塊可以表示為 bread 、 bwrite 和dwrite, 它們都要依賴於 getblk 和 brelse。 因此, getblk 和 brelse 構成了 unix 緩衝區管理方案的核心。
unix演算法的一些具體說明
資料一致性:為了確保資料-致性,getblk一定不能給同乙個(dev,blk)分配多個緩衝區。這可以通過讓程序從休眠狀態喚醒後再次執行「重試迴圈」來實現。讀者可以驗證分配的每個緩衝區都是唯一的。其次,髒緩衝區在重新分配之前被寫出來,這保證了資料的一致性。
快取效果:快取效果可通過以下方法實現。釋放的緩衝區保留在裝置列表中,以便可能重用。標記為延遲寫入的緩衝區不會立即產生i/o、並且可以重用。緩衝區會被釋放到空閒列表的末尾,但分配是從空閒列表的前面開始的。這是基於lru(最近最少使用)原則, 它有助於延長所分配緩衝區的使用期,從而提高它們的快取效果。
臨界區:裝置中斷處理程式可操作緩衝區列表,例如從裝置表的i/o佇列中刪除 bp. 更改其狀態並呼叫brelse(bp)。所以,在getblk和brelse中,裝置中斷在這些臨界區中會被遮蔽。這些都是隱含的,但沒有在演算法中表現出來。
unix演算法的缺點
雖然unix演算法非常簡單和簡潔.但它也有以下缺點。
效率低下:該演算法依賴於重試迴圈。例如,釋放緩衝區可能會喚醒兩組程序:需要釋放的緩衝區的程序,以及只需要空閒緩衝區的程序。由於只有乙個程序可以獲取釋放的緩衝區,所以,其他所有被喚醒的程序必須重新進入休眠狀態。從休眠狀態喚醒後,每個被喚醒的程序必須從頭開始重新執行演算法,因為所需的緩衝區可能已經存在。這會導致過多的程序切換。
快取效果不可預知:在unix演算法中,每個釋放的緩衝區都可被獲取。如果緩衝區由需要空閒綏沖區的程序獲取,那麼將會重新分配緩衝區.即使有些程序仍然需要當前的緩衝區。
可能會出現飢餓:unix演算法基於「自由經濟」原則,即每個程序都有嘗試的機會,但不能保證成功。因此,可能會出現程序飢餓。
該演算法使用只適用於單處理器系統的休眠/喚醒操作。
《Unix Linux系統程式設計》第十三章學習筆記
本章論述了tcp ip 和網路程式設計,分為兩個部分。第一部分論述了tcp ip協議及其應用,具體包括 tcp ip 棧 ip位址 主機名 dns ip資料報和路由器 介紹了tcp ip 網路中的udp和 tcp 協議 埠號和資料流 闡述了伺服器 客戶機計算模型和套接字程式設計介面 通過使用udp和...
《Unix Linux系統程式設計》第六章學習筆記
本章講述了訊號和訊號處理 介紹了訊號和中斷的統一處理,有助於從正確的角度看待訊號 將訊號視為程序中斷,將程序從正常執行轉移到訊號處理 解釋了訊號的 包括來自硬體 異常和其他程序的訊號 然後舉例說明了訊號在unix linux 中的常見用法 詳細解釋了 unix linux 中的訊號處理,包括訊號型別...
Linux系統程式設計(十)exec 族函式
exec函式族的作用是根據指定的檔名找到可執行檔案,並用它來取代呼叫程序的內容,換句話說,就是在呼叫程序內部執行乙個可執行檔案。exec函式族的函式執行成功後不會返回,因為呼叫程序的實體,包括 段,資料 段和堆疊等都已經被新的內容取代,只留下程序 id 等一些表面上的資訊仍保持原樣,頗有些神似 三十...