1. 程式人生 > 實用技巧 >OS:5-檔案管理

OS:5-檔案管理

第5章 檔案管理

5.1 檔案的概念

  • 檔案是由資訊按一定的結構方式組成,可持久化儲存的抽象機制,由於它必定儲存在某種裝置上,故也可以認為檔案是裝置的一種抽象
  • 由檔名所標識,使用者可以按名訪問
    • 檔名和副檔名

檔案分類

  • 按用途可分成:系統檔案、庫檔案、使用者檔案
  • 按保護級別可分成:只讀檔案、讀寫檔案、不保護檔案
  • 按資訊時限可分成:臨時檔案、永久檔案、檔案檔案
  • 按裝置型別可分成:磁碟檔案、磁帶檔案、光碟檔案、軟盤檔案
  • Linux分類
    • 普通檔案
    • 目錄檔案
    • 特殊檔案

引入檔案的優點

  1. 使用者使用方便:按名存取
  2. 檔案安全可靠:使用者通過檔案系統才能實現對檔案的訪問
  3. 檔案可備份
  4. 檔案可共享

5.2 檔案系統及其功能

檔案系統是作業系統中負責存取和管 理資訊的模組,它用統一的方式管理使用者和系統資訊的儲存、檢索、更新、共享和保護,併為使用者提供一整套方便有效的檔案使用和操作方法

  • 檔案系統中的檔案
    • 使用者概念中的邏輯檔案
    • 存放他的儲存結構
  • 檔案系統的功能
    • 面向使用者:
      • 檔案按名存取
      • 檔案共享和保護
      • 檔案操作和使用

5.3 檔案的儲存

  • 檔案儲存介質有磁帶、光碟和磁碟
  • 是儲存介質的物理單位,對應於一盤磁帶、一塊軟盤、一個光碟片、一個硬碟分割槽
  • 是儲存介質上連續資訊所組成的一個區域,也叫做物理記錄
    • 塊在主儲存器和輔助儲存器進行資訊交換的物理單位,每次總是交換一塊或整數塊資訊

順序存取儲存裝置

  • 嚴格依賴資訊的物理位置次 序進行定位和讀寫的儲存裝置
  • 磁帶機、光碟

直接存取儲存裝置

  • 移臂與旋轉兩維組織,存取速度高
  • 磁碟
  • 每個物理記錄有確定的位置和唯 一的地址,存取任何一個物理塊所需的時間幾乎不依賴於此資訊的位置

檔案存取相關見5.11

5.4 檔案的邏輯結構

邏輯檔案

  • 邏輯檔案,又稱為檔案的邏輯結構

    • 獨立於物理環境的,使用者概念中的抽象資訊組織方式
    • 使用者能觀察到的,並加以處理的資料集合
  • 檔案的邏輯結構分為兩種形式

    • 一種是流式檔案
      • 無結構的檔案,指檔案內的資料不再組成記錄,只是由一串依次的位元組組成的資訊流序列
      • 每個位元組都有一個索引,第一個位元組索引0,第二個位元組索引1...
    • 一種是記錄式檔案
      • 是一種有結構的檔案,它是若干邏輯記錄資訊所組成的記錄流檔案
      • 邏輯記錄是檔案中按資訊在邏輯上的獨立含義所劃分的資訊單位

5.5 記錄的成組和分解

  • 邏輯記錄是資訊按邏輯上的獨立含義由使用者劃分的單位,塊是系統劃分的儲存介質上連續資訊所組成的區域
  • 一條邏輯記錄可能佔用一塊或多塊;一塊可能包含多條邏輯記錄

成組

若干個邏輯記錄合併成一組,寫入一個塊叫記錄的成組

每塊中的邏輯記錄數稱塊因子

  • 記錄的成組操作在輸出緩衝區內進行, 湊滿一塊後才將緩衝區內的資訊寫到儲存介質上

分解

當儲存介質上的一個物理記錄讀進輸入緩衝區後,把邏輯記錄從塊中分離出來的操作叫記錄的分解操作

特徵

  • 優點
    • 節省儲存空間
    • 減少IO次數,提高系統效率
  • 使用者讀請求,導致包含該邏輯記錄的物理 讀輸入緩衝區;這一操作可能讀入了多個邏輯記錄,這一現象稱為提前讀
  • 使用者寫請求,首先是寫入輸出緩衝區,只有當該緩衝區中的邏輯記錄滿後才會引起實際輸出,這一現象稱為推遲寫

5.6 檔案的物理結構

  • 檔案的物理結構和組織是指檔案在物理儲存空間中的存放方法和組織關係,又稱為物理檔案
  • 設計塊的劃分,記錄的排列、索引的組織、資訊的搜尋等
  • 直接影響檔案系統的效能

順序檔案

又叫連續檔案

  • 將一個檔案中邏輯上連續的資訊存放到儲存介質的依次相鄰的塊中便形成順序結構
  • 如磁帶檔案、光碟檔案
  • 優點:
    • 順序存取記錄時速度較快
  • 缺點:
    • 建立檔案前需要能預先確定檔案長度,以便分配儲存空間;
    • 修改、插入和增加檔案記錄有困難

連線檔案

又叫串聯檔案

  • 連線結構的特點是使用連線字(指標)來表示檔案中各個物理塊之間的先後次序
  • 第一塊檔案資訊的實體地址由檔案目錄給出,而每一塊的連線字指出了檔案的下一個物理塊位置;連線字內容為0時,表示檔案至本塊結束
  • 像輸入井、輸出井等都用此類檔案
  • 優點:
    • 易於對檔案CRUD
    • 不必預先知道檔案長度
    • 儲存空間利用率高
  • 缺點:
    • 存放指標需額外的儲存空間;
    • 由於存取須通過緩衝區,待獲得連線字後,才能找到下一物理塊的地址, 因而,僅適用於順序存取

直接檔案

又叫雜湊檔案

  • 通過計算記錄的關鍵字建立與其物理儲存地址之間的對應關係
  • 解決衝突
    • 解決辦法有拉鍊法、迴圈探查法、 二次雜湊法、溢位區法等

索引檔案

索引檔案為每個檔案建立了一張索引表,其中,每個表目包含一個記錄的鍵(或邏輯記錄號)及其儲存地址

訪問方式:

  • 索引檔案在檔案儲存器上分兩個區: 索引區和資料區

    1. 第一步查 找索引表
    2. 第二步獲得記錄實體地址
  • 優點:

    • 備連線檔案的優點
    • 克服了它只能作順序存取的缺點, 具有直接讀寫任意一個記錄的能力,便於檔案的增、刪、改
  • 缺點:

    • 增加了索引表的空間開銷和查詢時間

5.7 檔案的目錄結構

  • 檔案目錄是實現檔案的“按名存取”的關鍵資料結構
  • 目錄便於查詢、防止衝突
  • 檔案目錄需要永久儲存,因此也組織成檔案存放在磁碟上,稱目錄檔案

一級目錄結構

  • 在作業系統中構造一張線性表,與每個檔案的相關屬性佔用一個目錄項,構成了一級目錄結構
  • 由於使用者與檔案眾多,容易重名,不利記憶

二級目錄結構

  • 第一級為主檔案目錄
  • 第二級為使用者的檔案目錄,每一使用者只允許檢視自己的檔案目錄
  • 優點:

    • 避免一個使用者未經授權就存取另一個使用者的檔案,使使用者檔案的私有性得到保證,實現了對檔案的保密和保護
    • 特別是不同使用者具有同名檔案時,由於各自有不同的使用者檔案目錄而不會導致混亂
  • 缺點:

    • 對於同一個使用者而言,同樣存在檔案多、容易重名問題

樹形目錄結構

每一級目錄可以登記下一級目錄,也可以登記檔案,從而形成了層次檔案目錄結構

  • 一棵倒向的有根樹,樹根是根目錄;
  • 從根向下,每一個樹分叉是一個子目錄;
  • 而樹葉是檔案
    • 不同系統中不一樣,比如linux中萬物皆檔案,可以是目錄檔案、普通檔案、特殊檔案

  • 優點:
    • 較好地反映現實世界中具有層次關係的資料集合和較確切地反映系統內部檔案的組織結構
    • 不同檔案可以重名,只要它們不位於同一末端的子目錄中
    • 易於規定不同層次或子樹中檔案的不同存取許可權,便於檔案的保護、保密和共享

5.8 檔案目錄的管理

檔案查詢

“按名存取”檔案就是系統根據使用者提供的檔案路徑名來搜尋各級檔案目錄,找到該檔案

  • 絕對路徑名——從根目錄查起
  • 相對路徑名——從當前目錄查起
    • .當前目錄
    • ..父目錄

目錄項查詢:二分查詢

活動檔案表

  • 當一個檔案經過許多目錄節點時,使用很不方便;系統在沿路徑查詢目錄時,往往要多次訪問文 件儲存器,使訪問速度大大減慢
  • 系統可以為每個使用者程序建立一張活動檔案表,當用戶使用一個檔案之前,先通過“開啟”操作,把該檔案有關目錄資訊複製到指定主存區域,有關資訊填入活動檔案表,以建立使用者程序和該檔案索引的聯絡
  • 當不再使用該檔案時,使用“關閉”,切斷使用者程序和這個檔案的聯絡,同時,若該目錄已被修改過,則應更新輔存中對應的檔案目錄

例子:

5.9 檔案的安全與保護

概念

  • 檔案共享是指不同使用者共同使用某些檔案
    • 併發控制
  • 檔案保護是指防止檔案被破壞
    1. 檔案副本
    2. 檔案儲存矩陣與檔案存取表
    3. 檔案屬性
  • 檔案保密則是指防止檔案及其內容被其他使用者竊取
    1. 隱蔽檔案目錄
    2. 設定口令
    3. 使用密碼

5.10 檔案的保護

5.11 檔案的存取方法

順序存取

  • 讀操作根據讀指標讀出當前記錄,同時推進讀指標,指向下一次要讀出的記錄
  • 寫操作則設定寫指標,把一個記錄寫到檔案未端, 同時推進寫指標
  • 允許對讀指標進行前跳或後退n(整數)個記錄的操作
  • 磁帶機、光碟

直接存取

  • 又稱隨機存取,可以非順序地從檔案的任何位置讀取檔案內容
  • 例如,航空訂票系統,用航班號作標識,把特定航班的所有資訊存放在物理塊中,使用者預訂某航班時,直接計算出該航班的存位置

索引存取

  • 基於索引檔案的索引存取方法
  • 資訊塊的地址都可以 通過查詢記錄鍵而換算出
  • 實際的系統中,大都採用多級索引,以加速記錄查詢過程

5.12 檔案的使用

建立檔案

  • 所需引數
    • 檔名、裝置類(號)、檔案屬性及存取控制資訊
  • 處理流程
    • 在相應裝置上建立一個檔案目錄項,為檔案分配第一個物理塊,在活動檔案表中申請一個項,登記有關目錄資訊,並返回一個檔案控制代碼

撤銷/刪除檔案

  • 所需引數
    • 檔名和裝置類(號)
  • 處理流程
    • 若檔案沒有關閉,先關閉檔案;
    • 若為共享檔案,進行聯訪處理;
    • 在目錄檔案中刪去相應目錄項;
    • 釋放檔案佔用的檔案儲存空間

開啟檔案

  • 所需引數
    • 檔名、裝置類(號)、開啟方式
  • 處理流程
    • 在主存活動檔案表中申請一個項,返回一個檔案控制代碼;
    • 跟據檔名查詢目錄檔案,把目錄資訊複製到活動檔案表相應欄;
    • 按存取控制說明檢查訪問的合法性;
    • 若開啟的是共享檔案,則應有相應處理

關閉檔案

  • 所需引數
    • 檔案控制代碼
  • 處理流程
    • 將活動檔案表中該檔案的“當前使用使用者數”減1;
    • 若此值為0,則收回此活動檔案表;
    • 完成“推遲寫”;
    • 若活動檔案表目內容已被改過,則應先將表目內容寫回檔案儲存器上相應表目中,以使檔案目錄保持最新狀態

讀寫檔案

  • 所需引數
    • 檔案控制代碼、使用者資料區地址、 讀寫的記錄或位元組個數
  • 處理流程
    • 按檔案控制代碼從活動檔案表中找到該檔案的目錄項資訊;
    • 根據目錄項指出的該檔案的邏輯和物理組織方式
    • 把相關邏輯記錄轉換成物理塊

定位檔案

用於調整所開啟檔案的讀寫指標位置

  • 所需引數
    • 檔案控制代碼、定位指標

5.13 輔存空間管理

分配方式

  • 連續分配:存放在輔存空間連續儲存區中 (連續的物理塊號)
    • 順序訪問時速度快,管理較為簡單
    • 但為了獲得足夠大的連續儲存區,需定時進行‘碎片’整理
  • 非連續分配:動態分配給若干扇區或簇(幾個連續扇區),不要求連續
    • 輔存空間管理效率高,便於檔案動態增長和收縮

空閒塊管理

  • 位示圖

    • 字位為“1”表示相應塊已佔用,字位為“0”狀態表示該塊空閒
    • 可以把位示圖全部或大部分儲存在主存中,可實現高速物理塊分配和去配
  • 空閒塊成組連線法

    • 每組第一塊登記下一組空閒盤塊號和空閒塊總數
    • 最後一組中,第一項是0,作為結束標誌
      • 這是個小細節!

    舉個例子

    假定檔案卷啟用時共有空閒塊338塊(但是合是339,因為最後一組的第一項是沒用的)

    OS啟動時,將磁碟專用快複製到記憶體系統工作區中,訪問記憶體專用塊既可完成申請和釋放工作

5.14 檔案系統的實現層次

補充

inode、目錄項

  • 檔案系統中的每個檔案都有一個磁碟 inode 與之對應,這些 inode 被集 中存放於磁碟上的 inode 區
  • Inode儲存了檔案系統物件的一些元資訊,如所有者、訪問許可權(讀、寫、執行)、型別(是檔案還是目錄)、內容修改時間、inode修改時間、上次訪問時間、對應的檔案系統儲存塊的地址,等等
  • 目錄項:

inode與檔案訪問:

  • 當訪問某檔案時,若在活動 inode 表中找不到其 inode,就申請一個空閒活動 inode,把磁碟 inode 內容複製給它,隨 之就可用來控制檔案讀寫。
  • 使用者關閉檔案時,活動 inode 的內容回寫到對應的磁碟 inode 中,再釋放活動 inode 以供它用。把 FCB 的主要內容 與索引節點號分開,不僅能夠加快目錄檢索速度,而且,便於實現檔案共享。

層次目錄結構

樹型多級目錄優點:

  • 較好地反映現實世界中具有層次關係的資料集合和確切地反映系統內部檔案的分支結構;

  • 不同檔案可重名,只要它們不位於同一末端子目錄中,易於規定不同層次或子目錄中檔案的不同存取許可權,便於檔案的保護、保密和共享等,有利於系統的維護和查詢

純樹型目錄結構

  • 每個檔案都只有一個父目錄
  • 檔案共享不是對稱的,父目錄有效擁有該檔案,其他被授權使用者必須經過屬主目錄才能對該檔案進行訪問

有向無環圖目錄結構

  • 允許檔案有多個父目錄而破壞樹的特性
  • 不同使用者可以對稱方式實現檔案共享,即可能屬於不同使用者的多個目錄,使用不同檔名能訪問和共享同一個檔案
  • 由於一個檔案可能有多個父目錄,需為每個檔案維護一個引用計數,用來記錄檔案的父目錄個數,僅當引用計數為1時,刪除操作才移去檔案,否則僅僅把相關記錄從父目錄中刪去

多重索引結構

檔案系統磁碟結構

  • 超級塊:1#
    • 存放檔案系統結構和管理資訊,元資料
    • 超級塊就是檔案系統的心臟
      • 記錄inode表所佔盤塊數
      • 檔案資料所佔盤塊數
      • 主存中登記的空閒盤塊數
      • 主存中登記的空閒塊物理塊號
      • 主存中登記的空閒inode數
      • 主存中登記的空閒inode編號
      • 及其他檔案管理控制資訊
    • 超級塊既有盤位示圖的功能,又記錄整個檔案卷的控制 資料
  • inode節點區:2#~k+1#
    • Unix檔案的核心
    • 所有inode都有相同大小,且inode表是inode結構的列表
    • 檔案系統中的每個檔案在該表中都有一個inode
    • 又分磁碟inode表和主存活動inode表,後者解決頻繁訪問磁碟inode表的效率問題。
  • 資料區:k+2#~n#
    • 檔案的內容儲存在這個區域,磁碟上所有物理塊的大小是一樣的,如果檔案包含超過一塊的資料,則檔案內容會存放在多個盤塊中
    • 資料塊、目錄塊

檔案系統的功能及實現

一些重要的資料結構:

  • 使用者開啟檔案表

    • 程序的PCB結構中保留一個files_struct,稱為使用者開啟檔案表或檔案描述符表

    • 表項的序號為檔案描述符fd,該登記項內登記系統開啟檔案表的一個入口指標fp

    • 通過此係統開啟檔案表項連線到開啟檔案的活動inode

  • 系統開啟檔案表

    • 由於一個檔案可以被多個程序同時開啟或一個程序同時開啟多次,帶來了如何管理檔案當前位移量的問題
    • 是為解決多使用者程序共享檔案、父子程序共享檔案而設定 的系統資料結構file_struct
    • 不管是同一個程序還是不同程序,每當開啟一個檔案時,通過此表項把使用者開啟檔案表的表項與檔案活動inode聯接起來,以實現資料的訪問和資訊的共享
    • 多個file可以對應同一個inode,一個node可以連線0個或者多個file
  • 主存活動inode表

    • 把常用和正在使用的那些檔案目錄複製進主存,這樣既不增加太多主存開銷,又可明顯減少查詢時間
      • 系統為每個使用者程序建立一張活動檔案表,使用者使用檔案之前先通過“開啟”操作,把該檔案的檔案目錄複製到指定主存區域
      • 當不再使用該檔案時,使用“關閉”操作切斷和該檔案目錄的聯絡,這樣,檔案被開啟後,可被使用者多次使用,直至檔案被關閉或撤銷,大大減少訪盤次數,提高檔案系統的效率。
    • i_count反應共享inode的程序數目,是關閉檔案時活動inode能否釋放的依據
    • i_nlink連線計數,決定刪除檔案時是否將佔用的儲存空間釋放

檔案系統呼叫

  • 檔案的建立

    檔案尚未存在,需要對其建立,或者檔案已經存在需要重新建立。

    不同於檔案的開啟,開啟是指檔案已經存在。

    fd = create (filenamep, mode);

    1. 為新檔案分配索引節點和活動索引節點,並把索引節點編號與檔案分量名組成新目錄項,記到目錄中
    2. 在新檔案所對應的活動索引節點中置初值,如置存取許可權 i_mode=mode,連線計數i_nlink=1
    3. 分配使用者開啟檔案表項和系統開啟檔案表項,置表項初值,讀寫位移f_offset清“0”
    4. 把各表項及檔案對應的活動索引節點用指標連線起來,把 檔案描述字返回給呼叫者
  • 檔案的刪除

    在執行刪除時,必須要求使用者對該檔案具有“寫”操作權

    unlink(filemep);

    1. 把指定檔案從所在的目錄檔案中除去

    2. 如果沒有連線使用者(i_link 為“1”),還要把檔案佔用的儲存空間釋放

  • 檔案的開啟

    fd = open (filenamep, mode);

    1. 檢查目錄,如果未建立,報錯;在檢索到指定檔案後,把磁碟inode複製到活動inode表中
    2. 根據引數mode核對許可權,如果非法,則這次開啟失敗
    3. 當“開啟”合法時,為檔案分配使用者開啟檔案表項和系統開啟檔案表項,併為表項設定初值。通過指標建立這些表項 與活動索引節點間的聯絡。把檔案描述字,即使用者開啟檔案表中相應檔案表項的序號返回給呼叫者

    注意:如果其他使用者已經開啟同一檔案,活動inode表中已有該檔案的inode,不執行1,僅把活動inode表中的i_count+1即可。

  • 檔案的關閉

    close(fd);

    1. 根據fd找到使用者開啟檔案表項,再找到系統開啟檔案表項。釋放使用者開啟檔案表項。
    2. 把對應系統開啟檔案表項中的f_count減“1”,如果非“0”,說明還有程序共享這一表項,不用釋放直接返回; 否則釋放表項。
    3. 把活動索引節點中的i_count減“1”,若不為“0”,表明還有使用者程序正在使用該檔案,不用釋放而直接返回, 否則在把該活動索引節點中的內容複製迴文件捲上的相應索引節點中後,釋放該活動索引節點。
    • f_count反映不同程序通過同一個系統開啟檔案表項共享 一個檔案的情況;

    • i_count反映不同程序通過不同系統開啟檔案表項共享一 個檔案的情況

  • 讀檔案

    nr = read (fd, buf, count);

    1. 根據f_flag中的資訊,檢查讀操作合法性,
    2. 根據當前位移量f_offset值,要求讀出的位元組數,及活動索引節點中i_data[]指出的檔案物理塊 存放地址,把相應的物理塊讀到緩衝區中
    3. 然後再送到bufp指向的使用者主存區中
  • 寫檔案

    nw = write (fd, buf, count);

    buf是資訊傳送的源地址,即把buf所指向的使用者主存區中的資訊,寫入到檔案中

  • 檔案的隨機存取

    在檔案初次“開啟”時,檔案的位移量f_offset清空為零, 以後的檔案讀寫操作總是根據offset的當前值,順序地讀寫 檔案。為了支援檔案的隨機訪問,提供系統呼叫lseek,它允許使用者在讀、寫檔案前,事先改變f_offset的指向

    lseek (fd, offset, whence);

    • 當whence是“0”時,則f_offset被置為offset
    • 當whence是“1”時,則f_offset被置為檔案當前位 置加上offset。

檔案共享

檔案的靜態共享

OS允許一個檔案同時屬於多個目錄,但實際上檔案僅有一處物理儲存的“多對一”關係

link (oldnamep, newnamep);

  1. 檢索目錄找到oldnamep所指向檔案的索引節點inode編號
  2. 再次檢索目錄找到newnamep所指檔案的父目錄檔案,並把已存在檔案的索引節點inode編號與別名構成一個目錄項,記入到該目錄中去
  3. 把已存在檔案索引節點inode的連線計數i_nlink加“1”

檔案的動態共享

檔案動態共享是系統中不同的使用者程序或同一使用者的不同程序併發訪問同一檔案

檔案的符號連結共享