<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux文件系統(tǒng)基礎(chǔ)知識補(bǔ)充

          共 3397字,需瀏覽 7分鐘

           ·

          2024-03-19 19:30

          81a1fe0fc7d7972c02df0890d5bd7f3e.webp

          linux文件管理簡介

          一個文件系統(tǒng)的功能是什么?

          1、 創(chuàng)建、刪除、打開、讀取、寫入等文件操作

          2、 文件要以一定的方式進(jìn)行組織管理,比如目錄結(jié)構(gòu)等形式

          文件系統(tǒng)的底層依托 是 可以存儲東西的存儲器,比如內(nèi)存、硬盤等存儲器。

          常見的文件系統(tǒng)

          • 1、ext3 硬盤文件系統(tǒng)
          • 2、ext4 硬盤文件系統(tǒng)
          • 3、tmpfs 內(nèi)存文件系統(tǒng)

          ext3和ext4

          block

          硬盤被分為若干個block,一個block的大小為 4KB。

          通過block位圖來標(biāo)記一個block是否空閑,也就是一個block ,4K, 有4 * 1024 * 8 個bit ,可以表示 128M 的空間。

          每次分配的時候,從位圖中找到一個 位圖中為0的對應(yīng)的block,并將其位圖中的bit置為1

          每次回收的時候,將位圖中對應(yīng)的bit置為0,

          inode

          一個文件和文件夾都是對應(yīng)著一個inode。

          每個Inode都有一個唯一的ID。

          inode中記錄了文件對應(yīng)的詳細(xì)信息,比如id,更改時間、所屬用戶、所屬組等信息,以及對應(yīng)的存儲的block信息。

          文件的具體內(nèi)容和屬性是分開存放的,屬性存放在inode中,具體的內(nèi)容可以通過inode中的指針進(jìn)行讀取。

          inode中通過inode位圖來標(biāo)識一個inode是否空閑。

          位圖存在一個block中,也就是說一個block可以記錄410248個inode的狀態(tài)

          塊組

          block位圖 + inode位圖 + 對應(yīng)的inode列表 + 對應(yīng)的block 稱為 一個 塊組

          塊組描述符表

          一個硬盤可以分為 多個 塊組,通過塊組描述符表來記錄對應(yīng)的塊組信息。

          讀取 一個塊組描述符 可以快速得出對應(yīng)的塊組的inode和block的信息,比如空閑block的個數(shù)、空閑inode的個數(shù)。block位圖的地址范圍、inode位圖地址的范圍等信息。

          超級塊

          超級塊中記錄了整個文件系統(tǒng)中的信息,比如block的大小,inode的大小,文件系統(tǒng)中可用的inode個數(shù)、文件系統(tǒng)中可用的block的個數(shù)。塊組描述符列表的地址范圍。

          文件系統(tǒng)結(jié)構(gòu)圖

          603aa56ac0a2562d99e81d61f25b99f8.webp

          ext3和ext4中文件具體信息存放的方式不一樣。

          ext3架構(gòu)圖


          76e39f70aad3319f667ecef0647056e6.webp

          ext3中,每個innode對應(yīng)著block數(shù)組,前12個為直接映射,后3個為間接映射。

          ext4的架構(gòu)圖

          3d57c3c3c0bef33795f4ac3c38ea589c.webp

          ext3有一個缺點(diǎn):當(dāng)組織大文件的時候,每個block都用一個記錄項(xiàng)來記錄,會導(dǎo)致索引項(xiàng)增多,索引項(xiàng)會額外浪費(fèi)空間,而且會降低大文件的讀取效率。

          ext4通過一個多叉樹來組織大文件,分為葉子節(jié)點(diǎn)和非葉子節(jié)點(diǎn),非葉子節(jié)點(diǎn)用來記錄索引信息,而葉子節(jié)點(diǎn)用來記錄實(shí)際的block信息,不會挨個記錄,而是通過start 和 end 開始和結(jié)束地址來記錄若干個block,提高大文件的讀取效率。

          目錄

          一個操作系統(tǒng)中存在很多個文件,怎么有效的管理文件呢?

          Linux采用的樹狀結(jié)構(gòu),也就是目錄結(jié)構(gòu),通過目錄來管理文件

          9a450cb7c13148e45be9cd54939ced9a.webp

          這里面有一個非常關(guān)鍵的問題,目錄怎么存儲。

          在Linux中,目錄也被當(dāng)作一個文件,也有對應(yīng)的inode,只不過目錄文件中存儲的是目錄下的文件和目錄信息

          7a70c2d883c17cb86be585050a72ab2a.webp

          為了快速的在目錄文件中檢索對應(yīng)的文件或者目錄,引入了 哈希索引,通過對文件或者目錄名字來進(jìn)行哈希,每個哈希值對應(yīng)的有一個塊號,對應(yīng)的塊中存儲的有對應(yīng)的文件信息和目錄信息。

          通過對文件名字進(jìn)行哈希值可以快速找到對應(yīng)的塊號。

          硬鏈接和軟鏈接

          a69d762b4ce3c3003789d416683fe2ce.webp

          • 硬鏈接:新建文件和原始文件共用一個Inode節(jié)點(diǎn),當(dāng)所有文件都刪除的時候,才會徹底刪除對應(yīng)的文件。不可以跨文件系統(tǒng)建立鏈接。

          • 軟鏈接:文件新建一個Inode節(jié)點(diǎn),文件中存儲的是對應(yīng)的鏈接,指向原始文件。可以跨文件系統(tǒng)建立鏈接。

          虛擬文件系統(tǒng) VFS

          Linux中一切皆文件,無論是塊設(shè)備、共享內(nèi)存、socket、字符設(shè)備、進(jìn)程信息都可以通過操作文件的的統(tǒng)一接口來訪問對應(yīng)的資源,比如open()、read()、write()。這就依靠于Linux的虛擬文件系統(tǒng) VFS

          掛載 mount

          塊設(shè)備、內(nèi)存、字符設(shè)備等要想被使用,都要有一定的文件系統(tǒng),然后將其掛載到Linux中的目錄中。

          這個目錄可以是根目錄,也可以是其他文件系統(tǒng)下的目錄。

          14ca851f170521e2b31dc87311707ae1.webp

          這些掛載信息被保存在根分區(qū)中,在Linux初始化的時候被取出,加載到內(nèi)存中。

          根分區(qū)是用來引導(dǎo)Linux加載的,是必須的,根分區(qū)會掛載到根目錄 /。

          掛載信息中記錄了對應(yīng)的文件系統(tǒng)的超級塊信息、以及對應(yīng)的掛載目錄信息。

          內(nèi)存中會維護(hù)一個目錄樹,最一開始之后只有根目錄,通過掛載信息中的文件系統(tǒng)超級塊信息和掛載目錄信息,就可以逐漸的擴(kuò)展目錄樹。

          訪問文件

          Linux需要通過 一個文件路徑 來 訪問對應(yīng)的文件。

          • 1、首先要open(),也就是打開文件。

          首先獲取根目錄對應(yīng)的inode,然后通過根目錄的inode獲取對應(yīng)的目錄信息和文件信息, 通過遍歷根目錄中的目錄來找到二級目錄對應(yīng)的inode,就這樣不斷的向下尋找就可以找到對應(yīng)的文件的inode了。

          • 2、內(nèi)核會維護(hù)一個file struct列表,file中會加入文件對應(yīng)的inode節(jié)點(diǎn),并且為inode加入對應(yīng)的塊設(shè)備編號和驅(qū)動程序。

          • 3、內(nèi)核會返回一個fd給用戶進(jìn)程,fd就是文件描述符。用戶進(jìn)程會維護(hù)一個文件描述符表,fd會對應(yīng)一個指向內(nèi)核中file的指針,在之后的訪問文件就可以直接通過fd來找到對應(yīng)的file了。

          FD就是進(jìn)程的文件描述符表的對應(yīng)的文件記錄的索引下標(biāo),是一個非負(fù)的整數(shù)

          06fce72df1a9dfb02a3eb04f189f54b3.webp

          通過inode中的設(shè)備編號和對應(yīng)的驅(qū)動程序,就可以通過驅(qū)動程序+inode的文件信息,就可以對文件進(jìn)行操作了。

          這樣就實(shí)現(xiàn)了VFS的功能了,虛擬文件管理。進(jìn)程只需要通過open()、read()和fd就可以操作對應(yīng)的文件了。

          值得注意的是,當(dāng)讀取文件的時候,有以下兩個步驟:

          • 1、將數(shù)據(jù)從 磁盤 拷貝到 內(nèi)核空間中
          • 2、將數(shù)據(jù) 從內(nèi)核空間 拷貝到 用戶空間中。

          文件緩存

          內(nèi)存和磁盤都是分頁來進(jìn)行管理的,也就是4K,寫入磁盤或者讀取文件的時候,也是按照 來讀取。

          為了減少訪問磁盤的次數(shù),Linux在內(nèi)核空間開啟了一片內(nèi)存作為緩存,然后將讀取的文件按照page放入到緩存中,當(dāng)再次需要該文件對應(yīng)的page的時候,會先查看緩存中是否存在對應(yīng)的page,如果存在,直接從緩存拷貝到用戶態(tài)。如果不存在,才會訪問磁盤。

          當(dāng)寫對應(yīng)的page的時候,先將其寫入到緩存中,等待系統(tǒng)或者用戶調(diào)用sync(),才將文件寫入到磁盤上。當(dāng)文件寫入到緩存中后,對應(yīng)的緩存就為臟頁了,在內(nèi)存緊張的時候,或者刷盤的時候,會將其寫入到磁盤中。

          緩存中的page是通過inode和對應(yīng)的偏移offset來唯一標(biāo)識的


          來源:https://blog.csdn.net/qq_40276626/article/details/120478538

                                        ????????????????  END  ????????????????

          推薦閱讀

          【1】jetson nano開發(fā)使用的基礎(chǔ)詳細(xì)分享

          【2】Linux開發(fā)coredump文件分析實(shí)戰(zhàn)分享

          【3】CPU中的程序是怎么運(yùn)行起來的 必讀

          【4】cartographer環(huán)境建立以及建圖測試

          【5】設(shè)計模式之簡單工廠模式、工廠模式、抽象工廠模式的對比

          本公眾號全部原創(chuàng)干貨已整理成一個目錄,回復(fù)[ 資源 ]即可獲得。


          瀏覽 96
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  搞搞网站 | 欧美日比视频在线观看 | 乱伦视频图片 | 国产精品一卡 | 伊人久久久久亚洲AV无码裤子 |