一、文件
文件概念
計算機中信息存儲的基本組織形式;
相關信息結合;
具有文件名。
文件名
按名存取:文件名 -> 存儲位置
文件名由一串ASCII碼或(和)漢字構成;
名字長度
- 8.3規則:文件名8個字符,類型3個字符,之間由“.”分割
- 長文件名:可以最多輸入255多個字符作爲文件名
文件名可能大小寫敏感;Linux,Unix系統的文件名大小寫敏感,Windows系統的不敏感。
文件結構
指文件內信息的組織方式;
目的:便於程序理解文件內容。
操作系統和應用程序決定了文件的結構。如pdf文件的結構由pd閱讀器決定。可執行文件的結構由操作系統決定等。
常用文件結構
- 無結構:文字流、字節流等;
- 簡單記錄結構:線性、固定長度、可變長度等;
- 複雜結構:格式化文檔、多媒體文件等。
文件類型—擴展名
文件類型一般由擴展名決定;
文件擴展名也稱文件後綴名,是標識文件類型的一種機制,擴展名跟在主文件名後面,由一個分隔符“.”分隔。
文件屬性
文件名:唯一,便於記憶;
文件位置:設備上文件位置的指針;
文件類型:文件的格式;
文件大小:文件當前大小;
保護:讀、寫、執行等訪問控制信息;
時間、日期和用戶標識:保護、安全和使用跟蹤的數據;
……
文件屬性保存在目錄中
文件操作
創建文件
寫文件
讀文件
在文件內重定位
刪除文件
截斷文件
打開文件
關閉文件
爲什麼要有打開文件操作?
-
需要數據結構
打開文件表:跟蹤打開文件;
文件指針:指向最後一次讀寫的位置,每個進程1個;
打開文件計數器:打開文件次數(調用open次數);
文件存儲位置:文件存放在存儲設備上的位置信息;
訪問權限:每個進程的訪問權限; -
優點
方便文件共享;
提高文件存取效率。
二、邏輯文件及其訪問方法
文件訪問
文件系統以文件爲單位進行信息的組織和存儲,其主要的功能是文件訪問。也就是對文件進行檢索、讀、寫等操作。
文件訪問主要和3個方面有關,分別是
- 邏輯文件
文件內容組織方式;
面向用戶; - 目錄文件
文件組織方式;
文件屬性; - 物理文件
文件存儲方式;面向系統。
邏輯文件
文件呈現在用戶面前的組織結構;
又稱爲文件邏輯結構;
邏輯文件決定了文件訪問方法;
邏輯文件的訪問方式
- 順序訪問
- 最簡單的訪問方式;
- 文件信息按照存放順序,一個記錄一個記錄地依次訪問
- 順序文件
- 典型存儲設備:磁帶
- 直接(隨機)訪問
- 可以直接定位到文件的某條記錄進行訪問
- 直接文件
- 典型設備:磁盤
順序文件
訪問方式:順序訪問;
依次訪問數據,不能直接跳轉到文件的指定位置;
優點:節省存儲空間;
缺點:訪問效率差。
直接(隨機)文件
訪問方式:直接(隨機)訪問;
直接通過計算得到需要讀寫記錄的位置,直接跳轉進行文件讀寫。
優點:訪問效率好;
缺點:浪費存儲空間。
是否可以兼顧順序文件和直接文件的優點呢?也就是採用順序文件的存儲方式和直接文件的檢索方式。
索引文件
基本方法:爲順序文件建立索引表。
索引表中的每一個表項存放一個指針,指向順序文件中的一個記錄,順序文件中有多少條記錄,索引表就有多少個表項。索引表的每個表項等長,便於檢索。
三種邏輯文件性能對比
文件訪問方式,即邏輯文件是影響文件訪問效率的因素之一!!!
索引文件廣泛用於組織需要頻繁檢索的文件,如數據庫文件等。
另外一種索引文件
根據某個檢索項作索引;
三、文件目錄
文件控制塊(FCB)
存放操控文件所需的各類文件屬性信息,如文件名、長度、創建時間、存放位置、訪問控制權限……
在文件系統中,文件控制塊類似於索引文件中的索引表,必須通過文件控制塊來訪問文件。
目錄項和目錄
目錄
是包含着所有文件信息的節點集合,是根據文件名檢索文件的橋樑。
目錄項
目錄由目錄項有序構成。一個目錄中的目錄項組成了目錄文件,每個目錄項存放了一個文件的各類屬性,每個目錄項都是等長的。
在有的系統中,目錄項=文件控制塊。
文件與文件控制塊一一對應,文件目錄就是文件控制塊的有序集合,一個文件控制塊就是一個目錄項。通常,文件目錄也被看作是文件,稱爲目錄文件。
很多操作系統把目錄組織成一個文件,這就是目錄文件。如下圖所示,就是多個目錄項組成的目錄文件,每個目錄項都是等長的。
目錄和文件
每個目錄項中存放了文件在存儲設備的存放地址,目錄和文件都駐留在存儲設備(如磁盤)
目錄相關操作
創建文件操作僅僅是爲這個文件創建了一個目錄項。
文件檢索
目錄是用戶和文件之間的一個橋樑。用戶根據文件名訪問文件,而文件是存儲在存儲設備上。文件名是一個字符串,存儲位置是一個數字,所以要將文件名的字符串轉換爲具體的數字才能去訪問這個文件。
目錄負責把文件名轉換爲文件在存儲設備上的位置。這個根據文件名我文件存儲位置信息的過程,就是文件檢索。
具體步驟
① 根據文件所在的目錄打開目錄文件;
② 從磁盤讀入該目錄文件的1個(物理)塊,該塊包含若干個目錄項;
③ 根據文件名遍歷內存中的該塊,如找到則結束;
④ 判斷該目錄文件是否還有物理塊沒有讀入,如果是轉2;否則。結束。表示該目錄中沒有此文件名的文件。
根據文件名找一個文件的目錄項,就是文件檢索的主要工作。找到目錄項後,就可以根據該目錄項得到文件的存儲位置並進行讀寫。
如下圖所示,有一個有n個目錄項的文件,平均遍歷目錄項數:(1+n)/2
最佳情況是在目錄項0就是所檢索文件的目錄項;最差情況是目錄項n-1。這還不包括文件查不到的情況。
目錄性能
(物理)塊
物理塊是內存和存儲設備數據交換基本單位,一個物理塊一般爲4KB、8KB和16KB等,每次讀寫文件都是以塊爲單位,至少1塊。
例如:
當前物理塊大小是4KB,則一個讀入文件的1個字節的操作也要從存儲設備讀入4KB。
例子:
目錄項大小 = ds bytes
最多文件數 = n 物理塊大小 = b
那麼:
目錄文件大小 = ds*n bytes
目錄文件需要的物理塊數目 = ds*n/b
檢索一個文件需要平均讀入的塊數 = (ds*n/b+1)/2
由於物理塊大小固定,所以,要想降低讀入的物理塊數量,有兩個途徑:
- 降低目錄項大小ds
- 降低文件數n
一個降低目錄項大小的方法就是Unix採用的i Node。
一個完整的目錄項就是文件控制塊,裏面包含了大量的文件屬性。
如果不讀入無關的信息,降低目錄項的大小,就可以提升文件訪問的效率。
通過分析發現:
- 文件檢索過程中需要用到的內容主要是文件名。
- Unix爲每個文件控制塊建立一個索引項,內容爲文件名和指向文件控制塊的指針。類似於索引文件,稱爲i node索引結點。
例子:
物理塊大小:4KB 目錄中文件數:1萬個
FCB(目錄項)大小:2KB
則:
目錄文件大小:10000*2KB = 20000KB
目錄文件需要的物理塊數量:20000KB/4KB = 5000塊
檢索文件平均需要訪問的物理塊數:(5000+1)/2 = 2500.5塊
i node:64B
那麼:
目錄文件大小:10000*64 = 625KB
目錄文件需要的物理塊數量:625KB/4KB+1 = 157塊
檢索文件平均需要訪問的物理塊數:(157+1)/2 = 79塊(僅僅是2500.5的1/32)
文件保護
文件的所有者/創建者應該有權控制:
- 能做什麼
指文件存取類型,有讀、寫、執行、添加、刪除和列表清單等基本操作;
Unix等系統把用戶分爲三個層面:
文件所有者、同組用戶、公共用戶。
訪問模式:分爲讀、寫、執行,用R/W/X來表示。爲了方便,用三個位來代表R/W/X,用 r=4,w=2,x=1 來表示權限。
對特定的文件或目錄,定義適當的訪問權限。
如Linux的命令chmod 761 game,就是賦予game的所有者R/W/X權限,同組用戶R/W權限,其他公共用戶X權限。
- 由誰來做
四、文件結構
目錄結構的設計目標
效率
- 快速定位文件位置
- 提高文件訪問效率
命名
- 方便用戶使用,允許重名
- 同名的不同文件
- 不同名的相同文件
分組
- 文件分組(子目錄)
- 兼顧效率和方便性
單層目錄
所有文件在同一目錄中,只有一級目錄:根目錄;
根目錄(/):一個文件系統最頂層的目錄。
優點:結構簡單;
缺點:
- 檢索效率差(目錄下文件過多)
- 不能有同名文件,一個文件只能有一個名稱
- 不能分組
單層目錄一般用於早期文件數量較少的操作系統中。
雙層目錄
單層目錄的改進是爲每個用戶建立自己的目錄,使得每個用戶的文件可以分開存放。
優點:
1)不同用戶可有相同文件名的文件;
2)比單層目錄提高檢索效率(文件分佈在多個用戶目錄中)
缺點:
1)無法分組;
2)同一用區分引入了路徑戶不能有相同文件名的文件。
路徑名:
不同目錄存在同名文件,爲了利用不同路徑區分同名文件引入了路徑。
路徑名 = 目錄名+分隔符+文件名
從根目錄開始到文件的路徑,稱爲路徑名。
樹形目錄
特點:
(1)檢索高效,子目錄增多會使得每個目錄下文件數量減少;
(2)可分組,用戶可以自由建立子目錄;
(3)允許重名,不同子目錄可以有同名文件。
爲了提高訪問的效率,引入了當前目錄,也稱爲工作目錄,是指當前運行進程所在的目錄。
絕對路徑:從根目錄開始的路徑名;
相對路徑:從當前目錄開始的路徑名,提高檢索效率。
性能對比(查找文件first爲例)
如下圖,藍色是從根目錄查找first文件,黃色是從相對路徑查找first文件。
目錄項:佔一個物理塊。
目錄文件 | 目錄項 | 平均讀入塊數 |
---|---|---|
/ | spell | 0 |
spell | (1+7)/2=4 | |
prt | (1+4)/2=2.5 | |
prt | first | (1+2)/2=1.5 |
絕對路徑:/spell/mail/prt/first
根目錄一般在內存;
一共需要讀入4+2.5+1.5=8個物理塊。
相對路徑:./prt/first
當前目錄在內存;
讀入1.5個物理塊。
圖形目錄
所謂文件共享是指不同目錄中的文件指向同一個物理文件,也就是它們內容相同。
很明顯,樹形目錄不能實現文件共享,圖形目錄可以。圖形目錄有兩種,無環圖目錄和通用圖目錄(有環圖)。
無環圖一個特點是有向邊無環。
文件共享
兩種共享文件方式:硬鏈接和符號鏈接(軟鏈接)
硬鏈接
硬鏈接是指一個物理文件可以有幾個文件名,但是隻有一個FCB。每個文件名有自己的目錄項,也就是i node,但共享一個FCB。
創建一個文件A的時候,系統爲其創建了一個i node和FCB,以及分配存儲空間來存儲文件內容。當建立文件B和A共享同一個文件時,系統僅僅爲B建立一個i node,並讓它指向A的FCB。
爲知道每個FCB中有多少i node在使用,需要在FCB中加入計數器,記錄當前鏈接到FCB的i node數量。
刪除文件的過程正好相反,刪除文件的i node,並把計數器減1,最後刪除A的時候,需要把i node,FCB,物理文件一起刪除。
符號鏈接(軟鏈接)
Windows,Linux使用符號鏈接,符號鏈接文件是一種特殊的文件,包含另外一個共享文件的路徑名。
通用圖目錄
圖中有環就會使遍歷目錄的操作陷入陷阱導致無窮循環,下圖book和avi之間就有環。
如何保證無環
- 僅允許指向文件的鏈接,不允許指向子目錄的鏈接
- 垃圾回收
- 每當加入新鏈接時,使用環路檢測算法判斷是否正確
- 優化遍歷目錄算法,避免對環的重複搜索