1. 程式人生 > >作業系統中的檔案系統

作業系統中的檔案系統

注:本文為個人學習過程中的筆記和總結,如有錯誤還望指出。

作業系統檔案系統相關知識

檔案基礎知識

檔案概念

計算機檔案(或稱檔案、電腦檔案、檔案),是儲存在某種長期儲存裝置上的一段資料流。所謂“長期儲存裝置”一般指磁碟、光碟、磁帶等。其特點是所存資訊可以長期、多次使用,不會因為斷電而消失。#檔案概念

檔案屬性

一般來說不同的系統可能檔案屬性並不相同。但通常具有以下屬性:
- 名稱:檔名稱
- 識別符號:標識檔案的唯一標籤
- 型別:檔案的型別
- 位置:指向檔案所在的裝置位置
- 大小:檔案的大小,以位元組或塊等來統計
- 許可權:檔案的保護許可權
- 時間、日期和使用者標識:檔案建立、修改、上次訪問時間,該檔案的所有使用者和所有組等資訊
可以使用stat filename

命令來檢視檔案的狀態資訊。(以可讀方式顯示inode的資訊)

[email protected]:~$ stat Plan.txt 
  File: 'Plan.txt'
  Size: 74          Blocks: 8          IO Block: 4096   regular file
Device: 801h/2049d  Inode: 932658      Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  hnzhrh)   Gid: ( 1000/  hnzhrh)
Access: 2018-03-23 23:00:59.690757691
-0700 Modify: 2018-03-22 06:15:31.000000000 -0700 Change: 2018-03-22 08:00:49.439853750 -0700 Birth: -

檔案操作

包括建立、刪除、寫、讀、重定位、截斷等操作。
當程序開啟一個檔案時,該程序會維護一個檔案開啟表。當需要其他檔案操作時,系統不需要去磁碟去搜索,只在檔案開啟表中進行查詢,檔案開啟表中一般維護著檔案的檔案指標、位置偏移量等資訊。當程序關閉該檔案時,在檔案開啟表中刪除對應的條目即可。一般來說,作業系統採用兩級內部表,作業系統維護著一個全域性檔案開啟表,儲存著所有程序開啟的所有檔案的條目,在全域性檔案開啟表條目中,加入檔案開啟計數器(有多少個程序打開了該檔案)。當程序開啟檔案時,程序的檔案開啟表中的該條目指向全域性檔案開啟表的相對應條目,並使檔案開啟計數器加1。如此,當多個程序開啟同一個檔案時,除了第一個程序需要在磁碟搜尋,其餘的程序只需要去全域性檔案開啟表中搜索。程序在關閉檔案之後,如果全域性檔案開啟表中的檔案開啟計數器不為0,則作業系統並不關閉這個檔案,直到其為0之後,再關閉這個檔案。

內部檔案結構

磁碟I/O是按照塊來執行的,而資料流是按照位元組來執行的,所以一般會把寫入磁碟的資料先打包,打包成邏輯塊,之後寫入磁碟塊。正是因為磁碟是按照塊來分配的,如果當最後一個邏輯塊小於磁碟塊的時候,這些浪費的磁碟空間稱為內部碎片,塊越大,內部碎片也越大。並且I/O最小單位有可能是多個磁碟塊。比如上面命令的結果,可以看出是以8個塊為最小單位的。

檔案系統的實現

檔案系統的結構

檔案系統一般是分層結構,每層利用低層功能建立新的功能為高層服務。
這裡寫圖片描述

邏輯檔案模組

邏輯檔案模組維護著元資料,包括所有檔案的結構資料,並不包含檔案內容資料。邏輯檔案模組通過檔名來管理目錄結構,包含的檔案控制塊維護著檔案資訊,包括檔案的擁有者,許可權和檔案內容的位置。該模組還負責保護和安全。

檔案組織模組

檔案組織模組知道資料塊和物理塊,通過一個翻譯器將資料塊地址對映到物理塊地址,該實體地址被下層基本檔案模組所使用。檔案組織模組包含空閒空間管理器,跟蹤未分配的塊提供給檔案組織模組。

基本檔案模組

基本檔案模組知道物理塊,物理塊由磁碟地址來標識(驅動器?,柱面?,磁軌?,扇區?)。傳送一般指令給IO控制模組。

IO控制模組

IO控制模組實現了磁碟和記憶體之間的資訊傳遞。由裝置驅動程式和中斷處理程式組成。裝置驅動程式可以作為翻譯器,將基本檔案模組發出的一般指令翻譯為硬體指令,這些指令控制IO控制器採取動作。

實現概述

不同的作業系統,檔案系統的實現可能不同,如Windows支援FAT,FAT32和NTFS,而UNIX使用UNIX檔案系統(UFS),標準的Linux檔案系統是可擴充套件檔案系統,最常用的版本是ext2和ext3。檔案系統包含的資訊如下:

  • (每個分割槽的)引導控制塊,內含引導作業系統的資訊(有作業系統的情況下),通常為分割槽的第一個磁碟塊。UFS稱為引導塊,NTFS稱為分割槽引導扇區。
  • (每個分割槽的)分割槽控制塊,包含分割槽的詳細資訊,如分割槽的塊數,快的大小,空閒塊的數量和指標,空閒FCB的數量和指標。UFS稱為超級塊,NTFS中它儲存在主控檔案表中。
  • 目錄結構。UFS中包含檔名和索引節點號。NTFS儲存在主控檔案表中。
  • 每個檔案的FCB,包含更多詳細資訊,如檔案許可權,大小,擁有者和資料塊的位置。UFS稱之為索引節點。NTFS儲存在主控檔案表中。
  • 記憶體內資訊(用於檔案系統管理並通過快取來提高效能)。包括記憶體中的安裝表,包括所有安裝分割槽的資訊。記憶體中的目錄結構快取,儲存近期訪問的目錄資訊。系統範圍內的檔案開啟表。單個程序的開啟檔案表等。

建立檔案過程:
應用程式通過系統呼叫訪問邏輯檔案模組,分配一個新的FCB,系統讀入檔案資訊到記憶體中,用新的檔名更新該檔案和FCB,將結果寫回到磁碟。
大致圖示:
這裡寫圖片描述
開啟檔案過程:
系統首先在系統檔案開啟表中搜索是否有其他程序打開了該檔案,如果存在,則在該程序檔案開啟表中建立一項指向系統範圍檔案開啟表的對應項。
如果沒有在系統檔案開啟表中找到,則在記憶體中的近期檔案開啟快取中查詢,一旦找到,其FCB將被複制到系統檔案開啟表中。
如果快取中沒有找到,則去磁碟FCB塊查詢。
大致圖示:
這裡寫圖片描述

磁碟分配方法

磁碟分配主要需要解決的問題是如何為檔案分配磁碟空間,以便有效的使用磁碟空間和快速地訪問檔案。常用地主流磁碟分配方法有連續、連結和索引。
外部碎片和內部碎片:
這裡寫圖片描述
上面提到過為了效率,資料不會按照位元組寫入磁碟,而是按照資料塊寫入磁碟塊,如圖所示,按照8個磁碟塊的大小寫入磁碟,但是,資料可能並沒有這麼大,所以這8個磁碟塊中會產生空閒,這些空間稱為內部碎片。在檔案系統分配磁碟空間時,並不會一個接一個的分配,因為檔案大小並不是一直固定不變的,所以可能會預留擴充套件磁碟塊。如圖所示,第二個檔案資料寫入磁碟時,是從11號開始的,那麼,前一個檔案與該檔案之間會產生空閒空間,這些空間就稱為外部碎片。

連續分配方法

連續分配方法要求每個檔案都在磁碟中佔用連續的塊。檔案的連續分配方法可以用第一塊的地址和連續塊的數量來定義。

檔案 起始塊號 長度
檔案1 10 6
檔案2 21 5

連續分配方法支援順序訪問和直接訪問。
連續分配方法產生的主要問題是為新檔案找到空閒空間。常用的方法有首次適合和最優適合。首次適合指的是查詢空閒空間表,找到第一個足夠大的空間進行分配,最優適合指的是查詢到最小的足夠大的空間進行分配。但是這些演算法都有外部碎片的問題。當空間佔用到一定程度的時候,可能會出現很多小連續空閒空間,但是沒有一個足夠大的連續空閒空間。以前的軟盤當出現這種情況時,會複製資料到其他介質,軟盤變成空的,之後再進行連續分配,將小的空閒空間合併。但是並不適用現如今的大容量硬碟。
連續分配方法的另一個問題是如何確定一個檔案到底需要多少空間。檔案可能會變化。如果分配過大,則內部碎片太大,如果分配過小,則可能無法進行擴充套件,有兩種解決方法,第一種終止使用者程式,產生錯誤資訊,第二種就是複製該檔案到另外一塊足夠大的空閒空間,並釋放之前佔用的空間,但這個操作比較耗費時間。
為了減少這些缺點,有的系統使用修正的連續分配方案。剛開始分配一塊連續空間,當空間不夠用時,另一塊擴充套件連續空間會新增到原來的分配中。這樣,檔案塊的位置就會變成起始地址,塊數以及指向下一擴充套件空間的指標。

連結分配方法

連結分配方法是指在每一個磁碟塊的末尾附上指向下一額磁碟塊的指標。這樣,連結分配方法可用用起始地址和結束地址來定義。
連結分配方法不支援直接訪問。如果要訪問檔案的第i塊,必須從第一塊開始順著指向下一塊的指標找到第i塊。
連結分配方法沒有外部碎片的產生,只要有空閒空間,檔案就可以擴充套件。
連結分配方法的問題之一是訪問時間,因為塊可能分佈在不同磁軌上,當讀取檔案時,可能需要磁碟尋道。
連結分配方法的另一個問題是指標需要空間,並且因為指標分佈在整個磁碟上,當出現指標損壞或丟失的時候,可能會導致獲得到的指標錯誤,從而產生問題。
解決指標空間的方法一般是將多個塊組成簇,並且是按照簇來分配空間,而不是按照塊,這樣指標佔用的空間百分比就會減少,提高了磁碟輸出(更少的磁碟移動)。但是如果一個簇沒有被充分使用,就會產生內部碎片問題。

索引分配方法

連結分配方法不能支援直接訪問,這一問題可以使用索引分配方法解決。把所有的指標放在一起構成一個索引塊。
這裡寫圖片描述
索引分配方法會浪費空間,因為索引塊需要維護多個指標。
但是,不同檔案大小應該對應多大的索引塊呢?索引塊不能太大也不能太小,太小不夠儲存檔案,太大會產生空間浪費。解決這個問題有以下三種方案:
第一種:連結方案
即索引塊末尾可以含有一個指向下一個索引塊的指標,小檔案的時候為nil。
第二種:多層索引
為了訪問一個塊,可以使用索引塊中的地址指向另外一個索引塊,根據檔案的大小增加層數。假設一個塊的大小為4KB,那麼第一層索引塊(索引塊一般為一個塊)可以存入1024個4B的指標,兩層索引可以訪問1024*1024個數據塊,兩層允許的最大檔案則為4G。
這裡寫圖片描述
第三種:組合方案
假設塊的大小為4KB。
在UFS中將索引塊的頭15個指標存在檔案的inode中。其中,前12個指標直接指向資料塊,那麼不超過48KB的資料可以直接訪問。第十三個指標為一級間接塊指標,指向一個索引塊,索引塊的指標再指向資料塊。第是四個指標為二級間接塊指標,指向一個索引塊,索引塊中存的是指向索引塊的指標。第十五個指標為三級間接塊指標,與上類似。
這裡寫圖片描述

參考資料:
《作業系統概念第七版》

相關推薦

作業系統檔案索引練習題

設檔案索引結點中有8個地址項,每個地址項大小為4位元組,其中5個地址項為直接地址索引,2個地址項是一級間接地址索引,1個地址項是二級間接地址索引,磁碟索引塊和磁碟資料塊大小均為1KB。則可表示的單個檔案最大長度是多少KB? 解:磁碟索引塊為1KB位元組,每個地址

現代作業系統檔案系統(下)

檔案系統的管理和優化 磁碟空間管理 幾乎所有的檔案系統都把檔案分割成固定大小的塊來儲存,各塊之間不一定相鄰。 效能和空間利用率是矛盾的。 跟蹤空閒塊有兩種常用的方法——第一種方法是採用磁碟塊連結串列,那個塊中包含儘可能多的空閒磁碟號。通常情況下,次啊用空閒塊存放空閒表,

現代作業系統檔案系統(上)

程序執行時,可以在他自己的地址空間記憶體儲一定量的資訊,但儲存容量受虛擬地址空間大小的限制。 程序上儲存空間的第二個問題是——當程序終止時,他儲存的資訊也隨之消失。 第三個問題是:經常需要多個程序同事都去同一個資訊(或部分資訊) 檔案鎖程序建立的資訊邏輯單元。一個磁碟一般

linux檔案系統的掛載,及各種型別的實現試驗

掛載介紹: 系統的中的檔案系統需要掛載才可進行讀取訪問。掛載就是將檔案系統與當前系統根下的某一個目錄產生對映關係,訪問該目錄時實際訪問的是掛載在該目錄上的檔案系統。 注意:在目錄下有檔案時,將檔案系統掛載在該目錄上時,將無法訪問該原本該目錄下的檔案,只能顯示

作業系統檔案儲存空間的管理

一、檔案儲存空間管理的概念 由於檔案儲存裝置是分成若干個大小相等的物理塊,並以塊為單位來交換資訊的,因此,檔案儲存空間的管理實質上是一個空閒塊的組織和管理問題,它包括空閒塊組織,空閒塊的分配和空閒塊的回收等幾個問題。 二、檔案儲存空間管理的方式 1. 空閒表法(空閒檔

作業系統知識點——檔案系統

一、檔案的基本概念(一)檔案的概念檔案是具有檔名的一組相關元素集合,在檔案系統中是一個最大的資料單位,它描述了一個物件集,每個檔案都有一個檔名,使用者通過檔名來訪問檔案。檔案表示的範圍很廣,系統或使用者可以將具有一定功能的程式或資料集合命名為一個檔案。(二)檔案的屬性1、名稱

作業系統的根檔案系統裝置

在作業系統中剛進行加電啟動電腦的時候是不存在對檔案的處理的。所以對於系統模組載入記憶體期間,在螢幕上出現的“loading”並不是用printf這種檔案操作實現的,而只是通過最原始的彙編進行的。 作業

作業系統檔案系統

注:本文為個人學習過程中的筆記和總結,如有錯誤還望指出。 作業系統檔案系統相關知識 檔案基礎知識 檔案概念 計算機檔案(或稱檔案、電腦檔案、檔案),是儲存在某種長期儲存裝置上的一段資料流。所謂“長期儲存裝置”一般指磁碟、光碟、磁帶等。其特點是

Atittit HDFS hadoop 大資料檔案系統java使用總結 目錄 1. 作業系統,進行操作 1 2. Hdfs 類似nfs ftp遠端分散式檔案服務 2 3. 啟動hdfs服務start

Atittit HDFS hadoop 大資料檔案系統java使用總結   目錄 1. 作業系統,進行操作 1 2. Hdfs 類似nfs ftp遠端分散式檔案服務 2 3. 啟動hdfs服務start-dfs.cmd 2 3.1. 配置core-site

作業系統課設實驗五---Nachos檔案系統擴充套件

這次的實驗讓我想起了上學期被作業系統的九個實驗支配的恐懼,因為這次可能也是前五次試驗中最難的一次了,讀原始碼加實現花了可能一兩天的時間,所以也有必要記錄一下,有些地方做的不是很好,比如Makefile自己寫的話可能不需要把所有檔案都從filesys複製到lab5,可是我太菜做不到,所以先這樣

如何實現windows系統與虛擬機器linux系統間的通訊,使linux系統能夠上網,兩個系統間可以進行檔案互傳。

       我使用的虛擬機器軟體為virtual box,系統為redhat 6.6,本機系統為win10旗艦版。當然,其他環境具體操作起來或許會有細微差別,但大體方向相同。        一、使虛擬機器系統能夠上

Node.jsfs檔案系統-與檔案file相關;

1.首先引入fs檔案模組; //讀取檔案; fs.readFile(path[, options], callback)  path:檔名; options:檔案讀取方式; callback:回撥函式;回撥函式有兩個引數err data  其中data是檔案的

Node.js的fs檔案系統--目錄相關方法;

檔案系統:Linux/Unix (一切皆檔案)file 檔案dir 目錄unknown 未知檔案block 塊狀裝置檔案char 字元型裝置link 連結fifo 管道Windowsfile 檔案dir 目錄unknown 未知檔案 一、與目錄相關的; 1. 首先引入fs檔案模組; va

Linux umount 命令 - 解除安裝掛在 Linux 目錄檔案系統

Linux umount 命令 - 解除安裝掛在 Linux 目錄中的檔案系統 Linux umount 命令用於解除安裝檔案系統,解除安裝掛在 Linux 目錄中的檔案系統。 [email protected]:~$ ssh [email protected

node.js檔案系統

檔案開啟操作 fs.open(path, flags[, mode], callback) path: <string>|<Buffer>|<URL> flags: <string>|<number> mode: <integ

linux系統檔案傳輸、歸檔、壓縮

環境為redhat系統內有兩臺虛擬機器,分別是desktop(主機名為node1)和server(主機名為node2)。所有操作均在虛擬機器內操作。 首先說一下如何修改主機名 hostnamectl set-hostname node2.example.com

Linux系統檔案行末尾出現^M的原因及解決辦法

不同系統,有不同的換行符號: 在windows下的文字檔案的每一行結尾,都有一個回車('\n')和換行('\r') 在linux下的文字檔案的每一行結尾,只有一個回車('\n'); 在Mac下的文字檔案的每一行結尾,只有一個換行('\r'); 因此:^M出現的原因: 在linux下開啟w

現代作業系統: 第四章 檔案系統

在多程式多使用者的系統上,讀取資料有以下問題: 如何找到資訊? 如何防止一個使用者讀取另一個使用者的資料 如何知道哪些塊是空閒的? 通過前面的學習, 我們知道 作業系統對處理器進行抽象 建立了程序這個概念; 通過對物理儲存器的抽象建立了 虛擬地址空間的概念,

Linux系統各種系統日誌檔案主要存放在系統哪個目錄

/var/log/message 系統啟動後的資訊和錯誤日誌,是Red Hat Linux中最常用的日誌之一 /var/log/secure 與安全相關的日誌資訊 /var/log/maillog 與郵件相關的日誌資訊 /var/log/cron 與定時任務相關的日誌資訊 /va

Linux系統下python學習筆記——Linux檔案和目錄常用命令詳解

一、檢視目錄內容 ls命令說明: 英文單詞list的簡寫,功能為列出目錄的內容,是使用者最常用的命令字義    Linux下檔案和目錄的特點: Linux檔案或目錄名稱最長可以有256個字元 以 . 開頭的檔案為隱藏檔案,需要用-a引數才能顯示(all