1. 程式人生 > >現代作業系統之檔案系統(下)

現代作業系統之檔案系統(下)

檔案系統的管理和優化

磁碟空間管理

幾乎所有的檔案系統都把檔案分割成固定大小的塊來儲存,各塊之間不一定相鄰。 效能和空間利用率是矛盾的。 跟蹤空閒塊有兩種常用的方法——第一種方法是採用磁碟塊連結串列,那個塊中包含儘可能多的空閒磁碟號。通常情況下,次啊用空閒塊存放空閒表,這樣儲存器基本上是空的。 另一種方法是採取點陣圖,n個塊的磁碟需要n位點陣圖。 如果空閒塊傾向於成為一個長的連續分割的塊,則空心啊列表可以改成記錄分塊而不是單個的塊。 另一方面,如果磁碟產生很嚴重的碎片,記錄分塊會比記錄單獨的塊效率更低。 在空閒表方法中,只需要在記憶體中儲存一個指標塊。當檔案建立時,所需的塊從指標塊中讀出。現有的指標塊用完時,從磁碟中讀入新的指標跨。刪除時則將指標寫入記憶體的指標塊中。當塊滿時,就把它寫入磁碟。
當記憶體中指標塊快慢的時候,就寫入磁碟。這裡的思路是保持磁碟上大多數之真快為滿的狀態(減少磁碟使用),但是在記憶體中保留一個半滿的指標塊。這樣他可以及處理檔案的建立同時又處理檔案的刪除莋,而不會為空閒表進行磁碟IO。 (自)也就是說,記憶體中最多有一個指標塊,指標主要是在空閒塊中的。 在處理磁碟配額時,有一種方案通過兩張表實現。 當用戶開啟一個檔案時,系統找到檔案屬性和磁碟地址,並把他們送入記憶體中的開啟檔案表。 第二張表包含每個使用者當前開啟檔案的配額記錄,即使其他人開啟該檔案一樣。該表的內容是從被開啟檔案的所有者磁碟配額檔案中提u去出來的。當所有檔案關閉時,該記錄被協會配額檔案。 當在開啟檔案表中建立一新表項時(開啟一檔案),會產生一個指向所有者配額記錄的指標,以便很容易找到不同的限制。可以超過軟限制,但不可超過硬限制,硬限制會引發報錯。 當用戶試圖登陸,系統喝茶配額檔案,檢視該使用者檔案數目或磁碟塊數目是否超過軟限制,若超過,則警告計數減一i,若計數為0,則不再允許用固話登陸。要想再次登陸,就必須和系統管理員協商, 該方法由一種性質,只要該使用者在退出系統前消除超過部分,就可以在一次終端期間超過其軟限制。

檔案系統備份

合理的做法是隻備份特定目錄及其下全部檔案,而不是備份整個檔案系統(有些檔案無需拷貝,有些包括會出問題) 更好一點的做法自最近一次轉儲以來更改過的檔案。 對揮動檔案系統做備份是很難的。因為在轉出過程中新增,刪除煩修改檔案和目錄可能會導致檔案系統的不一致性。 人們修改了轉儲演算法,記下檔案系統的瞬時狀態,即複製關鍵的資料結構(類似於store) 轉儲硬碟到磁帶上有兩種方案:物理轉儲和邏輯轉你出。物理轉儲是從磁碟的第0塊開始,將全部的磁碟塊按序輸出到磁帶上,知道最後一塊複製完畢。此程式很簡單,可以保證萬無一失,這是其它任何實用程式所不能比的。 P168 如果磁碟控制器將所有壞塊重新對映,並對作業系統隱藏的話,物理轉儲工作還是能順利進行的。 物理儲存的有點是簡單,極快。缺點是不能跳過選定目錄,也無法增量轉儲,還不能滿足回覆個人檔案的請求。 邏輯轉儲從一個或幾個指定的目錄開始,遞迴得轉儲自其給定基準日期後有所更改的全部檔案和目錄。 該演算法還轉儲通向修改過的檔案或目錄的路徑上的所有目錄(包括未修改目錄),原因有二——一是為了將這些轉儲的檔案和目錄恢復到另一套計算機新檔案系統中,這樣嗎轉出程式和回覆程式可以進行檔案系統之間的整體轉移;第二個原因是可以對單個檔案進行增量回復。 邏輯轉出演算法要維持一個一i節點號為索引的點陣圖,每個i節點包含了幾位。首先檢查所有的目錄項,對每一個修改過的檔案,在點陣圖中標記其i節點。演算法還標記並遞迴檢查每一個目錄了第二階段再次遞迴遍歷目錄樹 ,斌去掉目錄樹中任何不包含被修改過的檔案或目錄的目錄上的標記。第三階段一節點號為序,掃描這些i節點並轉儲所有標記的目錄,為了進行回覆,每個目錄都用目錄屬性作為字首 最後,被標記的檔案也被轉儲,同樣由其檔案屬性作為字首。
從轉儲磁帶上回覆文件系統很容易辦到。首先要在磁碟上建立一個空的檔案系統,然後回覆最近一次的完整轉儲,由於磁帶上最先出現目錄嘛所以首先回複目錄,給出檔案系統的框架;然後回覆檔案本身。在完成轉儲之後的是增量轉儲,重複這一過程,以此類推。 UNIX檔案實際上包含很多空洞(開啟檔案,寫幾個位元組,進行便宜,在寫入位元組,偏移部分泵式檔案的一部分,不應該被轉儲和恢復)


檔案系統的一致性

影響檔案系統可靠性的另一個問題是檔案系統的一致性,很多檔案系統讀取磁碟塊,進行修改後,再寫回磁碟。如果在修改過的磁碟塊全部寫回之前系統崩潰,則檔案系統可能處於一個不一致的狀態,如果一些未被寫回的塊是i節點,目錄塊或是包含有空閒表的塊,問題 會格外嚴重。 為了解決檔案系統的不一致問題,很多計算機都帶有一個使用該程式以檢查檔案系統的一致性。 一致性檢查分兩種,塊的一致性檢查和檔案的一致性檢查。程式構建兩張表,第一張是計數器跟蹤該塊在檔案中的出現次數,第二個表是計數器跟蹤該塊在空閒表中國年出現次數。 如果檔案系統一致,則每一塊或在第一張表中為1,或在第二張表中為1. 若某磁碟塊兩張表中都沒出現,則檔案系統檢驗程式把他們駕到空閒表中即可。 若在空閒表中出現多次,則重建空閒表即可。 最糟的情況是一個塊出現在多個檔案,那麼一個檔案刪除該塊會導致該塊同時處於使用和空閒兩種狀態。所刪除兩個檔案,則會在空閒表中出現兩次。 檔案系統檢驗程式的方法是:現分配一空閒塊,把在空閒表出現多次的塊複製到空閒塊,然後把它插入其中一個檔案之中。這些檔案內容未改變(雖然內容幾乎肯定不對),但至少保持來檔案系統但一致性。這一錯誤應該報告,由使用者檢查檔案受損情況。 由於存在硬連線,一個檔案可能出現在多個目錄。但是符號連線是不計數但。 如果檔案系統計數完畢之後結果與i節點中計數一致,則無誤。若i節點數不同於統計數,則將i節點置為統計數 在很多系統中檔案但刪除僅僅是在對應目錄huoi節點上設定某一位,表示檔案被刪除,並沒有把磁碟塊返回空閒表中,知道確實需要時才這樣做。

檔案系統性能

快取記憶體

最常用對減少磁碟訪問次數計數是塊快取記憶體或者緩衝區快取記憶體。快取記憶體指的是一系列塊,他們在邏輯上屬於磁碟,但實際基於效能對考慮被儲存在記憶體中。 快取記憶體的一個常用方法是檢查全部讀請求,若快取記憶體存在,則直接返回,若不存在,則首先把它讀到高速婚車,在複製到需要的地方。 快取記憶體提速的常用方法是將裝置和磁碟地址進行雜湊操作。 快取記憶體的好處在對於快取記憶體的引用不很頻繁,所以按精確的LRU順序在連結串列中國年記錄全部的塊是可行的。 我們通常希望資料塊不要在快取記憶體中保留太久再存入,這樣可能會導致資訊丟失。 系統可以採用兩種方法來解決這個問題: 第一種,在UNIX系統中國年有一個系統呼叫sync,它強制性地把全部修改過的塊立刻寫回磁碟。 第二種,windows只要資料被寫進快取記憶體,就把每個修改的塊寫進磁碟。這種方法稱為通寫快取記憶體,這種方法需要更多的磁碟IO, 在UNIX系統中,若不呼叫sync就移動(軟)磁碟,往往會導致資料丟失,在被毀壞的檔案系統中也經常如此。而在通寫快取記憶體中,就不會出現這種情況。 有些作業系統將快取記憶體和頁快取整合。這種方式在支援記憶體對映檔案的時候很吸引人。同一個快取可以同時用來儲存檔案塊的和頁。

塊提前讀

第二個明顯提高檔案系統性能的計數是:在需要塊之前,試圖提前將其寫入快取記憶體,從而提高命中率。 快提前讀策略只適合順序讀取的五年級。

減少磁碟臂運動

該方法是把有可能順序讀取的塊放在一起,當然最好是在同一個柱面上,從而減少磁碟臂的移動次數。 這裡用到一個小技巧,即不用塊二用連續塊簇來跟蹤磁碟儲存區。但在一個空閒系統上讀取檔案,尋道的次數可以減少與。 在使用i節點或任何類似i節點的系統中,另一個性能瓶頸是讀取一個很短的檔案也需要兩次磁碟訪問——一次是訪問i節點,另一次是訪問塊。 一個簡單的改進方法是在磁碟中部,在磁碟中部而不是開始出存放i節點。這樣i節點和第一塊直接的距離和尋道時間就減少為一半。另一種做法是:將磁碟分成多個柱面組,每個柱面組由自己的i' 節點,資料塊和空閒表

磁碟碎片整理

有些檔案不能被移動,包括頁檔案,休眠檔案以及日誌,因為移動這些檔案所需的管理成本大於移動他們的價值。若他們恰好在分割槽的末端附近並且使用者想減少分割槽大小。解決的唯一方法就是將他們刪除,改變分割槽大小,然後重新建立


檔案系統例項

CD-ROM檔案系統

ISO 9960檔案系統

CD-ROM是沿著一個連續的螺旋線來順序儲存資訊(當然,跨越螺旋線查詢也是可能的),每個邏輯塊的有效部分是2048位元組。 接下來的一塊存放基本卷描述符,基本卷描述符包括來CD)ROM的一些今本資訊。包括系統識別符號,卷識別符號等。 此外還有一個補充卷描述符。 根目錄和所有的其它目錄包含可變數目的目錄項,目錄總的最後一個目錄項由一位用於標記該目錄項是目錄中的最後一個。目錄項長度本身是可變的。 因為目錄項是長度可變的,所有,第一個域就說明這一項的長度。這樣位元組被定義為高位在左。 目錄項可能包含由擴充套件舒徐,若使用該特性。 見書P175