操作系統筆記四:文件管理與磁盤存儲器管理


目錄

初識文件管理

文件--就是一組有意義的信息/數據集合。

文件的屬性

文件名:由創建文件的用戶決定文件名,主要是為了方便用戶找到文件,同一目錄下不允許有重名文件

標識符:一個系統內的各文件標識符唯一,對用戶來說毫無可讀性,因此標識符只是操作系統用於區分各個文件的一種內部名稱。

類型:指明文件的類型。

位置:文件存放的路徑(讓用戶使用)、在外存中的地址(操作系統使用,對用戶不可見)

大小:指明文件大小。

創建時間、上次修改時間,文件所有者信息

保護信息:對文件進行保護的訪問控制信息

操作系統應該向上提供那些功能

image-20201213200206472

提供的幾個最基本的功能

  • 創建文件(create系統調用)
  • 刪除文件(delete系統調用)
  • 讀文件(read系統調用)
  • 寫文件(write系統調用)
  • 打開文件(open系統調用)
  • 關閉文件(close系統調用)

可用幾個基本操作完成更復雜的操作。

文件應如何存放在外存

image-20201213200537983

其他需要由操作系統實現的文件管理功能

image-20201213200700148

文件邏輯結構

image-20201213195821698

無結構文件

無結構文件:文件內部的數據就是一系列二進制流或字符流組成。又稱"流式文件"。如:Windows操作系統中的.txt文件。

有結構文件

有結構文件:由一組相似的記錄組成,又稱"記錄式文件"。每條記錄又若干個數據項組成。如:數據庫表文件。一般來說,每條記錄有一個數據項可作為關鍵字。根據各條記錄的長度(占用的存儲空間)是否相等,又可分為定長記錄可變長記錄兩種。

image-20201213201342604

image-20201213201428003

有結構文件的邏輯結構

順序文件

順序文件:文件中的記錄一個接一個地順序排列(邏輯上),記錄可以是定長的或可變長的。各個記錄在物理上上可以順序存儲或鏈式存儲。

順序存儲--邏輯上相鄰的記錄物理上也相鄰(類似於順序表)

鏈式存儲--邏輯上相鄰的記錄物理上不一定相鄰(類似於鏈表)

按照記錄存入的時間決定記錄的順序

  • 串結構:記錄之間的順序與關鍵字無關
  • 順序結構:記錄之間的順序按關鍵字排列

鏈式存儲:無論是定長/可變長記錄,都無法實現隨機存取,每次只能從第一個記錄開始依次往后查找。

順序存儲:

  • 可變長記錄:無法實現隨機存取。每次只能從第一個記錄開始依次往后查找
  • 定長記錄:可實現隨機存取。記錄長度為L,則第i個記錄存放的相對位置是i*L;若采用串結構,無法快速找到某關鍵字對應的記錄;若采用順序結構,可以快速找到某關鍵字對應的記錄(如折半查找)

注:一般來說,考試題目中所說的"順序文件"指的是物理上順序存儲的順序文件。之后的講解中提到的順序文件也默認如此。可見,順序文件的缺點是增加/刪除一個記錄比較困難(如果是串結構則相對簡單)

索引文件

索引表本身是定長記錄的順序文件。因此可以快讀找到第i個記錄對應的索引項。

可將關鍵字作為索引號內容,若按關鍵字順序排列,則還可以支持按照關鍵字折半查找。

每當要增加/刪除一個記錄時,需要對索引表進行修改。由於索引文件有很快的檢索速度,因此主要用於對信息處理的及時性要求比較高的場合

另外,可以用不同的數據項建立多個索引表

image-20201213210612339

索引順序文件

索引順序文件是索引文件和順序文件思路的結合。索引順序文件中,同樣會為文件建立一個索引表,但不同的是:並不是每個記錄對應一個索引表項,而是一組記錄對應一個索引表項

image-20201213210820341

檢索效率分析

若一個順序文件有10000個記錄,則根據關鍵字檢索文件,只能從頭開始順序查找,平均須查找5000個記錄

若采用索引順序文件結構,可把10000個記錄分為√10000=100組,每組100記錄。則需要先順序查找索引表找到分組(共100個分組,因此索引表長度為100.,平均需要查50次),找到分組后,再在分組中順序查找記錄(每個分組100個記錄,因此平均需要查50次)。可見,采用順序文件結構后,平均查找次數減少為50+50=100次

多級索引順序文件

為了進一步提高檢索效率,可以為順序文件建立多級索引表。例如:對於一個含\(10^6\)個記錄的文件,可先為該文件建立一張低級索引表,每100個記錄為一組,故低級索引表中共有10000個表項(即10000個定長記錄),再把這10000個定長記錄分組,每組100個,為其建立頂級索引表,故頂級索引表中共有100個表項。

image-20201213211454182

文件目錄

文件控制塊

image-20201213212658660

目錄本身就是一種有結構文件,由一條條記錄組成。每條記錄對應一個在該放在該目錄下的文件。

image-20201213212823307

FCB的有序集合稱為"文件目錄",一個FCB就是一個文件目錄項。FCB中包含了文件的基本信息(文件名、物理地址、邏輯結構、物理結構等),存取控制信息(是否可讀/可寫、禁止訪問的用戶名單等),使用信息(如文件的建立時間、修改時間等)。

最重要,最基本的還是文件名、文件存放的物理地址。

FCB實現了文件名和文件之間的映射。使用戶(用戶程序)可以實現"按名存取"。

需要對目錄進行那些操作?

  • 搜索:當用戶要使用一個文件時,系統要根據文件名搜索目錄,找到該文件對應的目錄項。
  • 創建文件:創建一個新文件時,需要在其所屬的目錄中增加一個目錄項。
  • 刪除文件:當刪除一個文件時,需要在目錄中刪除相應的目錄項
  • 顯示目錄:用戶可以請求顯示目錄的內容,如顯示該目錄中的所有文件及相應屬性。
  • 修改目錄:某些文件屬性保存在目錄中,因此這些屬性變化時需要修改相應的目錄項(如:文件重命名)

目錄結構

單級目錄結構

早期操作系統並不支持多級目錄,整個系統中只建立一張目錄表,每個文件占一個目錄項。

image-20201213213716158

單級目錄實現了“按名存取”,但是不允許文件重名

在創建一個文件時,需要先檢查目錄表中有沒有重名文件,確定不重名后才能允許建立文件,並將新文件對應的目錄項插入目錄表中。

顯然,單級目錄結構不適用於多用戶操作系統。

兩級目錄結構

早期的多用戶操作,采用兩級目錄結構。分為主文件目錄(MFD,Master File Directory)和用戶文件目錄(UFD,User File Directort)

image-20201213214020894

允許不同用戶的文件重名。文件名雖然相同,但是對應的其實時不同的文件。

兩級目錄結構允許不同用戶的文件重名,也可以在目錄上實現實現訪問限制(檢查此時登錄的用戶名是否匹配)。但是兩級目錄結構依然缺乏靈活性,用戶不能對自己的文件進行分類。

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

image-20201213214255943

用戶(或用戶進程)要訪問某個文件時要用文件路徑名標識文件,文件路徑名是個字符串。各級目錄之間用“/”隔開。從根目錄出發的路徑稱為絕對路徑

顯然,每次都從根目錄開始查找,是很低效的。因此可以設置一個“當前目錄”。

當用戶想要訪問某個文件時,可以使用從當前目錄出發的“相對路徑”

可見,引入“當前目錄”和“相對路徑”后,磁盤的I/O的次數減少了。這就提升了訪問文件的效率。

樹形目錄結構可以很方便對文件進行分類,層次結構清晰,也能夠更有效地進行文件的管理和保護。但是,樹形結構不便於實現文件的共享。為此,提出了“無環圖目錄結構”。

無環圖目錄結構

image-20201213214923195

可以用不同的文件名指向同一個文件,甚至可以指向同一個目錄(共享同一目錄下的所有內容)。

需要為每個共享結點設置一個共享計數器,用於記錄此時有多少個地方在共享該結點。用戶提出刪除結點的請求時,只是刪除該用戶的FCB、並使共享計數器減1,並不會直接刪除共享結點。只有共享計數器減為0時,才刪除結點。

注意:共享文件不同於復制文件。在共享文件中,由於各用戶指向的是同一個文件,因此只要其中一個用戶修改了文件數據,那么所有用戶都可以看到文件數據的變化

索引結點(FCB的改進)

image-20201213215614552

當找到文件名對應的目錄項時,才需要將索引結點調入內存,索引結點中記錄了文件的各種信息,包括文件在外存中的存放位置,根據“存放位置”即可找到文件。

存放在外存中的索引結點稱為“磁盤索引結點”,當索引結點放入內存后稱為“內存索引結點”。

相比之下內存索引結點中需要增加一些信息,比如:文件是否被修改、此時有幾個進程正在訪問該文件等。

文件的物理結構(文件分配方式)

文件塊、磁盤塊

image-20201213220101527

在內存管理中,進程的邏輯地址空間被分為一個一個頁面;

同樣的,在外存管理中,為了方便對文件數據的管理,文件的邏輯地址也被分為了一個一個的文件“塊”。

於是文件的邏輯地址也可以表示為(邏輯塊號、塊內地址)的形式。

image-20201213220352312

文件分配方式-連續分配

連續分配方式要求每個文件在磁盤中占有一組連續的塊

image-20201213220512230

優點:

用戶給出要訪問的邏輯塊號,操作系統找到該文件對應的目錄項(FCB)...

物理塊號=起始塊號+邏輯塊號

當然,還需要檢查用戶提供的邏輯塊號是否合法(\(邏輯塊號 \ge 長度\) 就不合法 )

可以直接算出邏輯塊號對應的物理塊號,因此連續分配支持順序訪問和直接訪問(即隨機訪問)

讀取某個磁盤塊時,需要移動磁頭。訪問的兩個磁盤塊相隔越遠,移動磁頭所需時間就越長。

結論:連續分配的文件在順序讀/寫速度最快。

缺點:

image-20201213221200361

若此時文件A要拓展,需要在增加一個磁盤塊(總共需要連續的4個磁盤塊)。由於采用連續結構,因此文件A占用的磁盤塊必須是連續的。

因此只能將文件A全部“遷移”到綠色區域。

結論:物理上采用連續分配的文件不方便拓展

image-20201213221447200

結論:物理上采用連續分配,存儲空間利用率低,會產生難以利用的磁盤碎片。可以采用緊湊來處理碎片,但是需要耗費很大的時間代價。

總結

優點:支持順序訪問和直接訪問(即隨機訪問);連續分配的文件在順序訪問時速度最快

缺點:不方便文件拓展;存儲空間利用率低,會產生磁盤碎片。

文件分配方式-鏈接分配

鏈接分配采取離散分配的方式,可以為文件分散離散的磁盤塊。分為隱式鏈接顯式鏈接兩種。

隱式鏈接

image-20201213221959747

實現文件的邏輯塊號到物理塊號的轉變:

  1. 用戶給出要訪問的邏輯塊號i,操作系統找到該文件對應的目錄項(FCB)..
  2. 從目錄項中找到起始塊號(即0號塊),將0號邏輯塊讀入內存,由此知道1號邏輯塊存放的物理塊號,於是讀入1號邏輯塊,再找到2號邏輯塊的存放位置......以此類推

因此,讀入i號邏輯塊,總共需要i+1次磁盤I/O。

結論:采用鏈式分配(隱式鏈接)方式的文件,只支持順序訪問,不支持隨機訪問,查找效率低。另外,指向下一個盤塊的指針越需要耗費少量的存儲空間。

優點:采用隱式鏈接的鏈接分配方式,很方便文件拓展。另外,所有的空閑磁盤塊都可以被利用,不會有碎片問題,外存利用率高

顯式鏈接

把用於鏈接文件個物理塊的指針顯式地存放再一個表中。即文件分配表(FAT,File Allocation Table)

image-20201213222824608

注意:一個磁盤僅設置一張FAT。開機時,將FAT讀入內存,並常駐內存。FAT的各個表項在物理上連續存儲,且每一個表項長度相同,因此“物理塊號”字段可以是隱含的。

實現文件的邏輯塊號到物理塊號的轉變:

  1. 用戶給出要訪問的邏輯塊號i,操作系統內找到該文件對應的目錄項(FCB)...
  2. 從目錄項找到起始塊號,若i>0,則查詢內存中的文件分配表FAT,往后找到i號邏輯塊對應的物理塊號。邏輯塊號轉換成物理塊號的過程不需要讀磁盤操作

結論:采用鏈式分配(顯式鏈接)方式的文件,支持順序訪問,也支持隨機訪問(想訪問i號邏輯塊時,並不需要依次訪問之前的0~i-1號邏輯塊),由於塊號轉換的過程不需要訪問磁盤,因此相比於隱式鏈接來說,訪問速度快很多。

顯然,顯式鏈接也不會產生外部碎片,也可以很方便地對文件進行拓展。

缺點:文件分配表的需要占用一定的存儲空間。

文件分配方式-索引分配

索引分配允許文件離散地分配在各個磁盤塊中,系統會為每個文件建立一張索引表,索引表記錄了文件的各個邏輯塊對應的物理塊(索引表的功能類似內存管理中的頁表--建立邏輯頁面到物理頁之間的映射關系)。索引表存放的磁盤稱為索引塊。文件數據存放的磁盤塊稱為數據塊

image-20201213224325732

實現文件的邏輯塊號到物理塊號的轉變:

  1. 用戶給出要訪問的邏輯塊號i,操作系統內找到該文件對應的目錄項(FCB)...
  2. 從目錄項中可知索引表存放位置,將索引表從外存讀入內存,並查找索引表即可知i號邏輯塊在外存中的存放位置。

可見,索引分配方式可以支持隨機訪問。文件拓展也很容易實現(只需要給文件分配一個空閑塊,並增加一個索引表項即可);但是索引表需要占用一定的存儲空間。

解決一個磁盤塊無法裝下文件的整張索引表:

  1. 鏈接方案:如果索引表太大,一個索引塊裝不下,那些可以將多個索引塊鏈接起來存放。

    image-20201213225306754

  2. 多層索引:建立多層索引(原理類似多級頁表)。使第一層索引庫指向第二層的索引庫。還可根據文件大小的要求再建立第三層、第四層索引庫。

    image-20201213225653698

    若采用多層索引,則各層索引表大小不能超過一個磁盤塊

    若采用k層索引結構,且頂級索引表未調入內存,則訪問一個數據塊只需要k+1次讀磁盤操作。

  3. 混合索引:多種索引分配方式的結合。例如,一個文件的頂級索引表中,既包含直接地址索引(直接指向數據塊),又包含一級間接索引(指向單層索引表)、還包含兩級間接索引(指向兩層索引)

超級超級超級考點:

  1. 要會根據多層索引、混合索引的結構計算出文件的最大長度(key:各級索引表最大不能超過一個塊);
  2. 要能自己分析訪問某個數據塊所需要的讀磁盤次數(key:FCB會存有指向頂級索引塊的指針,因此可以根據FCB讀入頂級索引塊。每次讀入下一級的索引塊都需要依次讀磁盤操作。另外,要注意題目條件--頂級索引塊是否已調入內存

總結

image-20201213230931703

文件存儲空間管理

安裝Windows操作系統的時候,一個必經步驟是--為磁盤分區(C:盤、D:盤、E:盤等)

image-20201214122406592

空閑表法

適用於“連續分配方式”

image-20201214122435391

如何分配磁盤塊:與內存管理中的動態分區分配很類似,為一個文件分配連續的存儲空間。同樣可采用首次適應、最佳適應、最壞適應等算法來決定要為文件分配哪個區間。

如何回收磁盤塊:與內存管理中的動態分區分配很類似,當回收某個存儲區時需要有四種情況--①回收區的前后都沒有相鄰空閑區;②回收區的前后都是空閑區;③回收區前面是空閑區;④回收區后面是空閑區。總之,回收時需要注意表項的合並問題。

空閑鏈表法

空閑盤塊鏈

以盤塊為單位組成一條空閑鏈

image-20201214123501252

操作系統保存着鏈頭、鏈尾指針。

如何分配:若某個文件申請k個盤塊,則從鏈頭開始依次摘下k個盤塊分配,並修改空閑鏈的鏈頭指針。

如何回收:回收的盤塊依次掛到鏈尾,並修改空閑鏈的鏈尾指針。

適用於離散分配的物理結構。為文件分配多個盤塊時可能要重復多次操作。

空閑盤區鏈

以盤區為單位組成一條空閑鏈

image-20201214123544421

操作系統保存着鏈頭、鏈尾指針。

如何分配:若某個文件申請k個盤塊,則可以采用首次適應、最佳適應等算法,從鏈頭開始檢索,按照算法規則找到一個大小符合要求的空閑盤區,分配給文件。若沒有合適的連續空閑塊,也可以將不同盤區的盤塊同時分配給一個文件,注意分配后可能要修改相應的鏈指針、盤區大小等數據。

如何回收:若回收區和某個空閑盤區相鄰,則需要將回收區合並到空閑盤區中。若回收區沒有和任何空閑區相鄰,將回收區作為單獨的一個空閑盤區掛到鏈尾。

離散分配、連續分配都適用。為一個文件分配多個盤塊時效率更高。

位示圖法

image-20201214133428733

位示圖:每個二進制對用一個盤塊。在本例中,“0”代表盤塊空閑,“1”代表盤塊已分配。位示圖一般用連續的“字”來表示,如本例中一個字的字長是16位,字中的每一位對應一個盤塊。因此可以用(字號,位號)對應一個盤塊號。當然有的題目中頁描述為(行號,列號)

重要重要重要:要能自己推出盤塊號與(字號,位號)相互轉換的公式。

注意題目條件:盤塊號、字號、位號到底是從0開始還是從1開始

如本例中盤塊號、字號、位號從0開始,若n表示字長,則

(字號,位號)=(i,j)的二進制位對應的盤塊號\(b=ni+j\)

b號盤塊對應的字號\(i=b/n\),位號\(j=b \% n\)

如何分配:若文件需要k個塊,①順序掃描位示圖,找到k個相鄰或不相鄰的“0”;②根據字號、位號算出對應的盤塊號,將相應盤塊分配給文件;③將相應位設置為“1”。

如何回收:①根據回收的盤塊號計算出對應的字號、位號;②將相應二進制位設為“0”。

成組鏈接法

空閑表法、空閑鏈表法不適用於大型文件系統,因為空閑表或空閑鏈表可能過大。UNIX系統中采用了成組鏈接法對磁盤空閑塊進行管理。

文件卷的目錄區中專門用一個磁盤塊作為“超級塊”,當系統啟動時需要將超級塊讀入內存。並且要保證內存與外存中的“超級塊”數據一致。

image-20201214134718342

如何分配:

Eg:需要100個空閑塊

①檢查第一個分組的塊數是否足夠。100=100,是足夠的。

②分配第一個分組中的100個空閑塊。但是由於300號塊內存放了再下一組的信息,因此300號塊的數據需要復制到超級塊中。

如何回收:

Eg:假設每個分組最多為100個空閑塊,此時第一個分組已有100塊,還要再回收一塊。需要將超級塊中的數據復制到新回收的塊中,並修改超級塊的內容,讓新回收的塊成為第一個分組。

文件的基本操作

創建文件

image-20201214135553180

進行Create系統調用時,需要提供的幾個主要參數:

  1. 所需的外存空間大小(如:一個盤塊,即1KB)
  2. 文件存放路徑(“D:/Demo”)
  3. 文件名(這個地方默認為“新建文本文檔.txt”

操作系統在處理Create系統調用時,主要做了兩件事:

  1. 在外存中找到文件所需的空間(結合空閑鏈表法、位示圖、成組鏈接法等管理策略,找到空閑空間)
  2. 根據文件存放路徑的信息找到該目錄對應的目錄文件,在目錄中創建該文件對應的目錄項。目錄項包含了文件名、文件在外存中的存放位置等信息。

刪除文件

image-20201214140606572

進行Delete系統調用時,需要提供的幾個主要參數:

  1. 文件存放路徑(“D:/Demo”)
  2. 文件名(“test.txt”)

操作系統在處理Delet系統調用時,主要做了幾件事:

  1. 根據文件存放路徑找到相應的目錄文件,從目錄中找到文件名對應的目錄項。
  2. 根據該目錄項記錄的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盤塊。(回收磁盤塊時,根據空閑表法、空閑鏈表法、位圖法等管理策略的不同,需要做不同的處理)
  3. 從目錄表中刪除文件對應的目錄項。

打開文件

image-20201214141422949

在很多操作系統中,在對文件進行操作之前,要求用戶先使用open系統調用“打開文件”,需要提供的幾個主要參數:

  1. 文件存放路徑(“D:/Demo”)
  2. 文件名(“test.txt”)
  3. 要對文件的操作類型(如:r只讀;rw讀寫等)

操作系統在處理open系統調用時,主要做了幾件事:

  1. 根據文件存放路徑找到相應的目錄文件,從目錄中找到文件名對應的目錄項,並檢查該用戶是否有指定的操作權限。
  2. 將目錄項復制到內存中“打開文件表”中。並將對應標目的編號返回給用戶。之后用戶使用打開文件表的編號來指明要操作的文件。

image-20201214141445775

關閉文件

image-20201214141527233

進程使用完文件后,要“關閉文件”

操作系統在處理Close系統調用時,主要做了幾件事:

  1. 將進程的打開文件表相應表項刪除
  2. 回收分配給該文件的內存空間等資源
  3. 系統打開文件表的打開計數器count減1,若count=0,則刪除對應表項。

讀文件

image-20201214141733093

進程使用read系統調用完成讀操作。需要指明是哪個文件(在支持“打開文件”操作的系統中,只需要提供文件在打開文件表中的索引號即可),還需要指明要讀入多少數據、指明讀入的數據要放在內存中的什么位置。

操作系統在處理read系統調用時,會從讀指針的外存中,將用戶指定大小的數據讀入用戶指定的內存區域中。

寫文件

image-20201214141733093

進程使用write系統調用完成寫操作。需要指明是哪個文件(在支持“打開文件”操作的系統中,只需要提供文件在打開文件表中的索引號即可),還需要指明要寫出多少數據、寫回外存的數據放在內存中的什么位置

操作系統在處理write系統調用時,會從用戶指定的外存區域中,將指定大小的數據寫回指針指向的外存。

文件共享

基於索引結點的共享方式(硬鏈接)

索引結點,是一種文件目錄瘦身策略。由於檢索文件時只需用到文件名,因此可以將除了文件名之外的其他信息放到索引結點中。這樣目錄項就只需要包含文件名、索引結點指針。

image-20201214142443370

索引結點中設置一個鏈接計數變量,用於表示鏈接到本索引結點的用戶目錄項數。

若count=2,說明此時有兩個用戶目錄項鏈接到該索引結點上,或者說是有兩個用戶在共享此文件。

若某個用戶決定“刪除”該文件,則只是要把用戶目錄中與該文件對應的目錄項刪除,且索引結點的count值減1。

若count>0,說明還有別的用戶要使用該文件,暫時不能把文件數據刪除,否則會導致指針懸空。

若count=0時系統負責刪除文件。

基於符號鏈的共享方式(軟鏈接)

image-20201214143408750

當User訪問“ccc”時,操作系統判斷文件“ccc”屬於Link類型文件,於是會其中記錄的路徑層層查找目錄,最終找到User1的目錄表中的“aaa”表項,於是就找到了文件1的索引結點。

即使軟鏈接指向的共享文件已被刪除,Link型文件依然存在,只是通過Link型文件中的路徑去查找共享文件會失敗(找不到對應目錄項)

由於用軟鏈接的方式訪問共享文件時要查詢多級目錄,會有多次磁盤I/O,因此用軟鏈接訪問。

文件保護

口令保護

為文件設置一個“口令”(如:abc112233),用戶請求訪問該文件時必須提供“口令”。

口令一般存放在文件對應的FCB或索引系結點中。用戶訪問文件前需要先輸入“口令”,操作系統會將用戶提供的口令與FCB存儲的口令進行對比,如果正確,則允許該用戶訪問文件。

優點:保存口令的空間開銷不多,驗證口令的時間開銷也很小。

缺點:正確的“口令”存放在系統內部,不夠安全。

加密保護

使用“某個”密碼對文件進行加密,在訪問文件時需要提供正確的“密碼”才能對文件進行正確的解密。

優點:保密性強,不需要在系統中存儲“密碼”

缺點:編碼/譯碼,或者說加密/解密需要花費一定時間。

訪問控制

在每個文件的FCB(或索引結點)中增加一個訪問控制列表(Access-Control List,ACL),該表中記錄了各個用戶可以對該文件執行那些操作。

image-20201214153703395

簡潔的訪問列表:以“組”為單位,標記各"組"用戶可以對文件執行那些操作。

如:分為系統管理員、文件主、文件主的伙伴、其他用戶幾個分組。

當某用戶想要訪問文件時,系統會檢查該用戶所屬的分組是否有相應的訪問權限。

image-20201214153833310

文件系統層次結構

image-20201214154606656

用戶接口:文件系統需要向上層的用戶提供一些簡單易用的功能接口。這層就是用於處理用戶發出的系統調用請求(Read、Write、Open、Close等系統調用)

文件目錄系統:用戶是通過文件路徑來訪問文件的,因此這一層需要根據用戶給出的文件路徑找到相應的FCB或索引結點。所有和目錄、目錄項相關的管理工作都在本層完成,如:管理活躍的文件目錄表、管理打開文件表等。

存取控制模塊:為了保證文件數據的安全,還需要驗證用戶是否有訪問權限。這一層主要完成了文件保護相關功能。

邏輯文件系統與文件信息緩沖區:用戶指明想要訪問文件記錄號,這一層需要將記錄號轉換為對應的邏輯地址。

物理文件系統:這一層需要把上一層提供的文件邏輯地址轉換為實際的物理地址。

輔助分配模塊:負責文件存儲空間的管理,即負責分配和回收存儲空間。

設備管理模塊:直接與硬件交互,負責和硬件直接相關的一些管理工作。如:分配設備、分配設備緩沖區、磁盤調度、啟動設備、釋放設備等。

用一個例子來輔助記憶文件系統的層次結構:

假設某用戶請求刪除文件”D:/工作目錄/學生信息.xlsx“的最后記錄

  1. 用戶需要通過操作系統提供的接口發生上述請求--用戶接口
  2. 由於用戶提供的是文件的存放路徑,因此需要操作系統一層一層地查找目錄,找到對應的目錄項--文件目錄系統
  3. 不同的用戶對文件有不通的操作權限,因此為了保證安全,需要檢查用戶是否有訪問權限--存取控制模塊(存取控制驗證層)
  4. 驗證了用戶的訪問權限之后,需要把用戶提供的“記錄號”轉換為對應的邏輯地址--邏輯文件系統與文件信息緩沖區
  5. 知道了目標記錄對應的邏輯地址后,還需要轉換成實際的物理地址--物理文件系統
  6. 要刪除這條記錄,必定要對磁盤設備發出請求--設備管理程序模塊
  7. 刪除這些記錄后,會有一些磁盤空閑,因此要將這些空閑盤塊回收--輔助分配模塊

磁盤的結構

磁盤、磁道、扇區

image-20201214161112941

磁盤:磁盤的表面由一些磁性物質組成,可以用這些磁性物質來記錄二進制數據

磁道:磁盤的盤面被划分成一個個磁道。這樣的一個“圈”就是一個磁盤。

扇區:一個磁盤又被划分成一個個扇區,每個扇區一個“磁盤塊”。各個扇區存放的數據量相同(如1KB);最內側磁道上的扇區面積最小,因此數據密度最大。

如何在磁盤中讀/寫數據

image-20201214161527848

盤面、柱面

image-20201214161631129

磁盤的物理地址

可用(柱面號,盤面號,扇區號)來定位任意一個“磁盤塊”。在“文件的物理結構”中,我們經常提到文件數據存放在外存中的幾號塊,這個塊號就可以轉換成(柱面號,盤面號,扇區號)的地址形式。

可根據該地址讀取一個“塊”:

  1. 根據“柱面號”移動磁臂,讓磁頭指向指定柱面;
  2. 激活指定盤面對應的磁頭;
  3. 磁盤旋轉的過程中,指定的扇區會從磁頭下面划過,這樣就完成了對指定扇區的讀/寫。

磁盤的分類

image-20201214162239194

image-20201214162249269

image-20201214162332501

磁盤調度算法

一次磁盤讀/寫操作需要的時間

尋找時間(尋道時間)\(T_s\):在讀/寫操作前,將磁頭移動到指定磁道所花的時間。

  1. 啟動磁頭臂是需要時間的。假設耗時為s;
  2. 移動磁頭也是需要時間的。假設磁頭勻速移動,每跨越一個磁道耗時為m,總共需要跨越n條磁道。

\(尋道時間T_s=s+m*n\)

延遲時間\(T_r\)通過旋轉磁盤,使磁頭定位到目標扇區所需要的時間。設磁盤轉速為r(單位:轉/秒,或 轉/分),則\(平均所需的延遲時間T_r=(1/2)*(1/r)=1/(2r)\)

傳輸時間\(T_t\):從磁盤讀出或向磁盤寫入數據所經歷的時間,假設磁盤轉速為r,此次讀/寫的字節數為b,每個磁道上的字節數為N。則:\(傳輸時間T_t=(1/r)*(b/N)=b/(rN)\)

總的平均存取時間\(Ta=T_s+1/2r+b/(rN)\)

延遲時間和傳輸時間都與磁盤轉速相關,且為線性相關。而轉速使硬件的固有屬性,因此操作系統也無法優化延遲時間和傳輸時間。但是操作系統的磁盤調度算法會直接影響尋道時間。

先來先服務算法(FCFS)

根據進程請求范圍跟磁盤的先后順序進行調度。

image-20201214164313545

優點:公平;如果請求訪問的磁道比較集中的花,算法性能還算過的去。

缺點:如果有大量進程競爭使用磁盤,請求訪問的磁道很分散,則FCFS在性能上很差,尋道時間長。

最短尋找時間優先(SSTF)

SSTF算法會優先處理的磁道使與當前磁頭最近的磁道。可以保證每次的尋道時間最短,但是並不能保證總的尋道時間最短(其實就是貪心算法的思想,只是選擇眼前最優,但是總體未必最優)

image-20201214164813518

優點:性能較好,平均尋道時間短

缺點:可能產生“飢餓”現象。

掃描算法(SCAN)

SSTF算法會產生飢餓的原因在於:磁頭有可能在一個小區域內來回來去地移動。為了防止這個問題,可以規定,只有磁頭移動到最外側磁道的時候才能往內移動,移動到最內側磁道的時候才能往外移動。這就是掃描算法(SCAN)的思想。由於磁頭移動的方式很像電梯,因此也叫電梯算法

image-20201214165355025

優點:性能較好,平均尋道時間較短,不會產生飢餓現象。

缺點:

  1. 只有到達最邊上的磁道時才能改變磁頭移動方向,事實上,處理了184號磁道的訪問請求之后就不需要再往右移動刺頭了。
  2. SCAN算法對於各個位置磁道的響應頻率不平均(如:假設此時磁頭正在往右移動,且剛處理過90號磁道,那么下次處理90號磁道的請求就需要等磁頭移動很長一段距離;而響應了184號磁道的請求之后,很快又可以再次響應184號磁道的請求了)

LOOK調度算法

掃描算法(SCAN)中,只有到達最邊上的磁道時才能改變磁頭移動方向,事實上,處理了184號磁道的訪問請求之后就不需要再往右移動磁頭了。LOOK調度算法就是為了解決這個問題,如果在磁頭移動方向上已經沒有別的請求,就可以立即改變磁頭移動方向。(邊移動邊觀察,因此叫LOOK)

image-20201214165824186

優點:比起SCAN算法來,不需要每次都移動到最外側或最內側才改變磁頭方向,使尋道時間進一步縮短。

循環掃描算法(C-SCAN)

SCAN算法對於各個位置磁道的響應頻率不平均,而C-SCAN算法就是為了解決這個問題。規定只有磁頭朝某個特定方向移動時才處理磁道訪問請求,而返回時直接快速移動至起始端而不處理任何請求

image-20201214170555059

優點:比起SCAN來,對於各個位置磁道的響應頻率很平均。

缺點:只有到達最邊上的磁道才能改變磁頭移動方向,事實上,處理了184號磁道的訪問請求之后就不需要再往右移動磁頭了;並且,磁頭返回時其實只需要返回到18號磁道即可,不需要返回到最邊緣的磁道。另外,比起SCAN算法來,平均尋道時間更長。

C-LOOK算法

C-SCAN算法的主要缺點時只有到達最邊上的磁道時才能改變磁頭移動方向,並且磁頭返回時不一定需要返回最邊緣的磁道上。C-LOOK算法就是為了解決這個問題。如果磁頭移動的方向上已經沒有磁道訪問請求了,就可以立即讓磁頭返回,並且磁頭只需要返回到有磁道訪問請求的位置即可。

image-20201214171237145

優點:比起C-SCAN算法來,不需要每次都移動到最外側或最內側才改變磁頭方向,使尋道時間進一步縮短。

減少延遲時間的方法

image-20201214171733800

交替編號

采用交替編號的策略,即讓邏輯上相鄰的扇區在物理上有一定的間隔,可以使讀取連續的邏輯扇區所需要的延遲時間更小。

具體做法:讓編號相鄰的扇區在物理上不相鄰

原理:讀取完一個扇區需要一段時間處理才可以繼續讀入下一個扇區。

磁盤地址結構的設計

假設某磁盤有8個柱面/磁道(假設最內側柱面/磁道號為0),4個盤面,8個扇區。則可用三個二進制位表示柱面,2個二進制位表示盤面,3個二進制位表示扇區。

若物理地址結構是(盤面號,柱面號,扇區號),且需要連續讀取物理地址(00,000,000)~(00,001,111)的扇區:

(00,000,000)~(00,000,111)轉兩圈可讀完。

之后再讀取物理地址相鄰的區域,即(00,001,000)~(00,001,111),需要啟動磁頭臂,將磁頭移動到下一個磁道

若物理地址結構是(柱面號,盤面號,扇區號),且需要連續讀取物理地址(00,000,000)~(00,001,111)的扇區:

(00,000,000)~(00,000,111)由盤面0的磁頭讀入數據

之后再讀取物理地址相鄰的區域,即(00,001,000)~(00,001,111),由於柱面號/磁道號相同,只是盤面號不同,因此不需要移動磁頭臂。只需要激活相鄰盤面的磁頭即可。

讀取地址連續的磁盤塊時,采用(柱面號,盤面號,扇區號)的地址結構可以減少磁頭移動消耗的時間。

錯位命名

image-20201214173627847

image-20201214173738187

具體做法:讓相鄰盤面的扇區編號“錯位”

原理:與“交替編號”的原理相同。“錯位命名法可降低延遲時間”

磁盤的管理

磁盤初始化

磁盤初始化:

  1. Step1:進行低級格式(物理格式化),將磁盤的各個磁道划分為扇區。一個扇區通常可分為頭、數據區域(如512B大小)、尾三個部分組成。管理扇區所需要的各種數據結構一般存放在頭、尾兩個部分,包括扇區校驗碼(如奇偶校驗、CRC循環冗余校驗碼等,校驗碼用於校驗扇區的數據是否發生錯誤)
  2. Stop2:將磁盤分區,每個分區由若干個柱面組成(即分為我們熟悉的C盤、D盤、E盤)
  3. Step3:進行邏輯格式化,創建文件系統。包括創建文件系統的根目錄、初始化存儲空間管理所用的數據結構(如:位示圖、空閑分區表)

引導塊

計算機開始時需要進行一系列初始化的工作,這些初始化工作是通過執行初始化程序(自舉程序)完成的。

image-20201214180149765

壞塊的管理

壞了、無法正常使用的是遷怒就是“壞塊”。這屬於硬件故障,操作系統是無法修復的。應該將壞塊標記出來,以免錯誤地使用到它。

對於簡單的磁盤,可以在邏輯格式化時(建立文件系統時)對整個磁盤進行壞塊檢查,標明哪些扇區是壞扇區,比如:在FAT表上標明。(在這種方式中,壞塊對操作系統不透明

對於復雜的磁盤,磁盤控制器(磁盤設備內部的一個硬件部位)會維護一個壞塊鏈表。

會保留一些“備用扇區”,用於替換壞塊。這種方案稱扇區備用。且這種處理方式中,壞塊對操作系統透明


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM