操作系統核心之文件管理

一、文件和文件系統

文件是指具有文件名的若干相關元素的集合。

1、現代OS中通過文件系統來組織和管理計算機中存儲的數據;

2、文件系統包括兩方面
(1)負責管理文件的系統軟件
(2)被管理的對象—文件

二、文件的結構

文件存在以下兩種形式的結構:

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

2、文件的物理結構
又稱爲文件的存儲結構,是指文件在外存上的存儲組織形式。與存儲介質的存儲性能和採用的外存分配方式有關。

1、文件的邏輯結構

可以分爲兩大類:
(1)有結構文件:是指由一個以上的記錄構成的文件,又把它稱爲記錄式文件;根據記錄的長度可分爲定長記錄文件;不定長記錄文件。
(2)無結構文件:這是指由字符流構成的文件,故又稱爲是流式文件。

有結構文件

根據記錄的組織方式分爲下列文件:
(1)順序文件:由一系列記錄按某種順序排列所形成的文件。通常是定長記錄。
(2)索引文件。當記錄可變長時,通常爲之建立-張索引表,併爲每個記錄設置一個表項以加快對記錄檢索的速度。索引順序文件。上述兩種方式的結合。爲文件建立一張索引表,爲每一組記錄中的第一個記錄設置一個表項。
(3)直接文件

無結構文件

1、如果說大量的數據結構和數據庫,是採用有結構的文件形式的話則大量的源程序、可執行文件、庫函數等,所採用的就是無結構的文件形式,即流式文件。其長度以字節爲單位對流式文件的訪問,則是採用讀寫指針來指出下一個要訪問的字符。
2、UNIX 系統中,所有的文件都被看做是流式文件。

2、文件的物理結構

由於磁盤具有可直接訪問的特性,故當利用磁盤來存放文件時具有很大的靈活性。

常用的外存分配方法有:
(1)連續分配
(2)鏈接分配
(3)索引分配
在一個系統通常只採用一種方法。

連續分配

連續分配要求爲每個文件分配一組相鄰的盤塊。在採用該方式時,可把邏輯文件中的記錄順序的存儲到鄰接的各物理塊中,這樣所形成的文件結構成爲順序文件結構,此時的物理文件稱爲順序文件。這種分配方式保證了邏輯文件中的記錄順序與存儲器中文件佔用盤塊的順序的一致性。

隨着文件的建立與刪除不斷進行,將產性很多外存的碎片利用緊湊方法也可消除碎片。

鏈接分配

採用鏈接分配方式時,可通過在每個盤塊上的鏈接指針,將同屬於一個文件的多個離散的盤塊鏈接成一個鏈表,把這樣形成的文件稱爲鏈接文件。

索引分配

鏈接分配方式雖然解決了連續分配方式所存在的問題,但又出現了另外兩個問題:

不能支持高效的直接存取。要對一個文件進行直接存取,需首先在FAT中順序的查找許多盤塊號。

FAT需佔用較大的內存空間。當磁盤容量較大時, FAT可能要佔用數MB以上的內存空間。這是令人難以忍受的。(FAT是文件配置表(英語:File Allocation Table,首字母縮略字:FAT),是一種由微軟發明並擁有部分專利的文件系統,供MS-DOS使用,也是所有非NT核心的微軟窗口使用的文件系統。)

索引分配方式示意圖
單級索引方式

多級索引方式

混合索引方式

索引分配方式的問題
可能要花費較多的外存空間。每當建立一個文件時,便須爲之分配一個索引塊,將分配給該文件的所有盤塊號記錄於其中。

例1:某文件系統採用多級索引結構,若磁盤塊的大小爲512字節, 每個塊號需佔3字節,那麼根索引採用一級索引時的文件最大長度爲( A )K字節;採用二級索引時的文件最大長度爲(C)K字節。
A. 85      B.170      C.512      D.1024
A. 512    B.1024    C.14450  D.28900

題解:磁盤大小512字節,沒塊需3字節,512字節/3字節=170,因爲是一級索引 最大長度佔滿512,170*512字節=87040字節,1k=1024字節,87040字節/1024字節=85K字節。
二級索引170*170*512字節=14796800字節,1k=1024字節,14796800字節/1024字節=14450K字節。

三、存儲空間的管理

空閒表法和空閒鏈表法

位示圖法

成組鏈接法

位示圖:順序掃描位示圖。以找到一個或一組其值爲「0」的二進制位;

例2:某文件管理系統在磁盤上建立了位示圖(bitmap),記錄磁盤的使用情況。若系統的字長爲32位,磁盤上的物理塊依次
編號爲:0、1、2、...那麼4096號物理塊的使用情況在位示圖中的第(A)個字中描述;若磁盤的容量爲200GB,物理塊的大小爲1MB,那麼位示圖的大小爲(D)個字。
A.129      B.257      C.513      D.1025
A.600      B.1200    C.3200    D.6400

題解:因爲系統字長爲32位,編號0就是0-31,1就是32-63...,4096號就是4096/32=128,因爲從0開始算128+1=129。 容量200G物理塊的大小爲1MB,200GB是200*1024=204800MB,一個字長32位,204800MB/32位=6400。