作業系統第四章-檔案管理

阿正的夢工坊發表於2020-12-14

寫在前面:本文參考王道論壇的 作業系統考研複習指導單科書

在這裡插入圖片描述

在這裡插入圖片描述

第四章 檔案管理

4.1 記憶體管理概念

在這裡插入圖片描述

4.1.1 檔案的概念

4.1.2 檔案的邏輯結構

檔案的邏輯結構是從使用者觀點出發看到的檔案的組織形式。檔案的物理結構(又稱檔案的儲存結構)是從實現觀點出發看到的檔案在外存上的儲存組織形式。 檔案的邏輯結構與儲存介質特性無關,但檔案的物理結構與儲存介質的特性有很大關係。 檔案的邏輯結構實際上是指在檔案的內部,資料邏輯上是如何組織起來的

按邏輯結構,檔案可分為無結構檔案和有結構檔案兩種。

1. 無結構檔案(流式檔案)

無結構檔案是最簡單的檔案組織形式。無結構檔案將資料按照順序組織成記錄並積累、儲存,它是有序相關資訊項的集合,以位元組為單位。 由於無結構檔案沒有結構,因而對記錄的訪問只能通過窮舉搜尋的方式,因此這種檔案對大多數應用並不適用。但字元流的無結構檔案管理簡單,使用者可以方便地對其進行操作。所以,那些對基本資訊單位操作不多的檔案較適合採用字元流的無結構方式,如源程式檔案、目的碼檔案等。

2.有結構檔案(記錄式檔案)

有結構檔案按記錄的組織形式可以分為如下幾種:

1)順序檔案檔案中的記錄一個接一個地順序排列,記錄通常是定長的,可以順序儲存或者以連結串列方式儲存,在訪問時需要順序搜尋檔案。 順序檔案有以下兩種結構:
第一種是串結構,記錄之間的順序與關鍵字無關。 通常的辦法是由時間決定,即按存入時間的先後排列,最先存入的記錄作為第一條記錄,其次存入的作為第二條記錄,以此類推。

第二種是順序結構,指檔案中的所有記錄按照關鍵字順序排列。

在對記錄進行批量操作,即每次要讀或寫一大批記錄時,順序檔案的效率是所有邏輯檔案中最高的;此外,也只有順序檔案次啊能儲存在磁帶上, 並能有效工作,但順序檔案在查詢、修改增加或刪除單條記錄的操作比較困難。

2)索引檔案。 索引檔案的示意圖。 對於定長記錄檔案(長度為L),要查詢第i條記錄,可以直接按照下式計算得到第i條記錄相對於第一條記錄的地址:
A i = i × L A_i=i \times L Ai=i×L

在這裡插入圖片描述

然而,對於可變長記錄檔案, 要查詢第i條記錄,必須順序查詢前i-1條記錄, 從而獲得相應記錄的長度L,進而按照下式進行計算得到第i條記錄的首址:

A i = Σ i = 0 i − 1 L i + i A_i=\Sigma_{i=0}^{i-1}L_i+i Ai=Σi=0i1Li+i

變長記錄檔案只能順序查詢,系統開銷很大。 為此,可以建立一張索引表以加快檢索速度, 索引表本身是定長記錄的順序檔案。在記錄很多或者訪問要求高的檔案中, 需要引入索引以提供有效的訪問。

實際中,通過索引可以成百上千倍地提高訪問速度。

3)索引順序檔案。 索引順序檔案是順序和索引兩種組織形式的結合。 索引順序檔案將順序檔案中的所有記錄分成若干組, 為順序檔案建立一張索引表,在索引表中為每組中的第一條記錄建立一個索引項,其中包含該記錄的關鍵字值和指向該記錄的指標。

在這裡插入圖片描述

主檔案中記錄分組排列,同一個組中的關鍵字可以無序,但是組與組之間的關鍵字必須有序。查詢一條記錄時,首先通過索引表找到其所在的組,然後在該組中使用順序查詢,就能很快找到記錄。

對於含有N條記錄的順序檔案, 查詢某關鍵字值的記錄時,平均查詢N/2次。

在索引順序檔案中,假設N條記錄分為 N \sqrt{N} N 組,索引表中有 N \sqrt{N} N 個表項,每組有 N \sqrt{N} N 個記錄,在查詢某關鍵字值的記錄時,先順序查詢索引表,需要查詢 N 2 \frac{\sqrt{N}}{2} 2N 次,然後在主檔案中對應的組中循序查詢,也需要查詢 N 2 \frac{\sqrt{N}}{2} 2N 次,總共需要 N \sqrt{N} N 次。顯然,索引順序檔案提高了查詢效率,若記錄數很多,則可採用兩級或者多級縮影。

4)直接檔案或雜湊檔案(Hash File)。 給定記錄的鍵值或通過雜湊函式轉換的鍵值直接決定記錄的實體地址。這種對映結構不同於順序檔案和索引檔案,沒有順序的特性。

雜湊檔案有很高的存取速度,但是會引起衝突,即不同關鍵字的雜湊函式值相同。

有結構檔案邏輯上的組織,是為在檔案中查詢資料服務的(順序查詢、索引查詢、索引順序查詢和雜湊查詢)。

4.1.3 目錄結構

與檔案管理系統和檔案集合相關聯的是檔案目錄,它包含有關檔案的資訊如屬性、位置和所有權等,這些資訊主要由作業系統進行管理。

首先我們來看看目錄管理的基本要求:

從使用者的角度看,目錄在使用者(應用程式)所需要的檔名和檔案之間提供一種對映,所以目錄管理需要實現“按名存取”;目錄存取的效率直接影響到系統的效能,所以要提高對目錄的檢索速度;在共享系統中,目錄還需要提供用於控制檔案的資訊。此外,檔案允許重名也是使用者的合理和必然要求,目錄管理通過樹形結構來解決和實現。

前面介紹了檔案內部的邏輯結構,下面介紹多個檔案之間在邏輯上是如何組織的,這實際上是檔案“外部”的邏輯結構的問題。

1 檔案控制塊和索引結點

和程式管理一樣,為實現目錄管理,作業系統中引入了檔案控制塊這一資料結構。

1)檔案控制塊。檔案控制塊(FCB)是用來存放控制檔案需要的各種資訊的資料結構,以實現“按名存取”。FCB的有序集合稱為檔案目錄一個FCB就是一個檔案目錄項。 為了建立一個新檔案,系統將分配一個FCB並存放在檔案目錄中,成為目錄項。

FCB主要包含以下資訊:

  • 基本資訊,比如檔名、檔案的實體地址、檔案的邏輯結構、檔案的物理結構等
  • 存取控制資訊,比如檔案存取許可權等
  • 使用資訊,比如檔案建立時間、修改時間

2)索引結點。在檢索目錄檔案的過程中,只用到了檔名,僅當找到一個目錄項(查詢檔名與目錄項中檔名匹配)時,才需要從該目錄項中讀出該檔案的實體地址。 也就是說,在檢索目錄時,檔案的其他描述資訊不會用到,也不需要調入記憶體。因此,有的系統(比如UNIX)採用了檔名和檔案描述資訊分開的方法,檔案描述資訊單獨形成一個索引結點的資料結構,簡稱為i結點,在檔案目錄中的每個目錄項僅由檔名和指向該檔案所對應的i結點的指標構成。

一個FCB的大小是64B,盤塊大小是1KB,因此在每個盤塊中可以存放16個FCB(注意,FCB必須連續存放)。而在UNIX系統中,一個目錄項僅佔16B,其中14B是檔名,2B是 i結點指標。在1KB的盤塊中可存放64個目錄項。這樣,就可使查詢檔案時的平均啟動磁碟次數減少到原來的1/4,大大節省了系統開銷。

存放在磁碟上的索引結點稱為磁碟索引結點,UNIX中的每個檔案都有一個唯一的磁碟索引結點,主要包括以下幾個方面:

  • 檔案主識別符號,擁有該檔案的個人或小組的識別符號
  • 檔案型別,包括普通檔案、目錄檔案、特別檔案
  • 檔案存取許可權,各類使用者對該檔案的存取許可權
  • 檔案實體地址,每個索引結點中含有13個地址項,它們以直接或間接方式給出資料檔案所在盤塊的編號
  • 檔案長度,以位元組為單位
  • 檔案連結計數,在本檔案系統中所有指向該檔案的檔名的指標計數
  • 檔案存取時間,本檔案最近被程式存取的時間、最近被修改的時間及索引結點最近被修改的時間

檔案被開啟時,磁碟索引結點複製到記憶體的索引結點中,以便於使用。 在記憶體索引節點中又增加了以下內容:

  • 索引結點編號,用於標識記憶體索引結點
  • 狀態,指示i結點是否上鎖或被修改
  • 訪問計數,每當有一程式要訪問此i結點時,計數加1,訪問結束減1
  • 邏輯裝置號,檔案所屬檔案系統的邏輯裝置號
  • 連結指標,設定分別指向空閒連結串列和雜湊佇列的指標

2 目錄結構

在目錄這個層次上所需要執行哪些操作呢?

  • 搜尋。當使用者使用一個檔案時,需要搜尋目錄,已找到該檔案對應的目錄項
  • 建立檔案。當建立一個新檔案時,需要在目錄中增加一個目錄項
  • 刪除檔案。當刪除一個檔案時,需要在目錄中刪除相應的目錄項。
  • 顯示目錄。使用者可以請求顯示目錄的內容,比如顯示該使用者目錄中的所有檔案及其屬性。
  • 修改目錄。某些檔案屬性儲存在目錄中,因而這些屬性的變化需要改變相應的目錄項。

操作時考慮以下幾種目錄結構

1)單級目錄結構

在這裡插入圖片描述

在整個檔案系統中只建立一張目錄表,每個檔案佔一個目錄項。

實現了按名存取,到那時存在查詢速度慢,檔案不允許重名,不便於檔案共享等缺點,而且對於多使用者的作業系統顯然是不適用的。

2)兩級目錄結構

將檔案目錄分成主檔案目錄(Master File Directory,MFD)和使用者檔案目錄(User File Directory,UFD)兩級。

主檔案目錄項記錄使用者名稱相應使用者檔案目錄所在的儲存位置

使用者檔案目錄項記錄該使用者檔案的FCB資訊

當某使用者想要對其檔案進行訪問時,只需要搜尋使用者對應的UFD,這既解決了不同使用者檔案之間的重名的問題,有一定程度上保證了檔案的安全。

但是兩級目錄結構缺乏靈活性,不能對檔案分類。

在這裡插入圖片描述

3)多級目錄結構(樹形目錄結構)

使用者要訪問某個檔案時,用檔案的路徑名標識檔案,檔案路徑名是個字串,由從根目錄出發到所找檔案通路上所有目錄名與資料檔名用分隔符/ 連結而成。 從根目錄出發的路徑稱為絕對路徑。當層次較多時,每次從根目錄出發查詢會浪費時間,於是加入了當前目錄,程式對各檔案的訪問都是相對於當前目錄進行的。

在這裡插入圖片描述

樹形目錄結構可以方便地對檔案進行分類,層次結構清晰,也能有效地進行檔案的管理和保護。 但是,在樹形目錄中查詢一個檔案時,需要按照路徑名依次訪問中間結點,這就增加了磁碟訪問次數,影響查詢速度。

4)無環圖目錄結構。樹形目錄結構能便於實現檔案分類,但是不便於實現檔案共享。 為此在樹形目錄結構的基礎上增加了一些指向同一結點的有向邊,使得整個目錄成為一個有向無環圖。引入無環圖目錄結構是為了實現檔案共享

在這裡插入圖片描述

需要為每個共享節點設定一個共享計數器,每當圖中增加對該結點的共享鏈時,計數器加1;每當某使用者提出刪除該結點時,計數器減1.僅當共享計數器為0時,才真正刪除該結點,否則僅刪除請求使用者的共享鏈。 共享檔案(或目錄)不同於檔案拷貝(副本)。對於共享檔案,只存在一個真正的檔案,熱河改變都會為其他使用者所見。

無環圖結構方便檔案的共享,但是使得系統的管理變得更加複雜。

4.1.4 檔案共享

檔案共享使得多個使用者(程式)共享同一個檔案,系統中只需要保留該檔案的一個副本。如果系統不能提供貢獻功能,則每個需要該檔案的使用者都要有自己的副本,會造成對儲存空間的極大浪費。

現代常用的兩種檔案共享方法有

1.基於索引結點的共享方式(硬連結)

2利用符號鏈實現檔案共享(軟連結)

4.2 檔案系統實現

在這裡插入圖片描述

在學習本節時,請讀者思考如下問題:

  1. 在目錄中查詢某個檔案可以使用什麼方法?
  2. 檔案的邏輯結構和物理結構有何區別?單個檔案的邏輯結構和物理結構之間是否存在某些制約關係?

4.2.1 檔案系統層次結構

現代作業系統有多種檔案系統型別(如FAT32,NTFS,ext2,ext2,ext4等),因此檔案系統的層次結構也不盡相同。下圖是一種合理的層次結構。

在這裡插入圖片描述

1.使用者呼叫介面

檔案系統為使用者提供與檔案及目錄有關的系統呼叫,如新建、開啟,讀寫,關閉,刪除檔案,建立、刪除目錄等。 此層由若干程式模組組成,每個模組對應一條系統呼叫,使用者發出系統呼叫時,控制即轉入相應的模組。

2 檔案目錄系統
檔案目錄系統的主要功能是管理檔案目錄, 其任務有管理活躍檔案目錄表、管理讀寫狀態資訊表、管理使用者程式的開啟檔案表、管理和組織儲存裝置上的檔案目錄結構,呼叫下一級儲存控制模組。

3 存取控制驗證模組

實現檔案保護主要由該級軟體完成,它把使用者的訪問要求與FCB中指示的訪問控制許可權進行比較,以確認訪問的合法性。

4 邏輯檔案系統與檔案資訊緩衝區

邏輯檔案系統與檔案資訊緩衝區的主要功能是,根據檔案的邏輯結構將使用者要讀寫的邏輯記錄轉換成檔案邏輯結構內的相應塊號

5 物理檔案系統

主要功能是把邏輯記錄所在的相對塊號轉換成實際的實體地址。

6 輔助分配模組

分配模組的主要功能是管理輔存空間,即負責分配輔存空閒空間和回收輔存空間。

7 裝置管理程式模組
主要功能是分配裝置、分配裝置讀寫用緩衝區、磁碟排程、啟動裝置、處理裝置中斷,釋放裝置讀寫緩衝區,釋放裝置等。

我們可以通過使用者請求訪問某個檔案時發生的一系列事情來輔助記憶檔案系統的層次結構。

例如,使用者要檢視檔案F中的內容,對作業系統發出命令(OS有面向使用者的介面),於是就經過了第0級的使用者呼叫介面。

OS得到命令後,需要查詢目錄以查詢檔案F的索引資訊,可能是FCB,也可能是索引節點,經過了第1級檔案系統目錄。

通過目錄找到檔案FCB後,需要檢視檔案FCB上的資訊,看看這個使用者有沒有訪問許可權,於是經過了存取控制驗證模組。

使用者通過驗證後,就真正開始定址。OS的定址往往先得到邏輯地址,再得到實體地址,於是在開始定址時,OS經過邏輯檔案系統與檔案資訊緩衝區,得到了相應檔案的內容的邏輯地址

把邏輯地址轉換為實體地址, 是在物理檔案系統中完成的。

至此為止,定址完成。 定址完成後,我們關心的是找到的這塊空間應該如何管理,若要釋放這塊空間,則任務就交給輔助分配模組,若要把這塊空間分配給裝置用於I/O,則把任務交給裝置管理程式模組

4.2.2 目錄實現

在讀檔案前,必須先開啟檔案;開啟檔案時,OS利用路徑名找到相應目錄項,目錄項中提供了查詢檔案磁碟塊所需要的資訊。 目錄實現的基本方法有線性列表和雜湊表兩種,要注意目錄的實現就是為了查詢,因此線性列表實現對應線性查詢,雜湊表的實現對應雜湊查詢。

1.線性列表

最簡單的目錄實現方法是使用儲存檔名和資料塊指標的線性表。 建立新檔案時,必須首先搜尋目錄表以確定沒有同名的檔案存在,然後在目錄表後增加一個目錄項。 刪除檔案則根據給定的檔名搜尋目錄表,接著釋放分配給它的空間。重用目錄項有很多方法: 可以將目錄項標記為不再使用,或者將它加到空閒目錄項表上,還可以將目錄表中的最後一個目錄項複製到空閒位置,並降低目錄表長度。採用連結串列結構可以減少刪除檔案的時間,其優點在於實現簡單,不過由於線性表的特殊性,比較費時。

2. 雜湊表

雜湊表根據檔名得到一個值,並返回一個指向線性列表中元素的指標。 這種方法優點是查詢非常迅速,插入和刪除也很簡單,不過需要一些預備措施來避免衝突。最大的困難是雜湊表長度固定以及雜湊函式對錶長的依賴性。

目錄查詢是通過在磁碟上反覆搜尋完成的,需要不斷進行I/O操作,開銷較大。 所以如前所述, 為了減少I/O操作,把當前使用的檔案目錄複製到記憶體,以後要使用該檔案的時候只需要在記憶體中操作,因此降低了磁碟操作次數,提高了系統速度。

4.2.3 檔案實現

檔案的實現就是研究檔案的物理結構,即檔案資料在物理儲存裝置上是如何分佈和組織的。同一個問題有兩個方面的回答:一是檔案的分配方式,講的是對磁碟非空閒塊的管理;二是檔案儲存空間管理,講的是對磁碟空閒塊的管理

1.檔案分配方式

檔案分配方式對應於檔案的物理結構,是指如何為檔案分配磁碟塊。常用的磁碟空間分配方法有三種:連續分配,連結分配和索引分配。 有的系統(比如RDOS作業系統)對三種方法都支援,但更普遍的是一個系統只支援一種方法。

1)連續分配

連續分配方法要求每個檔案在磁碟上佔有一組連續的塊,磁碟地址定義了磁碟上的一個線性排序。這種排序使得作業訪問磁碟時需要的尋道數和尋道時間最小。

在這裡插入圖片描述

檔案的連續分配可以用第一塊的磁碟地址和連續塊的數量來定義。一個檔案的目錄條目應該包括開始塊的地址和該檔案所分配區域的長度。

連續分配支援順序訪問和直接訪問(即隨機訪問)。優點是實現簡單、存取速度快。缺點是檔案長度不宜動態增加,因為一個檔案末尾後的盤塊可能已分配給其他檔案,一旦需要增加,就需要大量移動盤塊。此外,反覆增刪檔案後會產生外部碎片,且很難確定一個檔案需要的空間大小。

連續分配只適合於長度固定的檔案。

2) 連結分配

連結分配採用離散分配的方式,消除了外部碎片,因此顯著提高了磁碟空間的利用率;又因為根據檔案的當前需求為其分配必需的盤塊,當檔案動態增長時,可以動態地再為它分配盤塊,因此無需事先知道檔案的大小。此外,對檔案的增刪改也非常方便。 連結分配又分為隱式連結顯式連結兩種。

隱式連結如下圖所示。每個檔案對應一個磁碟塊的連結串列;磁碟塊分佈在磁碟的任何地方,除最後一個磁碟塊外,每個盤塊都有指向下一個盤塊的指標,這些指標對使用者是透明的。 目錄包括檔案 的第一塊的指標和最後一塊的指標

在這裡插入圖片描述

隱式連結分配的缺點是無法直接訪問盤塊,只能通過指標順序訪問檔案,且盤塊指標會消耗一定的儲存空間。隱式連結分配的穩定性也是一個問題,系統在執行過程中由於軟體或硬體錯誤導致連結串列中的指標丟失或者損壞,會導致檔案資料的丟失。

顯式連結分配方式是指把用於連結檔案各物理塊的指標,從每個物理塊的塊末尾中提取出來,顯式地存放在記憶體的一張連結表中。該表在整個磁碟中僅設定一張,稱為檔案分配表(File Allocation Table, FAT)。每個表項中存放對應塊的下一塊連結指標,即下一個盤塊號

在這裡插入圖片描述

FAT表項與全部磁碟塊是一一對應的,並且可以用特殊的數字-1表示檔案的最後一塊,用-2表示這個磁碟塊是空閒的(當然也可以指定-2,-3等等)。因此,檔案分配表不僅記錄了檔案各塊之間的先後連結關係,同時還標記了空閒的磁碟塊,作業系統也可以通過FAT對檔案儲存空間進行管理。

一個磁碟只會建立一張FAT表,FAT表在系統啟動時就會被讀入記憶體,並且常駐記憶體,因此查詢FAT的過程是在記憶體中進行的。

顯式連結分配方式的優點:
很方便檔案擴充,不會有碎片問題,外存利用率高,並且支援隨機訪問。相比於隱式連結分配,地址轉換時不需要訪問磁碟,因此檔案的訪問效率更高。
缺點:檔案分配表需要佔用一定的儲存空間。

注:連結分配預設情況下指的是隱式連結分配方式。

3)索引分配

連結分配方式解決了連續分配的外部碎片和檔案大小管理的問題。但是,連結分配不能有效支援隨機訪問(FAT除外,即顯式連結分配除外)。索引分配解決了隨機訪問這個問題,它把每個檔案的所有的盤塊號都集中放在一起構成索引表(又稱索引塊),從而索引分配支援隨機訪問(直接訪問)。存放索引表的磁碟塊稱為索引塊存放檔案資料的磁碟塊稱為資料塊

在這裡插入圖片描述

每個檔案都有其索引塊,這是一個磁碟塊地址的陣列。 索引塊的第i個條目指向檔案的第i個塊目錄條目包括索引塊的地址,換句話說,目錄中記錄的是檔案的索引塊的塊號。要讀第i塊,通過索引塊的第i個條目的指標來查詢和讀入所需的塊。索引表建立了邏輯塊號和物理塊號的一一對映關係

優點:索引分配支援直接訪問,且沒有外部碎片問題。檔案擴充也很容易實現(只需要給檔案分配一個空閒塊,並增加一個索引表項即可)

缺點: 磁碟表要佔用一定的儲存空間

如果檔案太大,索引表項太多,可以採取以下三種方法解決:
1)連結方案

如果索引表太大,一個索引塊裝不下,那麼可以將多個索引塊連結其來存放。

缺點: 若檔案很大,索引表很長,就需要將很多個索引塊連結起來。想要找到i號索引塊,必須先讀入0~i-1號索引塊,這就導致磁碟I/O操作次數過多,查詢效率低下。

2) 多層索引

建立多層索引(原理類似於多層頁表),使得第一層的索引表項指向第二層的索引塊。還可以根據檔案大小的要求建立第三層、第四層的索引塊

3)混合索引
將多種索引分配方式相結合的分配方式。例如,系統既採用直接地址,又採用單級索引分配方式或兩級索引分配方式。

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

2. 檔案儲存空間管理

1)檔案儲存器空間的劃分與初始化。一般來說,一個檔案儲存在一個檔案卷內。檔案卷可以是物理盤的一部分,也可以是整個物理盤,支援超大型檔案的檔案卷也可由多個物理盤組成,如下圖。

在這裡插入圖片描述
在一個檔案卷中,檔案資料資訊的空間(檔案區)和存放檔案控制資訊FCB的空間(目錄區)是分離的。

由於存在很多種類的檔案表示和存放格式,所以現代作業系統中一般都有很多不同的檔案管理模組,通過它們可以訪問不同格式的邏輯卷中的檔案。 邏輯卷在提供檔案服務前,必須由對應的檔案程式進行初始化,劃分好目錄區和檔案區,建立空閒空間管理表格及存放邏輯卷資訊的超級塊。

2)檔案儲存器空間管理。 檔案儲存裝置分成許多大小相同的物理塊,並以塊為單位交換資訊,因此,檔案儲存裝置的管理實質上是對空閒塊的組織和管理,它包括空閒塊的組織、分配與回收等問題。

(1)空閒表法

空閒表法屬於連續分配方式。 它與記憶體的動態分配方式類似,為每個檔案分配一塊連續的儲存空間。系統為外存上的所有空閒區建立一張空閒盤塊表,每個空閒區對應一個空閒表項,其中包括表項序號、該空閒區的第一個盤塊號,該區的空閒盤塊數等資訊。 再將所有的空閒區按照起始盤塊號遞增的次序排列。

在這裡插入圖片描述

空閒盤區的分配與記憶體的動態分配類似,同樣採用首次適應演算法、迴圈首次適應演算法等。例如,在系統為某新建的檔案分配空閒盤塊時,先順序地檢索空閒盤塊表的各表項,直到找到第一個其大小能滿足要求的空閒區,再將該盤區分配給使用者,同時修改空閒盤塊表。

系統在對使用者所釋放的儲存空間進行回收時,也採用類似於記憶體回收的方法,即要考慮回收取 是否與空閒表中插入點的前區和後區相鄰接,相鄰的話應該合併。

(2)空閒連結串列法

將所有空閒盤區拉成一條空閒鏈,根據構成鏈所用的基本元素不同,可把連結串列分為兩種形式: 空閒盤塊鏈和空閒盤區鏈。

空閒盤塊鏈將磁碟上的所有空閒空間以盤塊為單位拉成一條鏈。 當使用者因為建立檔案而請求分配儲存空間時,系統從鏈首開始,依次摘下適當數目的空閒盤塊分配給使用者。當使用者因為刪除檔案而釋放儲存空間時,系統將回收的盤塊依次插入空閒盤塊鏈的末尾。這種方法的優點是分配和回收一個盤塊的過程非常簡單,但在為一個檔案分配盤塊時可能要重複多次操作。

空閒盤區鏈 將磁碟上的所有空閒盤區(每個盤區可包含若干盤塊)拉成一條鏈。再每個盤區上除了用於指示下一個空閒盤區的指標外,還應該有能指明本盤區大小(盤塊號)的資訊。 分配盤區的方法與記憶體的動態分割槽分配類似,通常採用首次適應演算法。 回收盤區時,注意合併的問題。

(3)位示圖法

位示圖利用二進位制的一位來表示磁碟中的一個盤塊的使用情況,磁碟上所有的盤塊都有一個二進位制位與之對應。 其值為“0”表示對應的盤塊空閒;其值為1時表示對應的盤塊已分配。

每個二進位制位對應一個盤塊。

在這裡插入圖片描述

王道書上:(字號,位號)或者稱為(行號,列號)都是從1開始編號的。

盤塊的分配:

1)順序掃描位示圖,從中找出一個或一組為0的二進位制位。2)將找到的一個或者一組二進位制位,轉換成與之對應的盤塊號。若找到的為0 的二進位制位位於位示圖的第i行,第j列,則其相應的盤塊號按照下式計算(n代表每行的位數,也就是字長)
b = n ( i − 1 ) + j   這 是 從 1 開 始 編 號 的 情 況 b=n(i-1)+j\,這是從1開始編號的情況 b=n(i1)+j1

3)修改位示圖,令map[i,j]=1

盤塊的回收:

1)將回收盤塊的盤塊號轉換成位示圖中的行號和列號,轉換公式為
i = ( b − 1 ) / ( n + 1 ) i=(b-1) / (n+1) i=(b1)/(n+1)
j = ( b − 1 ) m o d ( n + 1 ) j=(b-1) mod (n+1) j=(b1)mod(n+1)

2)修改位示圖,令map[i,j]=0

(4)成組連結法

空閒表法和空閒連結串列法都不適用於大型檔案系統,因為這會使空閒表或空閒連結串列太大。在UNIX系統中採用的是成組連結法,這種方法結合了空閒表和空閒連結串列兩種方法,克服了表太大的缺點。

檔案卷的目錄區中專門用一個磁碟塊作為“超級塊”,當系統啟動時需要將超級塊讀入記憶體。並且要保證記憶體和外存中超級塊資料一致(超級塊充當了連結串列中鏈頭的作用)。
一個超級塊記錄下一組空閒盤塊數和空閒塊號

在這裡插入圖片描述

大致思想是:一個超級塊中記錄下一組空閒塊的數量和空閒塊號,對於下一組空閒塊,選第一個空閒塊再儲存接下來的空閒塊的數量和塊號,依次類推。

4.3 磁碟組織與管理

在這裡插入圖片描述

4.3.1 磁碟的結構

磁碟(Disk)是由表面塗有磁性物質的金屬或者塑料構成的圓形碟片,通過一個稱為磁頭的導體線圈從磁碟存取資料。在讀/寫操作期間,磁頭固定,磁碟在下面高速旋轉。

磁碟盤面上的資料儲存在一組同心圓中,稱為磁軌。 每個磁軌與磁頭一樣寬,一個盤面上由上千個磁軌。磁軌又劃分為幾百個扇區每個扇區固定儲存大小(通常是512B),一個扇區稱為一個盤塊。相鄰磁軌即相鄰扇區之間通過一定的間隙分隔開,以避免精度錯誤。 注意,由於扇區按照固定圓心角度劃分,所以密度從最外道逐漸向最內道增加的,磁碟的儲存能力受限於最內道的最大記錄密度。

磁碟安裝在一個磁碟驅動器中,它有磁頭臂、用於旋轉磁碟的主軸和用於資料輸入/輸出的電子裝置組成。

扇區是磁碟可定址的最小儲存單位,磁碟地址用“柱面號·盤面號·扇區號”表示。

在這裡插入圖片描述

使用者訪問檔案,需要作業系統的服務,檔案實際上儲存在磁碟中,作業系統接收到使用者的命令後,經過一系列的檢驗訪問許可權和定址過程後,最終都會到達磁碟,控制磁碟把相應的資料資訊讀出或修改。 當有多個請求同時到達時,作業系統就要決定先為哪個請求服務,這就是磁碟排程演算法要解決的問題。

4.3.2 磁碟排程演算法

一次磁碟讀寫操作的時間由尋道時間、延遲時間和傳輸時間決定的。

1)尋道時間Ts。 活動頭磁碟在讀寫資訊前,將磁頭移動到指定磁軌所需要的時間。這個時間除跨越n條磁軌的時間外,還包括啟動磁臂的時間s
T s = m × n + s T_s=m \times n + s Ts=m×n+s

式中,m是與磁碟驅動器速度有關的常數,約為0.2ms,磁臂的啟動時間約為2ms。

2)延遲時間Tr。 磁頭定位到某一磁軌的扇區(塊號)所需要的時間,設磁碟的旋轉速度為r,則
T r = 1 2 r T_r=\frac{1}{2r} Tr=2r1

對於硬碟,典型的旋轉速度是5400轉/分,相當於一週11.1ms,則Tr=5.55ms;對於軟盤,其旋轉速度為300~600轉/分,則Tr為50 ~100 ms

3)傳輸時間Tt。 從磁碟讀出或向磁碟寫入資料所經歷的時間,這個時間取決於每次所讀寫的位元組數b和磁碟的旋轉速度:
T t = b r N T_t=\frac{b}{rN} Tt=rNb

式中,r是磁碟每秒的轉數,N是一個磁軌上的位元組數。

在磁碟存取時間的計算中,尋道時間和磁碟排程演算法相關,下面將介紹幾種演算法;而延遲時間和傳輸時間都和磁碟旋轉速度相關,且為線性相關,所以在硬體上,轉速是磁碟效能一個非常重要的引數。

總平均儲存時間Ta可以表示為:
T a = T s + 1 2 r + b r N T_a=T_s+\frac{1}{2r}+\frac{b}{rN} Ta=Ts+2r1+rNb

在實際的磁碟I/O操作中,存取時間與磁碟排程演算法密切相關。排程演算法直接決定尋道時間,從而決定總的存取時間。

目前常用的磁碟排程演算法有以下幾種
1)先來先服務(First Come First Served,FCFS)演算法
FCFS演算法根據程式請求訪問磁碟的先後順序進行排程,這是一種最簡單的排程演算法,如下圖。該演算法的優點是具有公平性。若只有少量的程式需要訪問,且大部分請求都是訪問簇聚的檔案扇區,則有望達到較好的效能;缺點是,如果大量的程式競爭使用磁碟,並且請求訪問的磁軌很分散,則效能很差。
在這裡插入圖片描述

2)最短尋找時間優先(Shortest Seek Time First,SSTF)演算法

SSTF演算法選擇排程處理的磁軌是與當前磁頭所在磁軌距離最近的磁軌,以便使每次的尋道時間最短。 當然,總是選擇最小尋找時間並不能保證平均尋道時間最小,但能提供比FCFS演算法更好的效能。 這種演算法會產生“飢餓”現象

如果某時刻磁頭正在18號磁軌,而在18號磁軌附近頻繁地增加新的請求,則SSTF演算法使得磁頭長時間在18號磁軌附近工作,將使遠處的磁軌的訪問被無限期地延遲,即被“餓死”。

在這裡插入圖片描述

在這裡插入圖片描述

3)掃描(SCAN)演算法(又稱為電梯排程演算法)

SCAN演算法在磁頭當前移動方向上選擇與當前磁頭所在磁軌距離最近的請求作為下一次服務的物件,實際上就是在最短尋找時間優先演算法的基礎上規定了磁頭運動的方向。由於磁頭移動規律與電梯執行相似,因此又稱電梯排程演算法。 SCAN演算法對最近掃描過的區域不公平,因此它在訪問區域性性方面不如FCFS 和SSTF 演算法好。
在這裡插入圖片描述

在這裡插入圖片描述

4)迴圈掃描(Circular SCAN ,C-SCAN)演算法

在掃描演算法的基礎上規定磁頭單向移動來提供服務,回返時直接快速移動至起始端而不服務任何請求。 由於SCAN演算法偏向於處理那些接近最裡或最外的磁軌的訪問請求,所以使用改進型的C-SCAN演算法來避免這個問題。

在這裡插入圖片描述

採用SCAN演算法和C-SCAN演算法時,磁頭總是嚴格地遵循從盤面的一端到另一端,顯然,在實際使用時還可以改進,即磁頭移動只需要到達最遠端的一個請求即可返回不需要到達磁碟端點。 這種形式的SCAN演算法和C-SCAN演算法稱為LOOK排程C-LOOK排程,因為它們在朝一個給定方向移動前會檢視是否有請求。

在這裡插入圖片描述

在這裡插入圖片描述

注意,如沒有特殊說明,也可以預設SCAN演算法和C-SCAN演算法為LOOK演算法和C-LOOK排程。

對比以上幾種磁碟排程演算法,FCFS演算法太過簡單,效能較差,僅僅在請求佇列長度接近於1時才較為理想;SSTF演算法較為通用和自然;SCAN演算法和C-SCAN演算法在磁碟負載較大時比較佔優勢

在這裡插入圖片描述

在這裡插入圖片描述

除減少尋道時間以外,減少延遲時間也是提高磁碟傳輸效率的重要因素,可以對盤面扇區進行交替編號,對磁碟片組中的不同盤面錯位命名。假設每個盤面有8個扇區,磁碟片組共8個盤面,可以採用下圖所示的編號。

在這裡插入圖片描述

磁碟是連續自轉裝置,磁頭讀/寫一個物理塊後,需要經過短暫的處理時間才能讀/寫下一塊。假設邏輯記錄資料連續存放在磁碟空間中,若在盤面上按扇區交替編號連續存放,則連續讀/寫多條記錄時能較少磁頭的延遲時間;同柱面不同盤面的扇區若能錯位編號,連續讀/寫相鄰兩個盤面的邏輯記錄時也能減少磁頭延遲時間。

在這裡插入圖片描述

4.3.3 磁碟的管理

1 . 磁碟初始化
一個新的磁碟只是一個含有磁性記錄材料的空白盤。在磁碟能儲存資料之前,它必須分成扇區以便磁碟控制器能進行讀和寫操作,這個過程稱為低階格式化(物理分割槽)。低階格式化為磁碟的每個扇區採用特別的資料結構。每個扇區的資料結構通常由頭、資料區域(通常為512B大小)和尾部組成。頭部和尾部包含了一些磁碟控制器所使用的資訊。

為使用磁碟儲存檔案,作業系統還需要將自己的資料結構記錄在磁碟上:
第一步將磁碟分為由一個或多個柱面組成的分割槽(即熟悉的C盤和D盤等形式的分割槽);

第二步對物理分割槽進行邏輯格式化(建立檔案系統),作業系統將初始的檔案系統資料結構儲存到磁碟上,這些資料結構包括空閒和已分配的空間以及一個初始為空的目錄。

2 . 引導塊

計算機啟動時需要執行一個初始化程式(自舉程式),它初始化CPU、暫存器、裝置控制器和記憶體等,接著啟動作業系統。 為此,該自舉程式應該找到磁碟上的作業系統核心,裝入記憶體,並轉到起始地址,從而開始作業系統的執行。

自舉程式通常儲存在ROM中,為了避免改變自舉程式碼而需要改變ROM硬體的問題,因此只在ROM中保留很小的自舉裝入程式,將完整功能的自舉程式儲存在磁碟的啟動塊上啟動塊(也叫引導塊)位於磁碟的固定位。擁有啟動分割槽的磁碟稱為啟動磁碟系統磁碟

3 . 壞塊

由於磁碟有移動部件且容錯能力弱,因此容易導致一個或多個扇區損壞。部分磁碟甚至在出廠時就有壞扇區。根據所使用的磁碟和控制器,對這些塊有多種處理方式。

對於簡單磁碟,比如電子整合驅動器(IDE),壞扇區可手工處理,比如MS-DOS的Format命令執行邏輯格式化(建立檔案系統)時便會掃描磁碟以檢查壞扇區。壞扇區在FAT表中會標明,因此程式不會使用。

對於複雜的磁碟,比如小型計算機系統介面(SCSI),其控制器維護一個磁碟壞塊連結串列。該連結串列在出廠前進行低階格式化時已經初始化,並在磁碟的整個使用過程中不斷更新。低級格式化將一些塊保留作為備用,對作業系統透明。 控制器可以用備用塊來邏輯地代替壞塊,這種方案稱為扇區備用

對壞塊的處理實際上就是利用某種機制,使得系統不去使用壞塊。壞塊屬於硬體故障,作業系統是不能修復壞塊的。

在這裡插入圖片描述

王道習題

在這裡插入圖片描述
答案:B 磁帶只能順序訪問;光碟、U盤,磁碟都可以隨機訪問。

在這裡插入圖片描述

答案:D尋道時間影響速度最大

在這裡插入圖片描述
答案:A

相關文章