三年中国片在线高清观看,三年在线观看免费完整版中文,三年在线观看免费大全哔哩哔哩,三年在线观看免费大全,三年影视大全免费观看,三年片中国在线观看免费大全

資訊

精準(zhǔn)傳達(dá) ? 有效溝通

從品牌網(wǎng)站建設(shè)到網(wǎng)絡(luò)營(yíng)銷策劃,從策略到執(zhí)行的一站式服務(wù)

不知道Linux文件系統(tǒng)是怎么工作的?詳解來(lái)了

來(lái)源:公司資訊 | 2021.08.19

和 CPU、內(nèi)存相同,磁盤(pán)和文件體系的辦理,也是操作體系最核心的功能。

磁盤(pán)為體系供給了最基本的持久化存儲(chǔ)。
文件體系則在磁盤(pán)的基礎(chǔ)上,供給了一個(gè)用來(lái)辦理文件的樹(shù)狀結(jié)構(gòu)。
那么,磁盤(pán)和文件體系是怎么作業(yè)的呢?又有哪些目標(biāo)能夠衡量它們的功能呢?

索引節(jié)點(diǎn)和目錄項(xiàng)
文件體系,本身是對(duì)存儲(chǔ)設(shè)備上的文件,進(jìn)行安排辦理的機(jī)制。安排方法不同,就會(huì)構(gòu)成不同的文件體系。

咱們要記住最重要的一點(diǎn),在 Linux 中一切皆文件。不只普通的文件和目錄,就連塊設(shè)備、 套接字、管道等,也都要經(jīng)過(guò)一致的文件體系來(lái)辦理。

為了方便辦理,Linux 文件體系為每個(gè)文件都分配兩個(gè)數(shù)據(jù)結(jié)構(gòu),索引節(jié)點(diǎn)(index node)和目錄項(xiàng)(directory entry)。它們首要用來(lái)記載文件的元信息和目錄結(jié)構(gòu)。

索引節(jié)點(diǎn),簡(jiǎn)稱為 inode,用來(lái)記載文件的元數(shù)據(jù),比方 inode 編號(hào)、文件巨細(xì)、拜訪 權(quán)限、修正日期、數(shù)據(jù)的位置等。索引節(jié)點(diǎn)和文件一一對(duì)應(yīng),它跟文件內(nèi)容相同,都會(huì) 被持久化存儲(chǔ)到磁盤(pán)中。所以記住,索引節(jié)點(diǎn)同樣占用磁盤(pán)空間。
目錄項(xiàng),簡(jiǎn)稱為 dentry,用來(lái)記載文件的名字、索引節(jié)點(diǎn)指針以及與其他目錄項(xiàng)的相關(guān) 聯(lián)系。多個(gè)相關(guān)的目錄項(xiàng),就構(gòu)成了文件體系的目錄結(jié)構(gòu)。不過(guò),不同于索引節(jié)點(diǎn),目錄項(xiàng)是由內(nèi)核保護(hù)的一個(gè)內(nèi)存數(shù)據(jù)結(jié)構(gòu),所以一般也被叫做目錄項(xiàng)緩存。
換句話說(shuō),索引節(jié)點(diǎn)是每個(gè)文件的唯一標(biāo)志,而目錄項(xiàng)保護(hù)的正是文件體系的樹(shù)狀結(jié)構(gòu)。目錄項(xiàng)和索引節(jié)點(diǎn)的聯(lián)系是多對(duì)一,你能夠簡(jiǎn)單了解為,一個(gè)文件能夠有多個(gè)別號(hào)。

舉個(gè)比方,經(jīng)過(guò)硬鏈接為文件創(chuàng)建的別號(hào),就會(huì)對(duì)應(yīng)不同的目錄項(xiàng),不過(guò)這些目錄項(xiàng)本質(zhì)上仍是鏈接同一個(gè)文件,所以,它們的索引節(jié)點(diǎn)相同。

索引節(jié)點(diǎn)和目錄項(xiàng)紀(jì)錄了文件的元數(shù)據(jù),以及文件間的目錄聯(lián)系,那么具體來(lái)說(shuō),文件數(shù)據(jù)到底是怎么存儲(chǔ)的呢?是不是直接寫(xiě)到磁盤(pán)中就好了呢?

實(shí)際上,磁盤(pán)讀寫(xiě)的最小單位是扇區(qū),然而扇區(qū)只要 512B 巨細(xì),假如每次都讀寫(xiě)這么小的單位,功率必定很低。所以,文件體系又把接連的扇區(qū)組成了邏輯塊,然后每次都以邏 輯塊為最小單元,來(lái)辦理數(shù)據(jù)。常見(jiàn)的邏輯塊巨細(xì)為 4KB,也便是由接連的 8 個(gè)扇區(qū)組成。

為了協(xié)助咱們了解目錄項(xiàng)、索引節(jié)點(diǎn)以及文件數(shù)據(jù)的聯(lián)系,畫(huà)了一張示意圖。咱們能夠?qū)φ罩@張圖,來(lái)回憶剛剛講過(guò)的內(nèi)容,把知識(shí)和細(xì)節(jié)串聯(lián)起來(lái)。



不過(guò),這里有兩點(diǎn)需要咱們注意:

榜首,目錄項(xiàng)本身便是一個(gè)內(nèi)存緩存,而索引節(jié)點(diǎn)則是存儲(chǔ)在磁盤(pán)中的數(shù)據(jù)。在前面的 Buffer 和 Cache 原理中,我從前提到過(guò),為了協(xié)調(diào)慢速磁盤(pán)與快速 CPU 的功能差異,文 件內(nèi)容會(huì)緩存到頁(yè)緩存 Cache 中。那么,咱們也應(yīng)該想到,這些索引節(jié)點(diǎn)天然也會(huì)緩存到內(nèi)存中,加快文件的拜訪。

第二,磁盤(pán)在履行文件體系格式化時(shí),會(huì)被分紅三個(gè)存儲(chǔ)區(qū)域,超級(jí)塊、索引節(jié)點(diǎn)區(qū)和數(shù)

據(jù)塊區(qū)。其間,

超級(jí)塊,存儲(chǔ)整個(gè)文件體系的狀態(tài)。

索引節(jié)點(diǎn)區(qū),用來(lái)存儲(chǔ)索引節(jié)點(diǎn)。

數(shù)據(jù)塊區(qū),則用來(lái)存儲(chǔ)文件數(shù)據(jù)。

虛擬文件體系
目錄項(xiàng)、索引節(jié)點(diǎn)、邏輯塊以及超級(jí)塊,構(gòu)成了 Linux 文件體系的四大基本要素。不過(guò), 為了支撐各種不同的文件體系,Linux 內(nèi)核在用戶進(jìn)程和文件體系的中心,又引入了一個(gè)籠統(tǒng)層,也便是虛擬文件體系 VFS(Virtual File System)。

VFS 定義了一組一切文件體系都支撐的數(shù)據(jù)結(jié)構(gòu)和規(guī)范接口。這樣,用戶進(jìn)程和內(nèi)核中的其他子體系,只需要跟 VFS 供給的一致接口進(jìn)行交互就能夠了,而不需要再關(guān)心底層各種文件體系的完結(jié)細(xì)節(jié)。

這里,下圖是 Linux 文件體系的架構(gòu)圖,幫咱們更好地了解體系調(diào)用、VFS、緩存、文 件體系以及塊存儲(chǔ)之間的聯(lián)系。



經(jīng)過(guò)這張圖,能夠看到,在 VFS 的下方,Linux 支撐各種各樣的文件體系,如 Ext4、 XFS、NFS 等等。依照存儲(chǔ)位置的不同,這些文件體系能夠分為三類。

榜首類是依據(jù)磁盤(pán)的文件體系,也便是把數(shù)據(jù)直接存儲(chǔ)在計(jì)算機(jī)本地掛載的磁盤(pán)中。常見(jiàn)的 Ext4、XFS、OverlayFS 等,都是這類文件體系。

第二類是依據(jù)內(nèi)存的文件體系,也便是咱們常說(shuō)的虛擬文件體系。這類文件體系,不需要任何磁盤(pán)分配存儲(chǔ)空間,但會(huì)占用內(nèi)存。咱們經(jīng)常用到的 /proc 文件體系,其實(shí)便是 一種最常見(jiàn)的虛擬文件體系。此外,/sys 文件體系也歸于這一類,首要向用戶空間導(dǎo)出層次化的內(nèi)核目標(biāo)。

第三類是網(wǎng)絡(luò)文件體系,也便是用來(lái)拜訪其他計(jì)算機(jī)數(shù)據(jù)的文件體系,比方 NFS、 SMB、iSCSI 等。

這些文件體系,要先掛載到 VFS 目錄樹(shù)中的某個(gè)子目錄(稱為掛載點(diǎn)),然后才干拜訪其間的文件。拿榜首類,也便是依據(jù)磁盤(pán)的文件體系為例,在裝置體系時(shí),要先掛載一個(gè)根 目錄(/),在根目錄下再把其他文件體系(比方其他的磁盤(pán)分區(qū)、/proc 文件體系、/sys 文件體系、NFS 等)掛載進(jìn)來(lái)。

文件體系 I/O
把文件體系掛載到掛載點(diǎn)后,你就能經(jīng)過(guò)掛載點(diǎn),再去拜訪它辦理的文件了。VFS 供給了一組規(guī)范的文件拜訪接口。這些接口以體系調(diào)用的方法,供給給應(yīng)用程序運(yùn)用。

就拿 cat 命令來(lái)說(shuō),它首要調(diào)用 open() ,打開(kāi)一個(gè)文件;然后調(diào)用 read() ,讀取文件的內(nèi)容;最終再調(diào)用 write() ,把文件內(nèi)容輸出到控制臺(tái)的規(guī)范輸出中:

int open(const char *pathname, int flags, mode_t mode); 
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);
文件讀寫(xiě)方法的各種差異,導(dǎo)致 I/O 的分類多種多樣。最常見(jiàn)的有,緩沖與非緩沖 I/O、 直接與非直接 I/O、堵塞與非堵塞 I/O、同步與異步 I/O 等。 接下來(lái),咱們就詳細(xì)看這四種分類。

榜首種,依據(jù)是否使用規(guī)范庫(kù)緩存,能夠把文件 I/O 分為緩沖 I/O 與非緩沖 I/O。

緩沖 I/O,是指使用規(guī)范庫(kù)緩存來(lái)加快文件的拜訪,而規(guī)范庫(kù)內(nèi)部再經(jīng)過(guò)體系調(diào)度拜訪文件。

非緩沖 I/O,是指直接經(jīng)過(guò)體系調(diào)用來(lái)拜訪文件,不再經(jīng)過(guò)規(guī)范庫(kù)緩存。

注意,這里所說(shuō)的“緩沖”,是目規(guī)范庫(kù)內(nèi)部完結(jié)的緩存。比方說(shuō),你可能見(jiàn)到過(guò),很多程序遇到換行時(shí)才真實(shí)輸出,而換行前的內(nèi)容,其實(shí)便是被規(guī)范庫(kù)暫時(shí)緩存了起來(lái)。

無(wú)論緩沖 I/O 還對(duì)錯(cuò)緩沖 I/O,它們最終仍是要經(jīng)過(guò)體系調(diào)用來(lái)拜訪文件。咱們知道,體系調(diào)用后,還會(huì)經(jīng)過(guò)頁(yè)緩存,來(lái)削減磁盤(pán)的 I/O 操作。

第二,依據(jù)是否使用操作體系的頁(yè)緩存,能夠把文件 I/O 分為直接 I/O 與非直接 I/O。

直接 I/O,是指越過(guò)操作體系的頁(yè)緩存,直接跟文件體系交互來(lái)拜訪文件。

非直接 I/O 正好相反,文件讀寫(xiě)時(shí),先要經(jīng)過(guò)體系的頁(yè)緩存,然后再由內(nèi)核或額外的體系調(diào)用,真實(shí)寫(xiě)入磁盤(pán)。

想要完結(jié)直接 I/O,需要你在體系調(diào)用中,指定 O_DIRECT 標(biāo)志。假如沒(méi)有設(shè)置過(guò),默許 的對(duì)錯(cuò)直接 I/O。

不過(guò)要注意,直接 I/O、非直接 I/O,本質(zhì)上仍是和文件體系交互。假如是在數(shù)據(jù)庫(kù)等場(chǎng)景中,還會(huì)看到,越過(guò)文件體系讀寫(xiě)磁盤(pán)的狀況,也便是咱們一般所說(shuō)的裸 I/O。

第三,依據(jù)應(yīng)用程序是否堵塞本身運(yùn)轉(zhuǎn),能夠把文件 I/O 分為堵塞 I/O 和非堵塞 I/O

所謂堵塞 I/O,是指應(yīng)用程序履行 I/O 操作后,假如沒(méi)有取得呼應(yīng),就會(huì)堵塞當(dāng)前線程,天然就不能履行其他任務(wù)。

所謂非堵塞 I/O,是指應(yīng)用程序履行 I/O 操作后,不會(huì)堵塞當(dāng)前的線程,能夠持續(xù)履行其他的任務(wù),隨后再經(jīng)過(guò)輪詢或許事情告知的方法,獲取調(diào)用的結(jié)果。

比方說(shuō),拜訪管道或許網(wǎng)絡(luò)套接字時(shí),設(shè)置 O_NONBLOCK 標(biāo)志,就表明用非堵塞方法拜訪;而假如不做任何設(shè)置,默許的便是堵塞拜訪。

第四,依據(jù)是否等待呼應(yīng)結(jié)果,能夠把文件 I/O 分為同步和異步 I/O

所謂同步 I/O,是指應(yīng)用程序履行 I/O 操作后,要一向比及整個(gè) I/O 完結(jié)后,才干取得 I/O 呼應(yīng)。

所謂異步 I/O,是指應(yīng)用程序履行 I/O 操作后,不必等待完結(jié)和完結(jié)后的呼應(yīng),而是持續(xù)履行就能夠。比及這次 I/O 完結(jié)后,呼應(yīng)會(huì)用事情告知的方法,告知應(yīng)用程序。

例如,在操作文件時(shí),假如設(shè)置了 O_SYNC 或許 O_DSYNC 標(biāo)志,就代表同步 I/O。假如設(shè)置了 O_DSYNC,就要等文件數(shù)據(jù)寫(xiě)入磁盤(pán)后,才干返回;而 O_SYNC,則是在 O_DSYNC 基礎(chǔ)上,要求文件元數(shù)據(jù)也要寫(xiě)入磁盤(pán)后,才干返回。

再比方,在拜訪管道或許網(wǎng)絡(luò)套接字時(shí),設(shè)置了 O_ASYNC 選項(xiàng)后,相應(yīng)的 I/O 便是異步I/O。這樣,內(nèi)核會(huì)再經(jīng)過(guò) SIGIO 或許 SIGPOLL,來(lái)告知進(jìn)程文件是否可讀寫(xiě)。

咱們可能發(fā)現(xiàn)了,這里的很多概念也經(jīng)常出現(xiàn)在網(wǎng)絡(luò)編程中。比方非堵塞 I/O,一般會(huì)跟 select/poll 配合,用在網(wǎng)絡(luò)套接字的 I/O 中。

這下咱們也應(yīng)該能夠了解,“Linux 一切皆文件”的深刻含義。無(wú)論是普通文件和塊設(shè)備、仍是網(wǎng)絡(luò)套接字和管道等,它們都經(jīng)過(guò)一致的 VFS 接口來(lái)拜訪。

—— 靈通云微信公眾號(hào) ——

熱門(mén)標(biāo)簽

上一條———————

下一條———————

十七年 建站經(jīng)驗(yàn)

多一份參考,總有益處

聯(lián)系靈通云,免費(fèi)獲得專屬《策劃方案》及報(bào)價(jià)

咨詢相關(guān)問(wèn)題或預(yù)約面談,可以通過(guò)以下方式與我們聯(lián)系

業(yè)務(wù)熱線:400-688-6062 / 大客戶專線   南通:15818561755

海丰县| 宣威市| 丁青县| 安顺市| 江油市| 龙井市| 渑池县| 青川县| 夏津县| 靖江市| 孟津县| 汶上县| 邳州市| 五原县| 鸡西市| 微山县| 察雅县| 平顺县| 高要市| 云霄县| 蓬溪县| 岗巴县| 黔西| 武邑县| 晋宁县| 汤原县| 龙州县| 江陵县| 东安县| 二连浩特市| 岳阳市| 德昌县| 安阳县| 河曲县| 河津市| 石林| 平罗县| 许昌县| 富顺县| 伊通| 临江市|