與記憶體訪問相比,磁碟i/o速度較慢,所以不希望在每次執行讀寫檔案操作時都執行磁碟i/o。因此,大多數檔案系統使用i/o緩衝來減少進出儲存裝置的物理i/o數量
i/o緩衝的基本原理:
物理塊裝置i/o :每個裝置都有乙個i/o佇列,其中包含等待i/o操作的緩衝區。
unix緩衝區管理子系統由以下幾部分組成
核心中的一系列nbuf緩衝區用作緩衝區快取。每個緩衝區用乙個結構體表示。緩衝區結構體由兩部分組成:用於緩衝區管理的緩衝頭部分和用於資料塊的資料部分。
每個塊裝置用乙個裝置表結構表示.每個裝置表都有乙個dev_list,包含當前分配給該裝置的i/o緩衝區,還有乙個io_ queue,包含裝置上等待i/o操作的緩衝區。i/o佇列的組織方式應確保最佳i/o操作。
當系統啟動時,所有i/o緩衝區都在空閒列表中,所有裝置列表和i/o佇列均為空。
當緩衝區分配給(dev, blk)時,它會被插入裝置表的dev_list中.
getblk和brelse構成了unix緩衝區管理方案的核心
優點:簡潔
缺點:pv演算法:
自學的時候不太了解pv演算法,搞不懂是幹嘛的
通過對書上知識點的消化,我發現這個pv演算法和作業系統中的pv原語很像。
pv兩個字母是荷蘭文 passeren(通過),vrijgeven(釋放)的簡稱。pv操作與訊號量的處理相關,p表示通過的意思,v表示釋放的意思。所謂訊號量,實際上就是用來控制程序狀態的乙個代表某一資源的儲存單元。例如,p1和p2是分別將資料送入緩衝b和從緩衝b讀出資料的兩個程序,為了防止這兩個程序併發時產生錯誤,狄克斯特拉設計了一種同步機制叫「pv操作」,p操作和v操作是執行時不被打斷的兩個作業系統原語。執行p操作p(s)時訊號量s的值減1,若結果不為負則p(s)執行完畢,否則執行p操作的程序暫停以等待釋放。執行v 操作v(s)時,s的值加1,若結果不大於0則釋放乙個因執行p(s)而等待的程序。對p1和p2可定義兩個訊號量s1和s2,初值分別為1和0。程序p1在向緩衝b送入資料前執行p操作p(s1),在送入資料後執行v操作v(s2)。程序p2在從緩衝b讀取資料前先執行p操作p(s2),在讀出資料後執行v操作v(s1)。當p1往緩衝b送入一資料後訊號量s1之值變為0,在該資料讀出後s1之值才又變為1,因此在前一數未讀出前後一數不會送入,從而保證了p1和p2之間的同步。pv操作屬於程序的低階通訊。
p、v原語的具體操作如下:
p(s)
將訊號量s的值減1,即s=s-1;如果s≥0,則該程序繼續執行;否則該程序置為等待狀態,排入等待佇列。
v(s)
將訊號量s的值加1,即s=s+1;如果s>0,則該程序繼續執行;否則釋放佇列中第乙個等待訊號量的程序。
還有乙個比較易混淆的東西就是互斥和同步,那麼他們兩個又有什麼區別?
互斥:(一般來說是兩個程序間或程序內對同一資源(會訪問臨界資源),不能同時進行,就用互斥)
⑴每個程式中使用者實現互斥的p、v操作必須成對出現,先做p操作,進臨界區,後做v操作,出臨界區。若有多個分支,要認真檢查其成對性。
⑵p、v操作應分別緊靠臨界區的頭尾部,臨界區的**應盡可能短,不能有死迴圈。
⑶互斥訊號量的初值一般為1。
同步:(兩個程序間,可以同時進行,但有共享資源,兩者需要競爭(需要等待,必須有個執行先後順序)就用同步,其實就是基本思想,所以說互斥就特殊的同步)
(1)、同步訊號量一般不出現在同一程序中。
(2)、同步的p操作應出現在互斥的p操作前。
關於pv操作有乙個經典問題,就是
生產者-消費者問題
經過分析可以得出以下演算法,可以看出運用的就是pv演算法
自學完這一章最大的感悟是要學會進行聯想,當遇到不懂的知識的時候,要學會把別的科目的知識拿出來輔助理解。再乙個就是腦子要靈活,作業系統也學了很久了,以前一直沒把這兩門課聯絡在一起,現在想想linux學起來不過也就是乙個作業系統罷了,雖然和windows不一樣,但是抽象起來都是乙個模式,以前學的程序和執行緒、同步等知識在作業系統課上都學過,只是一直沒有意識把兩門課放到一起學。在以後我還要多多培養這方面的能力,學一門課有不止一門課的收穫,做到事半功倍。
資訊保安系統設計與實現 第十二章學習筆記
20191331 lyx 學習理解塊裝置i o和緩衝區管理 理解塊裝置i o的原理和i o緩衝的優點 討論unix的緩衝區管理演算法 掌握pv演算法,通過程式設計專案更好的理解檔案系統中的i o操作。什麼是塊裝置 塊裝置是i o裝置中的一類,是將資訊儲存在固定大小的塊中,每個塊都有自己的位址,還可以...
資訊保安系統設計基礎 第9周學習筆記
對同乙個描述符,可以任意交錯地呼叫rio readn和rio writen。乙個問本行的末尾都有乙個換行 符,那麼像讀取乙個文字中的行數怎麼辦,使用read讀取換行符這個方法不是很妥當,可以呼叫乙個包裝函式 rio readineb 它從乙個內部讀緩衝區拷貝乙個文字行,當緩衝區為空時,會自動地呼叫r...
Linux設計與實現學習筆記
從第三章開始吧,前面都是overview的介紹 第三章 程序管理 程序的概念 處於執行期的程式 其他占用的資源 開啟的檔案,掛起的訊號.linux中線程是一種特殊的程序,區別於其他系統。fork exec exit 程序描述符及任務結構 每個程序對應乙個資料結構 task struct,稱為程序描述...