【Linux系統】文件系統(2)——文件讀取過程

前言

在前面的文章【Linux系統】文件系統(1)——磁盤的基本知識中,主要對存儲文件的磁盤的一些基礎知識進行了介紹。對於Linux系統來講,一切的數據都起源於磁盤中存儲的文件。Linux文件系統的結構及其在磁盤中是如何存儲的?操做系統是怎樣找到這些文件進行讀取的?這一章主要圍繞這幾個問題進行介紹(以Ext2文件系統(傳統的linux文件系統)爲例)。node

Linux系統目錄樹

linux文件系統全部文件和目錄都是由目錄開始的,以樹的形式展開,以下圖所示:linux

clipboard.png

根據FHS的基本定義,根目錄下面的各個目錄(如usr,var)基本上都有其特定的意義,在此很少作介紹。重點說一下根目錄'/'的做用和意義:編程

  • 其餘全部目錄都是由根目錄衍生出來的。
  • 根目錄中包含了開機軟件、系統內核文件、函數庫、文件系統修復程序等。

所以,根目錄(/)所在的分區應該越小越好,應用程序所安裝的軟件最好不要與根目錄存放在同一個分區。根目錄越小,系統性能會更好,根目錄所在的文件系統也較不容易出現問題。segmentfault

文件(目錄)存儲方式

linux中,磁盤(硬盤)上的存儲劃分以下圖所示:windows

clipboard.png

  • MBR: 主引導分區。
  • 自舉塊(引導分區Boot Sector):分區中文件系統自身引導程序存放的地方。
  • 超級塊(Super block): 記錄整個文件系統相關的信息的地方,它記錄的信息主要有:block與inode的總量、使用量、剩餘量,文件系統的掛載時間,最近一次寫入數據的時間等。
  • 柱面組(塊組) 每一個柱面爲一個柱面組(組號與柱面號一致),一個分區包含多個柱面。
  • 配置信息:不詳。
  • i節點位圖(inode bitmap):每一個inode結點對應位圖中的一個位(這樣一個字節可表示8個inode的使用狀況),每一個位值爲0或1,表示該位所處下標對應的inode有沒有被使用。
  • 塊位圖(block bitmap):每一個數據塊或目錄塊都對應着塊位圖中的一個位,位的下標和塊編號一一對應,每一個位的值爲0或1,表示該塊是否已被使用。
  • i節點表(數組)(inode table):每一個文件或者目錄都有對應的一個inode,inode放在inode table中,包括inode的編號及其對應的信息。
  • i節點(inode): 存儲文件相關信息(不包括文件名)。
  • 數據塊(data block): 存儲文件具體內容。
  • 目錄塊: 特殊一點的數據塊,存放inode編號--文件(目錄)名

inode詳解

inode的主要記錄了文件的屬性以及該文件實際數據是放在哪幾號數據塊(或目錄塊)中,具體包含如下信息:數組

  • 文件的訪問模式(r/w/x)
  • 文件全部者和組(owner/group)
  • 文件大小
  • 文件建立或狀態改變的時間(ctime)
  • 最近一次的讀取時間(atime)
  • 最近修改的時間(mtime)
  • 定義文件特性的標誌(flag)
  • 文件真正內容指向的數據塊(pointer)

另外,inode的特徵有:緩存

  • inode的數量和大小在磁盤格式化的時候就已經固定了,除非再次格式化從新設置,不然不可改變。
  • 每一個inode的大小均爲128Bytes。
  • 每一個文件僅佔用一個inode。
  • 文件系統可以建立(存儲)的文件數量和inode的數量有關,也和磁盤大小(數據塊數量)有關。
  • 系統讀取文件時,須要先找到inode,分析inode記錄的權限與用戶是否符合,若符合才能夠開始實際讀取數據塊中的內容。
  • 爲了解決inode數量可能不夠用的問題,操做系統將inode記錄block號的區域定義爲12個直接、1個間接、1個雙間接、1個三間接的記錄區。
  • 文件IO編程中常說的文件句柄,其實就是inode編號。

文件讀取過程

已讀取文件/var/log/message爲例,講解讀取文件messages時,從磁盤中查找/讀取文件內容的過程。異步

clipboard.png

  1. 首先系統經過掛載信息(在超級塊中,位置固定)找到根目錄(/)的inode編號,根目錄對應的inode是固定的(一般爲2號)。
  2. 根據根目錄的inode編號(2號),在inode table中找到對應的inode信息,從inode信息中找到存儲根目錄信息的目錄塊編號,根據編號找到數據塊,如圖中標記爲‘/’的方格,該目錄塊存儲的信息如圖中的dentry所示。
  3. 從目錄塊中存儲的信息中,找到文件名(目錄名)爲var所對應的inode編號(2667711)。
  4. 在inode table中找到編號爲2667711的inode信息,從該inode信息中,找到var目錄存放的數據塊。從var數據塊存儲的信息中,找到log目錄對應的inode編號(267850)。
  5. 重複上述步驟,直至找到message文件對應的inode結點,根據inode結點中記錄的message文件內容對應的數據塊,從數據塊中讀取內容。

扇區、塊(簇/數據塊)、頁

在操做系統數據交互過程當中,常常聽到扇區、塊(簇/數據塊)、頁這幾種單位,他們在數據交互過程當中的意義爲:函數

  • 扇區: 磁頭從磁盤中讀取數據的最小單位,即磁頭每次從磁盤中讀取數據,都是一個扇區一個扇區讀的。
  • 塊(簇): 操做系統與磁盤(硬盤)交互的最小數據單元(在linux系統中稱爲塊,在windows系統中稱爲簇)。操做系統從硬盤中拿一數據,即完成一次磁盤IO。塊(數據塊)的大小在硬盤格式化時被指定,通常有1K,2K,4K(最經常使用)。若是塊的大小設置爲4K,那麼磁盤要讀取8個扇區以後,纔將數據塊傳給操做系統。另外,數據塊也是DOS下數據存儲的最小單元。例如,若是一個文件的大小爲1K,而塊的大小爲4K,那麼該文件仍是會佔用一個塊,塊中剩下的3K被空閒出來,不能用於存儲其餘數據。所以,設置塊的大小時,須要考慮要存儲文件的大小。
  • 頁: 操做系統訪問內存時的最小單元,通常系統頁的大小爲4K(或者更大)。操做系統訪問內存中的數據時,若是發現內存中沒有哪一個能夠提供該數據,那麼會發生缺頁,系統經過頁替換(從硬盤中讀取數據)的方式,將數據從硬盤讀取到內存頁中,再返回給調用者。

總的說來,主要就是不一樣系統、設備間數據交互時,使用了不一樣的機制和概念。其中磁盤內部(磁盤驅動程序從磁盤)讀取數據時,以扇區爲單位;操做系統從磁盤讀取數據時,以塊爲單位;操做系統從內存讀取數據時,以頁爲單位。性能

操做系統對文件存取操做的優化

並不是每次讀、寫文件操做都會真正地從磁盤讀出或寫入,那樣性能難以接受。爲此操做系統使用了一系列機制,提高了文件IO的性能。

緩存

不論是硬盤仍是操做系統,都會對從磁盤片中讀取的數據進行緩存。硬盤中的緩存通常會比較小,如十幾M,操做系統中的緩存則可能大不少。系統會將經常使用的文件數據放到主存儲器的緩衝區,以加速文件系統的讀寫。通常狀況下,只要系統的內存夠用,系統會盡量多的將磁盤中經常使用的文件緩存到內存中,直至內存耗盡(這是正常現象)。好比,若是你發如今電腦上讀取文件的速度達到了2G每秒,那確定不是真的從磁盤讀取的,而是從緩存讀取的。因此要測試磁盤真正的讀數據的速度,須要先清空系統的緩存。

異步處理

當系統加載一個文件到內存後,若是該文件沒有被改動過,則在內存區段的文件數據會被標記爲clean,若是是被改動了,則會標記爲dirty。此時全部的文件操做仍是在內存中進行,並無寫入到磁盤中。系統會不定時的將內存中設置爲dirty的數據寫回到磁盤,以保持磁盤與內存數據的一致性。這個過程是異步的。你也能夠sync命令,將內存中的數強制寫回到硬盤。

另外,要注意的是,在正常關機的狀況下,關機命令會主動調用sync來將內存中的數據寫入到磁盤內,可是若是非正常關機(如斷電、死機),因爲數據沒有來得及寫入到磁盤,所以從新啓動可能會花費很長的時間進行磁盤檢驗,甚至可能致使文件系統的損毀(非磁盤損壞)。

總結

本文讀linux系統文件的讀取過程從裏到外作了較爲詳細的說明,已進入了linux操做系統層面,在下一篇文章中,可能會將這些原理與文件IO系統調用函數進行掛鉤講解,從而完成硬件-系統-應用的完整流程。

相關文章
相關標籤/搜索