一、前言
本篇是操作系統系列的最后一篇,文件管理,由於系統的內存有限並且不能長期保存,故平時總是把它們以文件的形式存放在外存中,需要時再將它們調入內存。如何高效的對文件進行管理是操作系統實現的目標。
二、文件和文件系統
現代OS幾乎都是通過文件系統來組織和管理在計算機中所存儲的大量程序和數據的。文件系統的管理功能是通過把它所管理的程序和數據組織成一系列文件的方法來實現的。而文件則是指具有文件名的若干相關元素的集合。元素通常是記錄,而記錄是一組有意義的數據項的集合。可以把數據組成分為數據項、記錄、文件。
① 數據項,數據項是最低級數據組織形式。分為基本數據項(用於描述一個對象某種屬性的字符集,是數據組織中可以明明的最小邏輯數據單位,即原子數據,又稱為數據元素或字段)和組合數據項(由若干個基本數據項組成)
② 記錄,是一組相關數據項的集合,用於描述一個對象在某方面的屬性,為了能夠唯一標識一個記錄,需要在記錄中確定一個或集合數據項,把他們的集合稱為關鍵字,關鍵字是能夠唯一標識一個記錄的數據項。
③ 文件,文件是具有文件名的一組相關元素的集合,分為有結構文件和無結構文件。有結構文件由若干個相關記錄組成,無結構文件則被看成一個字符流。文件是文件系統的最大數據單位。文件應該具有自己的屬性,包括文件類型(如源文件、目標文件、可執行文件等),文件長度(文件的當前長度,也可能是最大允許長度),文件的物理位置(指示文件在哪一個設備上及在該設備的哪個位置的指針),文件的建立時間(文件最后一次修改時間)。
一個文件可對應若干個記錄,一個記錄可對應若干個數據項。
文件系統管理的對象有:文件(作為文件管理的直接對象),目錄(為了方便用戶對文件的存取和檢索,在文件系統中配置目錄,每個目錄項中,必須含有文件名及該文件所在的物理地址,對目錄的組織和管理是方便和提高對文件存取速度的關鍵),磁盤(磁盤)存儲空間(文件和目錄必定占用存儲空間,對這部分空間的有效管理,不僅能提高外存的利用率,而且能提高對文件的存取速度)。
2.1 文件操作
① 創建文件,在創建一個新文件時,系統首先要為新文件分配必要的外存空間,並在文件系統的目錄中,為之建立一個目錄項,目錄項中應該記錄新文件的文件名及其在外存的地址等屬性。
② 刪除文件,當已不再需要某文件時,可將其從文件系統中刪除,在刪除時,系統應先從目錄中找到要刪除文件的目錄項,使之成為空項,然后回收該文件所占用的存儲空間。
③ 讀文件,讀文件時,須在相應系統調用中給出文件名和應讀入的內存目標地址。此時,系統要查找目錄,找到指定目錄項,從中得到被讀文件在外存中的位置。在目錄項中,還有一個指針用於對文件進行讀/寫。
④ 寫文件,寫文件時,須在相應系統調用中給出文件名和其在內存源地址。此時,系統要查找目錄,找到指定目錄項,從再利用目錄中的寫指針進行寫操作。
⑤ 截斷文件,如果一個文件的內容已經陳舊而需要全部更新時,一種方法是將此文件刪除,再重新創建一個新文件,但如果文件名和屬性均無改變,則可采取截斷文件的方法,其將原有的文件長度設置為0,放棄原有文件的內容。
⑥ 設置文件的讀/寫位置,用於設置文件讀/寫指針的位置,以便每次讀/寫文件時,不需要從始端開始而是從所設置的位置開始操作。可以改順序存取為隨機存取。
當前OS所提供的大多數對文件的操作,其過程大致都是這樣兩步:首先,檢索文件目錄來找到指定文件的屬性及其在外存上的位置;然后,對文件實施相應的操作,如讀/寫文件等,當用戶要求對一個文件實施多次讀/寫或其他操作時,每次都要從檢索目錄開始,為了避免多次重復地檢索目錄,在大多數OS中都引入了打開這一文件系統調用,當用戶第一次請求對某文件系統進行操作時,先利用open系統調用將該文件打開。
打開是指系統將指名文件的屬性(包括該文件在外存上的物理位置)從外存拷貝到內存打開文件表的一個表目中,並將該表目的編號(索引號)返回給用戶,以后,當用戶再要求對該文件進行操作時,便可利用系統所返回的索引號向系統提出操作請求,系統便可直接利用該索引號到打開文件表中去查找,從而避免了對該文件的再次檢索,如果用戶不再需要對該文件實施操作,可利用關閉系統調用來關閉此文件,OS將會把該文件從打開文件表中的表目上刪除掉。
三、文件的邏輯結構
對任何的文件,都存在以下兩種形式的結構
① 文件的邏輯結構,這是從用戶觀點出發所觀察到的文件組織形式,是用戶可以直接處理的數據及其結構,獨立於文件的物理特性,又稱為文件組織。
② 文件的物理結構,又稱為文件的存儲結構,是指文件在外存上的存儲組織形式,不僅與存儲介質有關,還與外存分配方式有關。
3.1 文件邏輯結構的類型
文件的邏輯結構可分為兩大類,一類是有結構文件,這是指由一個以上的記錄構成的文件,故把他稱為記錄式文件,另一類是無結構文件,這是指由字符流構成的文件,又稱為流式文件。
① 有結構文件,每個記錄都用於描述實體集中的一個實體,各記錄有着相同或不同數目的數據項,記錄分為定長記錄(文件中所有記錄的長度都是相同的,所有記錄中的各數據項都處在記錄中相同的位置,具有相同的順序和長度)和變長記錄(文件中個記錄的長度不相同,可能由於一個記錄中所包含的數據項目並不相同)。根據用戶和系統的需要,可采用多種方式來組織這些記錄,如順序文件(記錄按照某種順序排列所形成的文件,記錄通常是定長的,能較快查找到文件中的記錄),索引文件(記錄為可變長度時,通常建立一張索引表,並為每個記錄設置一個表項,加快對記錄檢索的速度),索引順序文件(為文件建立一張索引表,為每一組記錄中的第一個記錄設置一個表項)。
② 無結構文件,對於源程序、可執行文件、庫函數等通常采用的是無結構文件形式,即流式文件,其長度以字節為單位。
3.2 順序文件
文件是記錄的集合,文件中的記錄可以是任意順序的,因此,它可以按照各種不同的順序進行排列,一般地,可歸納為以下兩種情況。
① 串結構,個記錄之間的順序與關鍵字無關,通常按照時間先后排序,最先存入的記錄作為第一個記錄,其次,為第二個記錄,以此類推。
② 順序結構,文件中所有記錄按照關鍵字排列,可以按照關鍵詞長度從大到小排列。順序結構的檢索效率更高。
順序文件的最佳應用場合是在對諸記錄進行批量存取時,即每次要讀或寫一大批記錄時,此時,對順序文件的存取效率是所有邏輯文件中最高的,此外,只有順序文件才能存儲在磁帶上,並能有效工作。但是想要增加或刪除一個文件比較困難。
3.3 索引文件
對於定長記錄文件,可以方便的實現順序存取和直接存取,然而,對於變長記錄就很難實現。為了解決變長記錄檢索問題,可為變長記錄文件建立一張索引表,對主文件中的每個記錄,在索引表中設有一個相應的表項,用於記錄該記錄的長度L及指向該記錄的指針(指向該記錄在邏輯地址空間的首址),由於索引表示按記錄鍵排序的,因此,索引表本身是一個定長記錄的順序文件。從而可以方便實現直接存取。
在對索引文件進行檢索時,首先根據用戶(程序)提供的關鍵字,並利用折半查找檢索索引表,從中找到相應的表項,再利用該表項給出的指向記錄的指針值,去訪問所需的記錄。每當要向索引文件中增加一個新紀錄時,便須對索引表進行修改。索引表的問題在於除了有主文件外,還需要配置一張索引表,每個記錄需要有一個索引項,因此提高了存儲費用。
3.4 索引順序文件
其有效克服了變長記錄不便於直接存取的缺點,而且所付出的代價也不算太大,它是順序文件和索引文件相結合的產物,它將順序文件中的所有記錄分為若干個組,為順序文件建立一張索引表,在索引表中為每組中的第一個記錄建立一個索引項,其中含有該記錄的鍵值和指向記錄的指針。
在對索引順序文件進行檢索時,首先利用用戶(程序)所提供的關鍵字及某種查找算法去檢索索引表,找到該記錄組中的第一個記錄的表項,從中得到該記錄組第一個記錄在主文件中的位置,然后,再利用順序查找法去查找主文件,從中找出所要求的記錄。
3.5 直接文件
對於直接文件,則根據給定的記錄鍵值,直接獲得指定記錄的物理地址,換言之,記錄鍵值本身就決定了記錄的物理地址,這種由記錄鍵值到記錄物理地址的轉換被稱為鍵值轉換。
3.6 哈希(Hash)文件
利用Hash函數可將記錄鍵值轉換為相應記錄的地址,為了能實現文件存儲空間的動態分配,通常由Hash函數所求得的並非是相應記錄的地址,而是指向一目錄表相應表目的指針,該表目的內容指向相應記錄所在的物理塊。
四、外存分配方式
由於磁盤具有可直接訪問的特性,故當磁盤來存放文件時,具有很大的靈活性。而文件的物理結構與外村分配方式有關,在采用連續分配方式時的文件物理結構是順序式的文件結構,在采用鏈接分配方式將形成鏈接式文件結構,而索引分配方式將形成索引式文件結構。
4.1 連續分配
連續分配要求為每個文件分配一組相鄰接的盤塊,一組盤塊地址定義了磁盤上的一段線性地址。采用連續分配方式時,可把邏輯文件中的記錄順序地存儲到鄰接的各物理盤塊中,這樣所形成的文件結構稱為順序文件結構,這種分配方式保證了邏輯文件中的記錄順序與存儲器中文件占用盤塊的順序的一致性。下圖為連續分配方式(假設記錄與盤塊一樣大)。
如同動態分配分區分配一樣,隨着文件建立時空間的分配和文件刪除時的空間回收,將使磁盤空間被分割成許多小塊,這些小塊的連續去已難以存儲文件,此即外存的碎片,同樣,可以使用緊湊的方法,將盤上所有的文件緊靠在一起,把所有的碎片拼成一大片連續的存儲空間。
連續分配的優點如下
① 順序訪問容易,訪問一個占有連續空間的文件非常容易。
② 順序訪問速度快,因為由連續分配所裝入的文件,其所占用的盤塊可能是位於一條或幾條相鄰的磁道上,這是,磁頭移動距離最少,這種對文件訪問的速度使幾種存儲空間分配方式中最高的一種。
連續分配的缺點如下
① 要求又連續的存儲空間,要為每個文件分配一段連續的存儲空間,這樣,便會產生許多外部碎片,嚴重地降低了外存空間利用率,定期緊湊會花費大量的機器時間。
② 必須實現知道文件的長度,事先知道文件的長度,然后根據其大小,在存儲空間中找出一塊其大小足夠的存儲區,將文件裝入,對於動態增長的文件非常低效。
4.2 鏈接分配
如果將一個邏輯文件存儲到外存上,並不要求為整個文件分配一塊連續的空間,而是可以將文件裝到多個離散的盤塊中,這樣就可以消除連續分配的缺點。采用鏈接分配方式時,可通過在每個盤塊上的鏈接指針,將同屬於一個文件的多個離散盤塊鏈接成一個鏈表,把這樣形成的物理文件稱為鏈接文件。鏈接分配采取離散分配方式,消除了外部碎片,故而顯著地提高了外存空間的利用率,並且對文件的增、刪、改、查十分方便。鏈接方式可分為隱式鏈接和顯示鏈接兩種形式。
① 隱式鏈接, 在文件目錄的每個目錄項中,都須含有指向鏈接文件第一個盤塊和最后一個盤塊的指針。
說明:第9個盤塊指向第16個盤塊,第16個盤塊指向第1個盤塊,第1個盤塊指向第10個盤塊,第10個盤塊指向第25個盤塊(結束塊)。
隱式鏈接分配的主要問題在於:其只適合於順序訪問,對隨機訪問的效率及其低效。此外,其可靠性較差,任何一個指針出現問題,都會導致整個鏈的斷開。可以將幾個盤塊組成一個簇,然后以簇為單位進行分配,會減少查找指定塊的時間,但是會增加內部碎片。
② 顯示鏈接,把用於鏈接文件各物理塊的指針,顯式的放在內存的一張鏈接表中,該表在整個磁盤僅設置一張。
說明:表的序號從0開始,直至N-1,N為盤塊總數,在每個表項中存放鏈接指針,即下一個盤塊號,在該表中,凡是屬於某一文件的第一個盤塊號,或者說是每一條鏈的鏈首指針所對應的盤塊號,均作為文件地址被填入相應的文件的FCB(File Control Block)的物理地址字段中,由於查找記錄的過程是在內存中進行的,因而提高了檢索速度,減少了訪問磁盤的次數,由於分配給文件的所有盤塊號都在該表中,故把該表稱為文件分配表FAT(File Allocation Table)。
鏈接分配的問題如下:不能支持高效的直接存儲(要對一個較大的文件進行直接存取,須首先在FAT中順序地查找很多盤塊號);FAT需要占用較大的內存空間(由於一個文件所占用的盤塊的盤塊號是隨機地分布在FAT中的,因而只有將整個FAT調入內存,才能保證FAT中找到一個文件的所有盤塊號,當磁盤容量較大時,FAT占用的容量更大)
③ 索引分配,事實上,在打開某個文件時,只需要把該文件占用的盤塊號的編號調入內存即可,完全沒有必要把整個FAT調入內存,為此,應該將每個文件所對應的盤塊號集中地放在一起,索引分配方式就是基於這種想法所形成的一種分配方式。其為每個文件分配一個索引塊(表),再把分配給該文件的所有盤塊號都記錄在該索引塊中,因而該索引塊就是一個含有許多磁盤塊號的數組。在建立一個文件時,只需要在位為之建立的目錄項中填上指向該索引塊的指針(單級索引)。
說明:索引方式支持直接訪問,可在索引塊中找到第i個盤塊,索引方式也不會產生外部碎片,當文件較大時,索引分配方式要優於鏈接分配方式。其主要問題在於:可能需要花費較多的外存空間,每當建立一個文件時,便須為之分配一個索引塊,將分配給該文件的所有盤塊號記錄其中。對於小文件而言,索引塊的利用率非常低。
當OS為一個大文件分配磁盤空間時,如果所分配的盤塊的盤塊號已經裝滿一個索引塊時,OS便為該文件分配另一個索引塊,用於將以后繼續為之分配的盤塊號記錄於其中,以此類推,然后再通過鏈指針將各索引塊按序鏈接起來,當文件太大時,索引塊太多,效率是低效的。此時,應該為這些索引塊再建立一級索引,稱為第一級索引,還可再建立索引,稱為第二級索引等等。稱為多級索引分配。
說明:在二級索引分配方式下,若每個盤塊的大小為1KB,每個盤塊號占4個字節,則在一個索引塊可以存放256個盤塊號,這樣,在兩級索引時,最多可以包括存放文件的盤塊號總數為64K(256 * 256)個盤塊號,所允許文件最大長度為64MB,若盤塊號為4KB,則一級索引的最大文件大小為4MB,二級索引的最大文件大小為4GB。
④ 混合索引分配方式,將多種索引分配方式相結合而形成的一種分配方式,如直接地址(在索引結點中設置10個直接地址項,每項中所存放的是該文件數據所在盤塊的盤塊號,假如每個盤塊大小為4KB,當文件不大於40KB時,可以直接從索引結點中讀出該文件的全部盤號),一次間接地址(利用索引結點中的地址項來提供一次間接地址,其實質就是一級索引分配方式,在一次簡直快中可存放1K個盤塊號,允許最大文件為4MB),多次間接地址(當文件大於4MB + 40KB時,系統采用二次間址分配方式,其實質是兩級索引分配方式,采用二次間址的最大文件大小為4GB,同理,可采用三次間接地址,允許文件最大大小為4TB)。
五、目錄管理
為了能夠對文件實施有效的管理,必須對它們加以妥善組織,這主要是通過文件目錄實現的,文件目錄也是一種數據結構,用於標識系統中的文件及其物理地址,供檢索時使用,對目錄的管理要求如下
① 實現按名存取,即用戶只須向系統提供所需訪問的文件的名字,便能夠快速准確地找到指定文件在外存上的存儲位置,這是目錄管理中最基本的功能。
② 提高對目錄檢索速度,通過合理地組織目錄結構的方法,可加快對目錄的檢索速度,從而提高對文件的存取速度。
③ 文件共享,在多用戶系統中,應該允許用戶共享一個文件。
④ 允許文件重名,系統應允許不同用戶對不同文件采用相同的名字,以便用戶按照自己的習慣給文件命名和使用文件。
5.1 文件控制塊
為了能對文件進行正確的存取,必須為文件設置用於描述和控制文件的數據結構,稱之為文件控制塊FCB,文件管理程序可借助於文件控制塊中的信息,對文件施加各種操作,文件與文件控制塊一一對應,而人們把文件控制塊的有序集合稱為文件目錄,一個文件控制塊就是一個文件目錄項。通常,一個文件目錄也可被看成是一個文件,稱為目錄文件。
文件控制塊包含基本信息、存取控制信息、使用信息。
① 基本信息,包括文件名(標識一個文件的符號名,在每個系統中,每個文件都有唯一的名字,用戶利用該名字進行存取);文件物理位置(指文件在外存上的存儲位置,包括存放文件的設備名、文件在外村上的起始盤塊號、指示文件所占用的盤塊數或字節數的文件長度);文件邏輯結構(指示文件是流式文件還是記錄式文件、記錄數,文件是定長還是變長記錄);文件物理結構(指示文件是順序文件、鏈式文件還是索引文件)
② 存取控制信息,包括文件主的存取權限、核准用戶的存取權限及一般用戶的存取權限。
③ 使用信息,包括文件的建立日期和時間、文件上一次修改的日期和時間及當前使用信息(這項信息包括當前已打開該文件的進程數、是否被其他進程鎖住、文件在內存中是否已被修改但尚未拷貝到盤上)
5.2 索引結點
文件目錄通常是存放在磁盤上的,當文件很多時,文件目錄可能要占用大量的盤塊,在查找的過程中,先將存放目錄文件的第一個盤塊中的目錄調入內存,然后把用戶所給定的文件名和目錄項中的文件名逐一對比。若未找到指定文件,則再將下一個盤塊中的目錄項調入內存。在檢索目錄文件時,只用到了文件名,僅當找到一個目錄項(即其中的文件名與指定要查找的文件名相匹配)時,才需要從該目錄項中讀出該文件的物理地址,而其他一些對該文件進行描述的信息,在檢索目錄時一概不用,顯然,這些信息在檢索目錄時不需要調入內存。為此,在有的系統中,如UNIX系統,便采用了把文件名和文件描述信息分開的方法,亦即,使文件描述信息單獨形成一個稱為索引結點的數據結構,簡稱為i結點,在文件目錄中的每個目錄項由文件名和指向該文件所對應的i結點的指針所構成。
每個文件都有唯一的磁盤索引結點(磁盤索引結點信息與文件名等信息一起構成了FCB),其主要包括內容如下
① 文件主標識符,即擁有該文件的個人或小組的標識符。
② 文件類型,包括正規文件、目錄文件或特別文件。
③ 文件存取權限,指各類用戶對該文件的存取權限。
④ 文件物理地址,每個索引結點中含有13個地址項(混合索引方式),他們以直接或間接的方式給出數據文件所在的盤塊的編號。
⑤ 文件長度,指以字節為單位的文件長度。
⑥ 文件連接計數,表明在本文件系統中所有指向該文件名的指針計數。
⑦ 文件存取時間,指本文件最近被進程存取的時間、最近被修改的時間及索引結點最近被修改的時間。
當文件被打開時,要將磁盤索引結點拷貝到內存索引結點中,便於以后使用,在內存索引結點中又增加了一下內容。
① 索引結點編號,用於標識內存索引結點。
② 狀態,指示i結點是否上鎖或被修改。
③ 訪問計數,每當有進程要訪問此i結點時,將訪問計數加1,訪問完再減1。
④ 文件所屬文件系統的邏輯設備號。
⑤ 鏈接指針,設置有分別指向空閑鏈表和散列隊列的指針。
5.3 目錄結構
目錄結構的組織,關系到文件系統的存取速度,也關系到文件的共享性和安全性,目前常用的目錄結構形式有單級目錄、兩級目錄、多級目錄。
① 單級目錄結構,在整個系統中只建立一張目錄表,每個文件占一個目錄項,目錄項中含文件名、文件擴展名、文件長度、文件類型、文件物理地址、狀態位(表示目錄項是否空閑)等。每當要建立一個新文件時,必須先檢查所有的目錄項,以保證新文件名在目錄中是唯一的,然后再從目錄表中找到一個空白目錄項,填入新文件的文件名及其他說明信息,並置狀態為1,刪除文件時,先從目錄中找到該文件的目錄項,回收該文件所占用的存儲空間,然后再清除該目錄項。單級目錄的有點是簡單並且能夠實現目錄管理的基本功能-按名存取,但是查找速度慢(查找一個目錄項要花費較多的時間),不允許重名(在一個目錄表中的所有文件,都不能與另一個文件有相同的名字,這是難以避免的),不便於實現文件共享(每一個用戶都有自己的名字空間或命名習慣,因此,應該允許不同用戶使用不同的文件名來訪問同一個文件) ② 兩級目錄結構,為每個用戶建立一個單獨的用戶文件目錄UFD(User File Directory),這些文件目錄具有相似的結構,由用戶所有文件的文件控制塊組成。此外,系統中還有一個主文件目錄MFD(Master File Directory),在主文件目錄中,每個用戶目錄文件都占有一個目錄項,其目錄項包括用戶名和指向用戶目錄文件的指針。
兩級目錄結構客服了單級目錄的缺點,具有如下優點:提高了檢索目錄的速度(如果在主目錄中有n個子目錄,每個用戶目錄最多為m個目錄項,則為查找一指定的目錄項,最多只需要檢索n+m個目錄項)。在不同的用戶目錄中,可以使用相同的文件名(只要在用戶自己的UFD中,每個文件名都是唯一的,不同用戶可以有文件名相同的文件)。不同用戶還可使用不同的文件名來訪問系統中同一個共享文件。但在多個用戶需要合作完成一個大任務時,不便於用戶之間共享文件。
③ 多級目錄結構,對於大型文件系統,通常采用三級或三級以上的目錄結構,以提高對目錄的檢索速度和文件系統的性能。多級目錄結構又稱為樹形目錄結構,主目錄被稱為根目錄,把數據文件稱為樹葉,其他的目錄均作為樹的結點。
說明:方框代表目錄文件,圓圈代表數據文件,主目錄中有是哪個用戶總目錄A、B、C,在B用戶的總目錄B中,又包括三個分目錄F、E、D,其中每個分目錄中又包含多個文件,為提高系統的靈活性,應該允許在一個目錄文件中的目錄項既是作為目錄文件的FCB,又是數據文件的FCB,這一信息可用目錄項中的一位來指示。如用戶A總目錄中,目錄項A是目錄文件FCB,而目錄項B和D則是數據文件的FCB。
在樹形目錄結構中,從根目錄到任何數據文件,都只有一條唯一的通路,在該路徑上從樹的根開始,把全部目錄文件名和數據文件名依次用"/"連接起來,即構成該數據文件的路徑名。系統中的每個文件都有唯一的路徑名。例如,用戶B訪問文件J,則使用路徑名/B/F/J來訪問。
當一個文件系統含有很多級時,每訪問一個文件,都要使用從樹根開始直到樹葉(數據文件)為止的、包含各中間節點(目錄)的全路徑名,這非常麻煩,可為每個進程設置一個當前目錄,又稱為工作目錄,進程對各文件的訪問都相對於當前目錄而進行的。把從當前目錄開始值得數據文件為止所構成的路徑名稱為相對路徑名,而把從樹根開始的路徑名稱為絕對路徑名。
④ 增加和刪除目錄,在樹形目錄結構中,用戶可為自己建立UFD,並可再創建子目錄,在用戶要創建一個新文件時,只需要查看自己的UFD及其子目錄中有無與新建文件相同的文件名,若無,便可在UFD或其某個子目錄中增加一個新目錄項。在樹形目錄中,如何刪除一個目錄,應該視情況而定,若要刪除的目錄為空,則簡單地將其刪除,使它在其上一級目錄中所對應的目錄項為空,若不為空,可采用如下方法:不刪除非空目錄(當目錄不為空時,為了刪除一個非空目錄,必須先刪除目錄中所有的文件,使之稱為空目錄,然后再刪除,如果目錄中包含有子目錄,則應該遞歸調用方式刪除),可刪除非空目錄(將目錄中的所有文件和子目錄同時刪除)。
5.4 目錄查詢技術
當用戶要訪問一個已存在的文件時,系統首先利用用戶提供的文件名對目錄進行查詢,找出該文件的文件控制塊或對應索引結點,然后,根據FCB或索引結點中所記錄的文件物理地址(盤塊號),換算出文件在磁盤上的物理位置,最后,再通過磁盤驅動程序,將所需文件讀入內存。目前常用的方式有線性檢索法和Hash方法。
① 線性檢索法,其又稱為順序檢索法,在樹形目錄中,用戶提供的文件名是由多個文件分量名組成的路徑名,此時須對多級目錄進行查找,假定用戶給定的文件路徑名為/usr/ast/mbox,則查找過程如下。
說明:首先,系統應先讀入第一個文件分量名usr,用它與根目錄文件(或當前目錄文件)中各目錄項中的文件名順序地進行比較,從中找到匹配者,並得到匹配項的索引結點號是6,再從6號索引結點中得到usr目錄文件放在132號盤塊中,將該盤塊內容讀入內存。接着,系統再將路徑名中的第二個分量名ast讀入,用它與放在132號盤塊中的第二級目錄文件中各目錄項的文件名順序進行比較,又找到匹配項,從中得到ast的目錄文件放在26號索引結點中,再從26號索引結點中得知/usr/ast是存放在496號盤塊中,再讀入496號盤塊。然后,將文件的第三個分量名mbox讀入,用它與第三季目錄文件/usr/ast中各目錄項的文件名進行比較,最后得到/usr/ast/mbox的索引結點號為60,即在60號索引結點中存放了指定文件的物理地址,目錄查詢操作到此結束,如果在順序查找過程中發現有一個文件分量名沒有找到,則停止查找,並返回文件未找到信息。
② Hash方法,系統利用用戶提供的文件名並將它轉換為文件目錄的索引值,再利用該索引值到目錄中去查找,這將提高檢索速度。
六、文件存儲空間管理
6.1 空閑表法
空閑表法屬於連續分配方式,它與內存的動態分配方式雷同,它為每個文件分配一塊連續的存儲空間,即系統也為外存上所有空閑區建立一張空閑表,每個空閑區對應於一個空閑表項,其中包括表項序號、該空閑區的第一個盤塊號、該區的空閑盤塊號等信息,再將所有空閑區按其起始盤塊號遞增排列。
空閑盤區的分配與內存的動態分配類似,同樣采用首次適應算法,循環首次適應算法等。系統在對用戶所釋放的存儲空間進行回收時,也采取類似於內存回收的方法,即考慮回收區是否與空閑表中插入點的前區和后區相鄰接,對相鄰接者應該予以合並。當文件較小時,采用連續分配方式,當文件較大時,可采用離散分配方式。
6.2 空閑鏈表法
空閑鏈表法是將所有空閑盤區拉成一條空閑鏈。把鏈表分成兩種形式,空閑盤塊鏈和空閑盤區鏈。
① 空閑盤塊鏈,這是將磁盤上的所有空閑空間,以盤塊為單位拉成一條鏈,當用戶因創建文件而請求分配存儲空間時,系統從鏈首開始,依次摘下適當數目的空閑盤塊分配給用戶,當刪除文件而釋放空間時,系統將回收的盤塊依次插入空閑盤塊鏈的末尾,其優點是用於分配和回收一個盤塊的過程簡單,但在為文件分配盤塊時,可能要重復操作多次。
② 空閑盤區鏈,這是將磁盤上的所有空閑盤區(每個盤區可包含若干個盤塊)拉成一條鏈,在每個盤區上除了含有只是下一個空閑盤區的指針外,還應有能指明本盤區大小(盤塊數)的信息。盤區分配與內存的動態分配類似,可采用首次適應算法,在回收盤區時,同樣也要將回收區和相鄰接的空閑盤區相合並,在采用首次適應算法時,可以采用顯式鏈接法提高檢索速度,在內存中為空閑盤區建立一張鏈表。
6.3 位示圖法
利用二進制的一位表示磁盤中的一個盤塊的使用情況,當其值為0時,表示對應的盤塊空閑,為1時,表示已經分配,磁盤上的所有盤塊都有一個二進制位與之對應,這樣,由所有盤塊所對應的位構成一個集合,稱為位示圖,通常可用m * n個位數來構成位示圖,並使m * n等於磁盤的總塊數。
對於盤塊的分配分為如下三步
① 順序掃描位示圖,從中找出一個或一組值為0的二進制位。
② 將所找到的一個或一組二進制位轉換成與之賭贏的盤塊號。
③ 修改位示圖。
對於盤塊的回收分為如下兩步
① 將回收盤塊的盤塊號轉換成位示圖中的行號和列號。
② 修改位示圖。
此方法的優點在於從位示圖中很容易找到一個或一組相鄰接的空閑盤塊,此外,由於位示圖很小,占用空間少,因而可將其保存在內存中,進而使在每次進行盤區分配時,無需首先把盤區分配表讀入內存,節省磁盤啟動時間。
6.4 成組鏈接法
空閑表法和空閑鏈表法都不適用於大型系統,因為這會使空閑表或空閑鏈表很長,在UNIX采用的成組鏈接法,結合上述兩種方法。
① 空線盤塊的組織,空閑盤塊棧用來存放當前可用的一組空閑盤塊的盤塊號(最多含100個號),以及棧中尚有的空閑盤塊號數N,順便指出,N兼做棧頂指針使用,棧是臨界資源,系統設置一把鎖供進程互斥訪問。其中,S.free(0)是棧底,棧滿時棧頂為S.free(99)。
② 文件區中的所有空閑盤塊被分成若干個組,如每100個盤塊作為一組。
③ 將每一組含有的盤塊總數N和該組所有的盤塊號記入其前一組的第一個盤塊S.free(0)~S.free(99)中,這樣,由各組的第一個盤塊可鏈接成一條鏈。
④ 將第一組的盤塊總數和所有的盤塊號記入空閑盤塊號棧中,作為當前可供分配的空閑盤塊號。
⑤ 最末一組只有99個盤塊,其盤塊號分別記入其前一組的S.free(1)~S.free(99)中,而在S.free(0)中則存放0,作為空閑盤塊鏈的結束。
當系統要為用戶分配文件所需的盤塊時,須調用盤塊分配過程來完成。該過程首先檢查空閑盤塊號棧是否上鎖,如未上鎖,便從 棧頂取出一空閑盤塊號,將與之對應的盤塊分配給用戶,然后將棧頂指針下移一格。若該盤塊號已是棧底,即S.free(0),這是當前棧中最后一個可分配的 盤塊號。由於在該盤塊號所對應的盤塊中記有下一組可用的盤塊號,因此,須調用磁盤讀過程,將棧底盤塊號所對應盤塊的內容讀入棧中,作為新的盤塊號棧的內 容,並把原棧底對應的盤塊分配出去(其中的有用數據已讀入棧中)。然后,再分配一相應的緩沖區(作為該盤塊的緩沖區)。最后,把棧中的空閑盤塊數減1並返回。
在系統回收空閑盤塊時,須調用盤塊回收過程進行回收。它是將回收盤塊的盤塊號記入空閑盤塊號棧的頂部,並執行空閑盤塊數加1操作。當棧中空閑盤塊號數目已達100時,表示棧已滿,便將現有棧中的100個盤塊號,記入新回收的盤塊中,再將其盤塊號作為新棧底。
七、總結
本篇學習了文件管理的主要內容,明白了系統是如何高效組織文件的具體細節。也謝謝各位園友的觀看~