操作系统原理第十章:文件系统
目錄
- 1 文件概念及文件邏輯結構
- 1.1 文件的分類
- 1.2 文件的屬性
- 1.3 文件結構
- 2 文件訪問方式
- 2.1 順序存取
- 2.2 直接/隨機存取
- 2.3 文件的存儲設備
- 3 文件的物理結構
- 3.1 順序結構
- 3.2 鏈接結構
- 3.3 索引結構
- 4 目錄
- 4.1 目錄結構
1 文件概念及文件邏輯結構
文件對用戶來說是連續(xù)的邏輯地址空間,它是存儲在磁盤上的,文件是記錄在外存上的具有名字的相關信息的集合,文件里面通常保存數(shù)據(jù)或程序。
1.1 文件的分類
文件的分類可以按照如下類別來分:
- 按用途分類可以分為:系統(tǒng)文件,庫文件,用戶文件;
- 按按信息保存期限分類可以分為:臨時文件,永久文件,檔案文件;
- 按文件的保護方式分類可以分為:只讀文件,讀寫文件,只執(zhí)行文件;
- 按文件的邏輯結構分類可以分為:流式文件,記錄式文件;
- 按文件的物理結構分類可以分為:順序(連續(xù))文件,鏈接文件,索引文件;
- 按信息流向分類可以分為:輸入文件,輸出文件,輸入/輸出文件(存儲設備);
- 按文件中的數(shù)據(jù)分類可以分為:源文件,目標文件,可執(zhí)行文件;
- 按文件的性質分類可以分為:普通文件,目錄文件,特殊文件。
1.2 文件的屬性
無論將文件如何來分類,文件都有一些共性的東西,我們稱之為文件的屬性,通常有如下屬性:
- 文件名:唯一的以人們可以理解的方式保存的信息;
- 類型:需要可以支持多種類型的系統(tǒng);
- 位置:指向文件在設備上的存儲位置的指針;
- 大小:當前文件的大小;
- 保護:控制對文件的讀取,改寫和執(zhí)行的權限;
- 時間,日期和用戶身份:保護和安全需要的數(shù)據(jù)。
上述的這些文件屬性信息會保存在磁盤上的目錄結構中。
1.3 文件結構
用戶和文件系統(tǒng)往往從不同的角度對待同一個文件的:
- 用戶:從使用的角度,按信息的使用和處理方式組織文件;
- 文件系統(tǒng):從文件的存儲和檢索的角度,根據(jù)用戶對文件的存取方式和存儲介質的特性組織文件,決定用戶文件存放在存儲介質上的方式。
這樣就導致了文件有兩種形式的結構,即文件的邏輯結構和文件的物理結構:
- 邏輯結構:用戶對文件的組織結構;
- 物理結構:文件在外存儲器上的存儲結構。
物理結構直接影響存儲空間的使用和檢索文件信息的速度,邏輯文件保存到存儲介質上的工作由文件系統(tǒng)來做,這樣可減輕用戶的負擔。
文件從邏輯結構上分成二種形式,一種是無結構的流式文件,另一種是有結構的記錄式文件:
- 流式文件:指對文件內(nèi)信息不再劃分單位,它是依次的一串字符流構成的文件;
- 記錄式文件:是用戶把文件內(nèi)的信息按邏輯上獨立的含義劃分信息單位,每個單位稱為一個邏輯記錄(簡稱記錄)。記錄的長度可分為定長和不定長記錄兩類。
我們重點討論的是記錄式的文件,記錄文件有順序、索引、索引順序文件幾種。
- 順序文件:順序文件的所有記錄按鍵值的約定次序組織,記錄可以是定長的,也可以是變長的,順序文件常用于批量記錄讀取。對于定長記錄文件,若要查找第 iii 個記錄,可根據(jù)下式得到相對于第一個記錄首址的地址:Ai=i?dA_i =i*dAi?=i?d(ddd 為記錄的長度)。對于非定長記錄文件,若要查找第 iii 個記錄,則需要有每個記錄的長度:Ai=∑diA_i =∑d_iAi?=∑di?(ddd 為記錄的長度)。不支持直接存取。
- 索引文件:為解決非定長記錄文件無法直接存取問題,往往建立一張索引表,記錄下每個記錄的長度及指向該記錄的指針,從而方便了直接存取,索引表就類似于書的目錄,指明了每個章節(jié)都在哪一頁。索引文件對主文件中的記錄按需要的數(shù)據(jù)項(一個或幾個)建索引表,為每個記錄設置一個表項,索引文件本身是順序文件組織。
- 索引順序文件:事實上索引文件給每個數(shù)據(jù)項建立索引表這樣的開銷是比較大的,于是就有了索引順序文件, 索引順序文件先將順序文件中的所有記錄分為若干個組;再為順序文件建立一張索引表,表中記錄每個組的第一個記錄,該索引項包含記錄的鍵值和指向該記錄的指針。它是順序文件和索引文件的結合,檢索時,先根據(jù)關鍵字去檢索索引表,找到該記錄所在組的第一個記錄的位置,然后再利用順序查找法去查找主文件,找到所需記錄。如下圖,給每個姓名首字母都分了組,然后在索引表中只用保存每個組的首地址即可,找到首地址后,再在組內(nèi)進行順序查找:
2 文件訪問方式
前面提到文件有多種存儲結構,在訪問文件時,所采用的方式也是和文件的組織方式密切相關,常用的存取方式有如下兩種:
- 順序存取 (Sequential access);
- 直接/隨機存取 (Direct access)。
2.1 順序存取
順序存取是最簡單的訪問方式,它就是按照文件信息的邏輯順序依次存取:
- 在記錄文件中:按記錄的排列順序來存取;
- 在流式文件中:反映為當前讀寫指針的變化,在存取完一段信息后,讀寫指針自動加上這段信息的長度,以便指出下次存取時的位置。
順序存儲示意圖如下圖所示,當前指針 (Current position) 可以向后讀,也可以回到起始位置:
2.2 直接/隨機存取
直接/隨機存取可以直接定位到文件中的任何一個記錄,而不需要像順序存取一樣要把路徑中的所有記錄過一遍。
對于連續(xù)文件(固定長度),第 iii 個記錄的地址(addr0addr_0addr0? 為首記錄地址,LLL 為記錄長度): rptr=addr0+i?Lrptr=addr_0+i*Lrptr=addr0?+i?L,在非定長文件中 LLL 的值不固定,所以非定長文件不支持隨機存儲。
對于索引文件,是支持隨機存取的,因為我們可以先隨機查找索引表,再取地址。
2.3 文件的存儲設備
文件的訪問方式不僅和文件的存儲方式有關,還和文件的存儲設備有關,因為文件時保存在存儲設備上的,文件自身也帶有物理設備的特性。
文件的存儲設備主要有磁帶,磁盤,光盤等,存儲設備的特性可以決定文件的存取方法,對于上述的幾種存儲設備,它們都是以塊為單位存儲數(shù)據(jù)的,因此文件的存儲設備常常劃分為若干大小相等的物理塊,以塊為單位進行信息的存儲、傳輸。
以磁帶為例,磁帶可以永久保存大容量數(shù)據(jù),它是一種順序存取設備,即前面的物理塊被存取訪問之后,才能存取后續(xù)物理塊的內(nèi)容。磁帶存取速度較慢:主要用于后備存儲,或存儲不經(jīng)常用的信息,或用于傳遞數(shù)據(jù)的介質,現(xiàn)在磁帶已經(jīng)基本上被淘汰了。下圖是磁帶存儲示意圖:
再以磁盤為例,磁盤是一種隨機存儲設備,它既可以順序存取,也可以隨機存取。它可以直接定位到某個磁道上的某個扇區(qū),如下圖所示:
3 文件的物理結構
用戶按邏輯結構使用文件,文件的物理結構對用戶來說是不必關心的,但對文件系統(tǒng)來說卻是至關重要的,因為它直接影響存儲空間的使用和檢索文件信息的速度。文件系統(tǒng)按物理結構管理文件,當用戶請求讀寫文件時,文件系統(tǒng)必須實現(xiàn)文件的邏輯結構與物理結構之間的轉換。
文件的物理結構指的是文件在外存的存放組織形式,文件的物理結構與存儲設備的特性有很大關系,前面提到過文件的存儲設備通常劃分為大小相等的物理塊,物理塊是分配及傳輸信息的基本單位,一個物理塊中可以存放若干個邏輯記錄,一個邏輯記錄也可以存放在若干個物理塊中。
所以文件的物理結構取決于外存的分配方式,當采用連續(xù)分配方式時,就是順序結構;當采用鏈接分配方式時,就是鏈接結構;當采用索引分配方式時,就是索引結構。
3.1 順序結構
這是最簡單的物理文件結構,它將邏輯上連續(xù)的文件信息依次存放在外存連續(xù)的物理塊中。如下圖表示磁盤的存儲空間,當文件要存儲的時候,就為它找一段連續(xù)的存儲空間存放,圖中相同顏色的物理塊表示一個文件,可以發(fā)現(xiàn)它們都是連續(xù)存放的。當我們需要找到某個文件的時候,要知道文件的首地址和長度,而這兩個值都是保存在目錄中的:
在這種分配方式下,每一個文件占用一個連續(xù)的磁盤塊的集合,它的實現(xiàn)也非常簡單,只需要起始塊號和長度。同時它也可以隨機存取,因為目錄中保存了起始地址和長度,可以直接定位到某個文件。若是存儲在磁盤中,其所需的磁盤尋道次數(shù)和尋道時間也比較少。
這種分配方式也有不足的地方,如現(xiàn)在有一個文件需要占據(jù)10個物理塊,若查詢內(nèi)存剩余容量可以發(fā)現(xiàn)剩余有15個內(nèi)存卡(以上圖為例),但是依然無法分配,因為并沒有10個連續(xù)的物理塊,這個時候就出現(xiàn)了外碎片問題。
另外這種分配方式下文件不能動態(tài)增長,由于分配方式時順序的,所以存儲的方向也是固定的,如果某個文件要添加內(nèi)容,可能導致物理塊不夠用,比如文件tr想增加3個物理塊,就無法完成。
3.2 鏈接結構
順序結構最大的問題就是外碎片問題,造成這個問題的主要原因就是順序分配,參照內(nèi)存中解決外碎片的方法,文件的物理結構也可以采用離散的分配方式,即采用鏈接結構。
在鏈接分配方式下按所需分配磁盤塊,通過鏈接指針鏈接在一起,如下圖只需要知道起始塊和最后一塊即可:
可以發(fā)現(xiàn)一個文件的物理塊分散在磁盤的各個地方,在這種分配方式下消除了外碎片問題,但是缺點是無法支持隨機存取了,若想知道文件的邏輯第三個物理塊,則必須從首個物理塊開始找到第三個塊,而不能直接定位到第三個物理塊。同時由于是指針鏈接,指針占據(jù)了一定的空間,而且存取速度較慢,物理塊離散的分布,在磁盤存儲中會帶來更多的尋道次數(shù)和尋道時間。另外在這種分配方式下,只要磁盤中還有空間,文件時可以動態(tài)增長的。
解決指針占據(jù)空間的問題可以將多個塊組成簇,以簇為單位分配,指針占用百分比減少,但增加內(nèi)碎片,比如規(guī)定4個物理塊為一個簇,每次分配都是4個物理塊為單位分配。
為了支持隨機存取,引入了文件分配表FAT (File allocation table ),每個磁盤會有一張文件分配表,里面的表項是和磁盤的物理塊個數(shù)是一一對應的,每個表項存的內(nèi)容就是該物理塊的下一個物理塊在什么地方,如下圖所示,要找到某個文件只需要知道文件的起始地址就可以了,這樣就間接的實現(xiàn)了隨機存取,若要尋找文件邏輯上的第三個物理塊,則只需要查詢文件分配表即可,查找速度會非常快。:
3.3 索引結構
回顧順序結構和鏈接結構,順序結構支持隨機存取,但有外碎片;鏈接結構沒有外碎片,但不能直接存取,雖然引入的FAT可以隨機存取,但需要占用較大的內(nèi)存空間。
事實上,打開某個文件時,只需知道該文件所在的盤塊號, 一個文件的信息存放在若干不連續(xù)物理塊中,系統(tǒng)為每個文件建立一個索引表,并將這些塊的塊號存放在索引表中,一個索引表就是磁盤塊地址數(shù)組,其中第 iii 個條目指向文件的第 iii 塊,如下圖,所有灰色的物理塊同屬于一個文件jeep,文件目錄中會保存這個文件的索引表的編號,在索引表會找到該文件對應的所有物理塊。這個索引表也是需要保存的,我們把它也保存在磁盤中,圖中的物理塊19,叫做索引塊:
可以發(fā)現(xiàn)索引分配是支持隨機存取的,由于它也是一種離散的分配方式,所以它也沒有外碎片。索引分配顯然也是支持文件動態(tài)增長的。但是要建立索引表放在磁盤上,所以索引表是要占據(jù)磁盤空間的,同時因為是離散分配,也無法避免的增加了較多的尋道次數(shù)和尋道時間。
由于文件的大小是不定的,所以合理的設計索引表會提高檢索速度,也能減少空間開銷。當文件很小的時候,一張索引表就可以解決,當文件很大的時候,一張索引表可能就放不下了,因此有如下兩種方案:
- 鏈接模式:將一個大文件的一個索引表接著一個索引表,鏈接起來,相當于將多個小的索引表拼湊成一個大索引表來滿足大文件的存儲需求;
- 多級索引: : 將一個大文件的所有索引表(二級索引) 的地址放在另一個索引表(主索引,一級索引)中,也就是索引表的每個表項又指向了另一張索引表,如下圖所示:
在兩級索引分配方式,若每個盤塊大小為1KB,每個盤塊號占4字節(jié),則一個索引塊中可存放256個盤塊號,則兩級索引最多可包含的盤塊號總數(shù)為64K個(256*256)。因此,所允許的文件的最大長度為64MB(64K*1KB)。
4 目錄
有些系統(tǒng)保存了成百萬的文件,為了管理這些數(shù)據(jù),需要組織他們,所以引入了目錄管理,文件目錄通常分為兩部分:
- 磁盤可以分成一個或多個分區(qū);
- 每個分區(qū)都包含了存儲在分區(qū)中的文件的信息,這些信息保存在設備目錄中,設備目錄記錄分區(qū)上所有文件的各種信息。
目錄是一個包含著所有文件信息的節(jié)點的集合,每一個目錄項對應著一個文件,如下圖:
目錄本身也是要保存下來的,目錄和文件都是保存在磁盤上的,在目錄中通常會保存文件的名稱、類型、地址、當前長度、最大長度、最后訪問時間、數(shù)據(jù)最后更新時間、所有者ID、保護信息等信息。
這些信息具體保存在文件控制塊FCB中,用于描述和控制文件的數(shù)據(jù)結構,它至少要包括文件名和存放文件的盤物理地址。文件控制塊的有序集合稱為文件目錄,即一個文件控制塊FCB就是一個文件目錄項。文件控制塊FCB中保存的內(nèi)容大致可以分為如下三類:
- 文件基本信息:文件名,用戶名,文件地址,文件長度,文件邏輯結構,物理結構;
- 存取控制信息:文件存取權限;
- 管理信息:共享計數(shù),文件的建立日期,保存期限,最后修改日期,最后訪問日期。
4.1 目錄結構
目錄中就是所有文件控制塊FCB的集合,對FCB的管理應該滿足如下要求:
- 效率:快速的定位一個文件;
- 命名:方便用戶,兩個用戶可以有相同名字的不同文件,相同的文件可以有不同的名字。
下圖就是最簡單的單級目錄結構,所有文件對應這一個FCB表項,在單級目錄結構中,要找到一個文件則要遍歷FCB,而且由于是單級結構,不允許出現(xiàn)重命名,也不允許分組。:
為解決一級目錄文件命名沖突,并提高對目錄文件檢索速度而改進,可以把目錄分為兩級:
- 一級稱為主文件目錄(MFD):給出用戶名,用戶子目錄所在的物理位置;
- 二級稱為用戶文件目錄(UFD,又稱用戶子目錄):給出該用戶所有文件的FCB。
這樣在不同主文件目錄下的不同文件可以重名,而且用戶要查找文件只需要在自己的主目錄下查找即可,如下圖所示:
在二級目錄結構下依然是無法分組的,為了解決這個問題引入了樹型目錄結構,如下圖所示:
在樹形目錄結構下,層次結構清晰,便于管理和保護,有利于文件分類,解決重名問題,提高文件檢索速度。但查找一個文件按路徑名逐層檢查,由于每個文件都放在外存,多次訪盤影響速度。由于樹形的葉子是不會重合的,所以不支持文件共享。
在有些系統(tǒng)中要求實現(xiàn)文件共享,這就引入了無環(huán)圖結構目錄,如下圖所示,兩個分支下的count都指向了同一個文件:
在這種方式下,當某一方去修改這個文件時,如刪除了這個文件,那么另一方指向這個文件的指針就是一個懸掛指針,解決方案有兩種:
- 設置一個斷點來按期檢查當前是否有懸掛指針,若有就刪除懸掛指針;
- 通過表項保留計數(shù)來解決,文件的共享次數(shù)是通過一個計數(shù)器來實現(xiàn)的,當某一方刪除這個文件的時候,我們并不刪除這個文件,而是把這個計數(shù)器減一,當這個計數(shù)器為1時,這個文件就是一個獨享文件,當這個計數(shù)器為0時,這個文件就真正的被刪除了。
在有的系統(tǒng)中要求文件可以指向目錄,這就引入了普通圖結構目錄,如下圖所示:
這種結構下就會出現(xiàn)環(huán),當查找某個文件時就可能陷入某個環(huán),保證無環(huán)的方式有如下幾種:
- 只允許鏈接到文件而不允許鏈接到子目錄;
- 垃圾收集機制,定期檢查是否有環(huán);
- 每次添加一個鏈接時都用一個檢測算法判斷會不會產(chǎn)生環(huán);
總結
以上是生活随笔為你收集整理的操作系统原理第十章:文件系统的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 操作系统原理第九章:虚拟内存
- 下一篇: 操作系统原理第十一章:大容量存储