【操做系統】文件管理(六)

1、前言算法

  本篇是操做系統系列的最後一篇,文件管理,因爲系統的內存有限而且不能長期保存,故平時老是把它們以文件的形式存放在外存中,須要時再將它們調入內存。如何高效的對文件進行管理是操做系統實現的目標。數組

2、文件和文件系統安全

  現代OS幾乎都是經過文件系統來組織和管理在計算機中所存儲的大量程序和數據的。文件系統的管理功能是經過把它所管理的程序和數據組織成一系列文件的方法來實現的。而文件則是指具備文件名的若干相關元素的集合元素一般是記錄,而記錄是一組有意義的數據項的集合。能夠把數據組成分爲數據項、記錄、文件。數據結構

  ① 數據項,數據項是最低級數據組織形式。分爲基本數據項(用於描述一個對象某種屬性的字符集,是數據組織中能夠明明的最小邏輯數據單位,即原子數據,又稱爲數據元素或字段)和組合數據項(由若干個基本數據項組成)函數

  ② 記錄,是一組相關數據項的集合,用於描述一個對象在某方面的屬性,爲了可以惟一標識一個記錄,須要在記錄中肯定一個或集合數據項,把他們的集合稱爲關鍵字,關鍵字是可以惟一標識一個記錄的數據項。性能

  ③ 文件,文件是具備文件名的一組相關元素的集合,分爲有結構文件和無結構文件。有結構文件由若干個相關記錄組成,無結構文件則被當作一個字符流。文件是文件系統的最大數據單位。文件應該具備本身的屬性,包括文件類型(如源文件、目標文件、可執行文件等),文件長度(文件的當前長度,也多是最大容許長度),文件的物理位置(指示文件在哪個設備上及在該設備的哪一個位置的指針),文件的創建時間(文件最後一次修改時間)。學習

  一個文件可對應若干個記錄,一個記錄可對應若干個數據項。大數據

  文件系統管理的對象有:文件(做爲文件管理的直接對象),目錄(爲了方便用戶對文件的存取和檢索,在文件系統中配置目錄,每一個目錄項中,必須含有文件名及該文件所在的物理地址,對目錄的組織和管理是方便和提升對文件存取速度的關鍵),磁盤(磁盤)存儲空間(文件和目錄一定佔用存儲空間,對這部分空間的有效管理,不只能提升外存的利用率,並且能提升對文件的存取速度)。spa

  2.1 文件操做操作系統

  ① 建立文件,在建立一個新文件時,系統首先要爲新文件分配必要的外存空間,並在文件系統的目錄中,爲之創建一個目錄項,目錄項中應該記錄新文件的文件名及其在外存的地址等屬性。

  ② 刪除文件,當已再也不須要某文件時,可將其從文件系統中刪除,在刪除時,系統應先從目錄中找到要刪除文件的目錄項,使之成爲空項,而後回收該文件所佔用的存儲空間。

  ③ 讀文件,讀文件時,須在相應系統調用中給出文件名和應讀入的內存目標地址。此時,系統要查找目錄,找到指定目錄項,從中獲得被讀文件在外存中的位置。在目錄項中,還有一個指針用於對文件進行讀/寫。

  ④ 寫文件,寫文件時,須在相應系統調用中給出文件名和其在內存源地址。此時,系統要查找目錄,找到指定目錄項,從再利用目錄中的寫指針進行寫操做。

  ⑤ 截斷文件,若是一個文件的內容已經陳舊而須要所有更新時,一種方法是將此文件刪除,再從新建立一個新文件,但若是文件名和屬性均無改變,則可採起截斷文件的方法,其將原有的文件長度設置爲0,放棄原有文件的內容。

  ⑥ 設置文件的讀/寫位置,用於設置文件讀/寫指針的位置,以便每次讀/寫文件時,不須要從始端開始而是從所設置的位置開始操做。能夠改順序存取爲隨機存取。

  當前OS所提供的大多數對文件的操做,其過程大體都是這樣兩步:首先,檢索文件目錄來找到指定文件的屬性及其在外存上的位置;而後,對文件實施相應的操做,如讀/寫文件等,當用戶要求對一個文件實施屢次讀/寫或其餘操做時,每次都要從檢索目錄開始,爲了不屢次重複地檢索目錄,在大多數OS中都引入了打開這一文件系統調用,當用戶第一次請求對某文件系統進行操做時,先利用open系統調用將該文件打開。

  打開是指系統將指名文件的屬性(包括該文件在外存上的物理位置)從外存拷貝到內存打開文件表的一個表目中,並將該表目的編號(索引號)返回給用戶,之後,當用戶再要求對該文件進行操做時,即可利用系統所返回的索引號向系統提出操做請求,系統即可直接利用該索引號到打開文件表中去查找,從而避免了對該文件的再次檢索,若是用戶再也不須要對該文件實施操做,可利用關閉系統調用來關閉此文件,OS將會把該文件從打開文件表中的表目上刪除掉。

3、文件的邏輯結構

  對任何的文件,都存在如下兩種形式的結構

  ① 文件的邏輯結構,這是從用戶觀點出發所觀察到的文件組織形式,是用戶能夠直接處理的數據及其結構,獨立於文件的物理特性,又稱爲文件組織。

  ② 文件的物理結構,又稱爲文件的存儲結構,是指文件在外存上的存儲組織形式,不只與存儲介質有關,還與外存分配方式有關。

  3.1 文件邏輯結構的類型

  文件的邏輯結構可分爲兩大類,一類是有結構文件,這是指由一個以上的記錄構成的文件,故把他稱爲記錄式文件,另外一類是無結構文件,這是指由字符流構成的文件,又稱爲流式文件。

  ① 有結構文件,每一個記錄都用於描述實體集中的一個實體,各記錄有着相同或不一樣數目的數據項,記錄分爲定長記錄(文件中全部記錄的長度都是相同的,全部記錄中的各數據項都處在記錄中相同的位置,具備相同的順序和長度)和變長記錄(文件中個記錄的長度不相同,可能因爲一個記錄中所包含的數據項目並不相同)。根據用戶和系統的須要,可採用多種方式來組織這些記錄,如順序文件(記錄按照某種順序排列所造成的文件,記錄一般是定長的,能較快查找到文件中的記錄),索引文件(記錄爲可變長度時,一般創建一張索引表,併爲每一個記錄設置一個表項,加快對記錄檢索的速度),索引順序文件(爲文件創建一張索引表,爲每一組記錄中的第一個記錄設置一個表項)。

  ② 無結構文件,對於源程序、可執行文件、庫函數等一般採用的是無結構文件形式,即流式文件,其長度以字節爲單位。

  3.2 順序文件

  文件是記錄的集合,文件中的記錄能夠是任意順序的,所以,它能夠按照各類不一樣的順序進行排列,通常地,可概括爲如下兩種狀況。

  ① 串結構,個記錄之間的順序與關鍵字無關,一般按照時間前後排序,最早存入的記錄做爲第一個記錄,其次,爲第二個記錄,以此類推。

  ② 順序結構,文件中全部記錄按照關鍵字排列,能夠按照關鍵詞長度從大到小排列。順序結構的檢索效率更高。

  順序文件的最佳應用場合是在對諸記錄進行批量存取時,即每次要讀或寫一大批記錄時,此時,對順序文件的存取效率是全部邏輯文件中最高的,此外,只有順序文件才能存儲在磁帶上,並能有效工做。可是想要增長或刪除一個文件比較困難。

  3.3 索引文件

  對於定長記錄文件,能夠方便的實現順序存取和直接存取,然而,對於變長記錄就很難實現。爲了解決變長記錄檢索問題,可爲變長記錄文件創建一張索引表,對主文件中的每一個記錄,在索引表中設有一個相應的表項,用於記錄該記錄的長度L及指向該記錄的指針(指向該記錄在邏輯地址空間的首址),因爲索引表示按記錄鍵排序的,所以,索引表自己是一個定長記錄的順序文件。從而能夠方便實現直接存取。

  在對索引文件進行檢索時,首先根據用戶(程序)提供的關鍵字,並利用折半查找檢索索引表,從中找到相應的表項,再利用該表項給出的指向記錄的指針值,去訪問所需的記錄。每當要向索引文件中增長一個新紀錄時,便須對索引表進行修改。索引表的問題在於除了有主文件外,還須要配置一張索引表,每一個記錄須要有一個索引項,所以提升了存儲費用。

  3.4 索引順序文件

  其有效克服了變長記錄不便於直接存取的缺點,並且所付出的代價也不算太大,它是順序文件和索引文件相結合的產物,它將順序文件中的全部記錄分爲若干個組,爲順序文件創建一張索引表,在索引表中爲每組中的第一個記錄創建一個索引項,其中含有該記錄的鍵值和指向記錄的指針

  在對索引順序文件進行檢索時,首先利用用戶(程序)所提供的關鍵字及某種查找算法去檢索索引表,找到該記錄組中的第一個記錄的表項,從中獲得該記錄組第一個記錄在主文件中的位置,而後,再利用順序查找法去查找主文件,從中找出所要求的記錄。

  3.5 直接文件

  對於直接文件,則根據給定的記錄鍵值,直接得到指定記錄的物理地址,換言之,記錄鍵值自己就決定了記錄的物理地址,這種由記錄鍵值到記錄物理地址的轉換被稱爲鍵值轉換。

  3.6 哈希(Hash)文件

  利用Hash函數可將記錄鍵值轉換爲相應記錄的地址,爲了能實現文件存儲空間的動態分配,一般由Hash函數所求得的並不是是相應記錄的地址,而是指向一目錄表相應表目的指針,該表目的內容指向相應記錄所在的物理塊。

4、外存分配方式

  因爲磁盤具備可直接訪問的特性,故當磁盤來存放文件時,具備很大的靈活性。而文件的物理結構與外村分配方式有關,在採用連續分配方式時的文件物理結構是順序式的文件結構,在採用連接分配方式將造成連接式文件結構,而索引分配方式將造成索引式文件結構。

  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、目錄管理

  爲了可以對文件實施有效的管理,必須對它們加以妥善組織,這主要是經過文件目錄實現的,文件目錄也是一種數據結構,用於標識系統中的文件及其物理地址,供檢索時使用,對目錄的管理要求以下

  ① 實現按名存取,即用戶只須向系統提供所需訪問的文件的名字,便可以快速準確地找到指定文件在外存上的存儲位置,這是目錄管理中最基本的功能。

  ② 提升對目錄檢索速度,經過合理地組織目錄結構的方法,可加快對目錄的檢索速度,從而提升對文件的存取速度。

  ③ 文件共享,在多用戶系統中,應該容許用戶共享一個文件。

  ④ 容許文件重名,系統應容許不一樣用戶對不一樣文件採用相同的名字,以便用戶按照本身的習慣給文件命名和使用文件。

  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、文件存儲空間管理

  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個盤塊號,記入新回收的盤塊中,再將其盤塊號做爲新棧底。

7、總結

  本篇學習了文件管理的主要內容,明白了系統是如何高效組織文件的具體細節。也謝謝各位園友的觀看~

相關文章
相關標籤/搜索