Linux文件系統的實現 (圖文并茂,比較好)

作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段聲明。謝謝!

?

Linux文件管理從用戶的層面介紹了Linux管理文件的方式。Linux有一個樹狀結構來組織文件。樹的頂端為根目錄(/),節點為目錄,而末端的葉子為包含數據的文件。當我們給出一個文件的完整路徑時,我們從根目錄出發,經過沿途各個目錄,最終到達文件。

我們可以對文件進行許多操作,比如打開和讀寫。在Linux文件管理相關命令中,我們看到許多對文件進行操作的命令。它們大都基于對文件的打開和讀寫操作。比如cat可以打開文件,讀取數據,最后在終端顯示:

$cat test.txt

?

對于Linux下的程序員來說,了解文件系統的底層組織方式,是深入進行系統編程所必備的。即使是普通的Linux用戶,也可以根據相關的內容,設計出更好的系統維護方案。

?

存儲設備分區

文件系統的最終目的是把大量數據有組織的放入持久性(persistant)的存儲設備中,比如硬盤和磁盤。這些存儲設備與內存不同。它們的存儲能力具有持久性,不會因為斷電而消失;存儲量大,但讀取速度慢。

?

觀察常見存儲設備。最開始的區域是MBR,用于Linux開機啟動(參考Linux開機啟動)。剩余的空間可能分成數個分區(partition)。每個分區有一個相關的分區表(Partition table),記錄分區的相關信息。這個分區表是儲存在分區之外的。分區表說明了對應分區的起始位置和分區的大小。

?

我們在Windows系統常常看到C分區、D分區等。Linux系統下也可以有多個分區,但都被掛載在同一個文件系統樹上。

數據被存入到某個分區中。一個典型的Linux分區(partition)包含有下面各個部分:

?

分區的第一個部分是啟動區(Boot block),它主要是為計算機開機服務的。Linux開機啟動后,會首先載入MBR,隨后MBR從某個硬盤的啟動區加載程序。該程序負責進一步的操作系統的加載和啟動。為了方便管理,即使某個分區中沒有安裝操作系統,Linux也會在該分區預留啟動區。

啟動區之后的是超級區(Super block)。它存儲有文件系統的相關信息,包括文件系統的類型,inode的數目,數據塊的數目。

隨后是多個inodes,它們是實現文件存儲的關鍵。在Linux系統中,一個文件可以分成幾個數據塊存儲,就好像是分散在各地的龍珠一樣。為了順利的收集齊龍珠,我們需要一個“雷達”的指引:該文件對應的inode。每個文件對應一個inode。這個inode中包含多個指針,指向屬于該文件各個數據塊。當操作系統需要讀取文件時,只需要對應inode的"地圖",收集起分散的數據塊,就可以收獲我們的文件了。

?

?

最后一部分,就是真正儲存數據的數據塊們(data blocks)了。

?

inode簡介

上面我們看到了存儲設備的宏觀結構。我們要深入到分區的結構,特別是文件在分區中的存儲方式。

文件是文件系統對數據的分割單元。文件系統用目錄來組織文件,賦予文件以上下分級的結構。在硬盤上實現這一分級結構的關鍵,是使用inode來虛擬普通文件和目錄文件對象。

?

在Linux文件管理中,我們知道,一個文件除了自身的數據之外,還有一個附屬信息,即文件的元數據(metadata)。這個元數據用于記錄文件的許多信息,比如文件大小,擁有人,所屬的組,修改日期等等。元數據并不包含在文件的數據中,而是由操作系統維護的。事實上,這個所謂的元數據就包含在inode中。我們可以用$ls -l filename來查看這些元數據。正如我們上面看到的,inode所占據的區域與數據塊的區域不同。每個inode有一個唯一的整數編號(inode number)表示。

?

在保存元數據,inode是“文件”從抽象到具體的關鍵。正如上一節中提到的,inode儲存由一些指針,這些指針指向存儲設備中的一些數據塊,文件的內容就儲存在這些數據塊中。當Linux想要打開一個文件時,只需要找到文件對應的inode,然后沿著指針,將所有的數據塊收集起來,就可以在內存中組成一個文件的數據了。

?數據塊在1, 32, 0, ...

inode并不是組織文件的唯一方式。最簡單的組織文件的方法,是把文件依次順序的放入存儲設備,DVD就采取了類似的方式。但如果有刪除操作,刪除造成的空余空間夾雜在正常文件之間,很難利用和管理。

復雜的方式可以使用鏈表,每個數據塊都有一個指針,指向屬于同一文件的下一個數據塊。這樣的好處是可以利用零散的空余空間,壞處是對文件的操作必須按照線性方式進行。如果想隨機存取,那么必須遍歷鏈表,直到目標位置。由于這一遍歷不是在內存進行,所以速度很慢。

FAT系統是將上面鏈表的指針取出,放入到內存的一個數組中。這樣,FAT可以根據內存的索引,迅速的找到一個文件。這樣做的主要問題是,索引數組的大小與數據塊的總數相同。因此,存儲設備很大的話,這個索引數組會比較大。

inode既可以充分利用空間,在內存占據空間不與存儲設備相關,解決了上面的問題。但inode也有自己的問題。每個inode能夠存儲的數據塊指針總數是固定的。如果一個文件需要的數據塊超過這一總數,inode需要額外的空間來存儲多出來的指針。

?

inode示例?

在Linux中,我們通過解析路徑,根據沿途的目錄文件來找到某個文件。目錄中的條目除了所包含的文件名,還有對應的inode編號。當我們輸入$cat /var/test.txt時,Linux將在根目錄文件中找到var這個目錄文件的inode編號,然后根據inode合成var的數據。隨后,根據var中的記錄,找到text.txt的inode編號,沿著inode中的指針,收集數據塊,合成text.txt的數據。整個過程中,我們參考了三個inode:根目錄文件,var目錄文件,text.txt文件的inodes。

在Linux下,可以使用$stat filename,來查詢某個文件對應的inode編號。

?

在存儲設備中實際上存儲為:

?

當我們讀取一個文件時,實際上是在目錄中找到了這個文件的inode編號,然后根據inode的指針,把數據塊組合起來,放入內存供進一步的處理。當我們寫入一個文件時,是分配一個空白inode給該文件,將其inode編號記入該文件所屬的目錄,然后選取空白的數據塊,讓inode的指針指像這些數據塊,并放入內存中的數據。

?

文件共享

在Linux的進程中,當我們打開一個文件時,返回的是一個文件描述符。這個文件描述符是一個數組的下標,對應數組元素為一個指針。有趣的是,這個指針并沒有直接指向文件的inode,而是指向了一個文件表格,再通過該表格,指向加載到內存中的目標文件的inode。如下圖,一個進程打開了兩個文件。

可以看到,每個文件表格中記錄了文件打開的狀態(status flags),比如只讀,寫入等,還記錄了每個文件的當前讀寫位置(offset)。當有兩個進程打開同一個文件時,可以有兩個文件表格,每個文件表格對應的打開狀態和當前位置不同,從而支持一些文件共享的操作,比如同時讀取。

要注意的是進程fork之后的情況,子進程將只復制文件描述符的數組,而和父進程共享內核維護的文件表格和inode。此時要特別小心程序的編寫。

?

總結

這里概括性的總結了Linux的文件系統。Linux以inode的方式,讓數據形成文件。

了解Linux的文件系統,是深入了解操作系Linux原理的重要一步。

轉載于:https://www.cnblogs.com/tureno/articles/6159543.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/255773.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/255773.shtml
英文地址,請注明出處:http://en.pswp.cn/news/255773.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【深度學習】——如何處理輸入圖像大小不一樣的情況

這里一般有常見的幾種方法: 1)將圖像縮放成大小一致后再輸入,如RCNN算法 2)roi pooling:這里允許輸入圖像的大小不一樣,后續根據指定的固定大小來求解池化的核大小,以此來得到相同大小的特征圖&…

ROS探索總結(一)——ROS簡介

隨著機器人領域的快速發展和復雜化,代碼的復用性和模塊化的需求原來越強烈,而已有的開源機器人系統又不能很好的適應需求。2010年Willow Garage公司發布了開源機器人操作系統ROS(robot operating system),很快在機器人…

微信瀏覽器取消緩存的方法

摘要:做微信公家號以及調試手機頁面的時辰,防止不了頁面要跳轉到微信閱讀器打開,調試階段,android版微信閱讀器一直都默許緩存html靜態資本,每一次靜態資本變革乃至新內容發布的時辰在微信閱讀器上都極有可能不克不及更新&#xf…

【機器視覺】——裂紋檢測筆記

目錄 傳統算法處理裂縫的基本思路: 第一種思路 第二種思路: 第三種思路 CPP代碼 halcon代碼 python代碼 Matlab代碼 深度學習缺陷檢測 裂縫檢測文獻 傳統算法處理裂縫的基本思路: 第一種思路 1.先轉換彩色圖為灰度圖 2.進行自適應…

利用union判斷系統的大小端

int checkCPUendian()//返回1,為小端;反之,為大端; { union{ unsigned int a; unsigned char b; }c; c.a 1; return 1 c.b; }大端模式(Big-endian),是指數據的高字節保存在內存的低地址中,而數據…

Filter(過濾器)?和?interceptor(攔截器)的區別

Filter(過濾器) 和 interceptor(攔截器)的區別 1.攔截器是基于java反射機制的,而過濾器是基于函數回調的。 2.過濾器依賴于Servlet容器,而攔截器不依賴于Servlet容器。 3.攔截器只對Action請求起作用&#…

ROS探索總結(二)——ROS總體框架

一、 總體結構 根據ROS系統代碼的維護者和分布來標示,主要有兩大部分:(1)main:核心部分,主要由Willow Garage公司和一些開發者設計、提供以及維護。它提供了一些分布式計算的基本工具,以及整個…

python 阿貍的進階之路(4)

裝飾器 #1、開放封閉原則:對擴展開放,對修改是封閉#2、裝飾器:裝飾它人的,器指的是任意可調用對象,現在的場景裝飾器-》函數,被裝飾的對象也是-》函數#原則:1、不修改被裝飾對象的源代碼 2、不修…

【深度學習】——利用pytorch搭建一個完整的深度學習項目(構建模型、加載數據集、參數配置、訓練、模型保存、預測)

目錄 一、深度學習項目的基本構成 二、實戰(貓狗分類) 1、數據集下載 2、dataset.py文件 3、model.py 4、config.py 5、predict.py 一、深度學習項目的基本構成 一個深度學習模型一般包含以下幾個文件: datasets文件夾:存放…

二叉樹的序遍歷

時間限制: 1 s空間限制: 32000 KB題目等級 : 白銀 Silver題目描述 Description求一棵二叉樹的前序遍歷,中序遍歷和后序遍歷 輸入描述 Input Description第一行一個整數n,表示這棵樹的節點個數。 接下來n行每行2個整數L和R。第i行的兩個整數Li和Ri代表編號…

GUI登錄界面

在這次的作業中,我先使用單選按鈕,輸入框,復選框設計了一個簡單地登錄界面。接著我使用了MouseListener將登陸按鈕與下一個“查詢界面”連接起來。最后我使用了我們本周所學的JFrame框架與事件處理機制設計了一個簡單地界面。我所設計的登錄界…

淺談ROS操作系統及其應用趨勢

ROS操作系統是最先由斯坦福開發的開源機器人操作系統,目前由willowgarage公司開發和維護,相關的開發社區也很成熟( http://www.ros.org , http://answers.ros.org, http://www.willowgarage.com), 經過幾年的發展API也逐漸穩定&a…

Raft學習傳送門

Raft官網 官方可視化動畫1 官方可視化動畫2 論文中文翻譯 論文英文地址 Paxos Made Simple論文翻譯 Raft理解 技術分享 《分布式一致性raft算法實現原理》 狀態機 MIT: raft實現 分布式系統學習2-Raft算法分析與實現 分布式系統MIT 6.824學習資源 知乎大神的&#…

【Python生成器與迭代器的區別】

目錄 一、迭代 二、迭代器 1)創建迭代器——兩種方法 iter()方法 利用()和range結合使用 2)具體案例 3、生成器 4、二者的異同 1)、共同點 2)、不同點 a、語法上 b、用法上 一、迭代 首先理解一…

BZOJ4426 : [Nwerc2015]Better Productivity最大生產率

如果一個區間包含另一個區間,那么這兩個區間是否在一起的生產率是一樣的。 將所有這種包含了其他區間的區間放入數組$b$,其余的放入數組$c$,有多個相同的時候則從$b$移一個到$c$。 那么$c$里所有區間左端點遞增,右端點也遞增&…

[codevs1105][COJ0183][NOIP2005]過河

[codevs1105][COJ0183][NOIP2005]過河 試題描述 在河上有一座獨木橋,一只青蛙想沿著獨木橋從河的一側跳到另一側。在橋上有一些石子,青蛙很討厭踩在這些石子上。由于橋的長度和青蛙一次跳過的距離都是正整數,我們可以把獨木橋上青蛙可能到達的…

ABB機器人套接口通信 機器人部分

ABB機器人套接口通信 機器人部分 文章機器人部分,描述如何運行機器人從機程序,使機器人根據上位機節點發送的命令,執行具體運動。 ABB機器人執行3個任務。這些任務都配置為SEMISTATIC(背景程序)的任務,第三任務是正常動作任務。下文描述如…

CRM項目總結

CRM項目總結 一:開發背景 在公司日益擴大的過程中,不可避免的會伴隨著更多問題出現。 對外 : 如何更好的管理客戶與公司的關系?如何更及時的了解客戶日益發展的需求變化?公司的產品是否真的符合客戶需求?以…

【面經——《速騰聚創科技有限公司——深度學習算法工程師》】

自我介紹 實習項目 1)項目主要應用的領域? 2)難點在哪?——機械臂吸盤大小和目標大小之間坐標的協調 3)難點不在于算法,在于數據的處理和均衡性?對于數據均衡方面有什么理解&#xf…

js變量和數據類型

轉載于:https://www.cnblogs.com/songyinan/p/6181421.html