偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

想弄清楚Linux文件系統(tǒng)的運行機制嗎?

系統(tǒng) Linux
在Linux里一切皆文件,不僅普通的文件和目錄,就連塊設備、套接字、管道等,也都要通過統(tǒng)一的文件系統(tǒng)來管理。今天我們就一起來聊一聊:磁盤和文件系統(tǒng)是怎么工作的?

Linux文件系統(tǒng)作為操作系統(tǒng)的核心組成部分,其運行機制也是我們程序員需要了解和掌握的,磁盤為系統(tǒng)提供了最基本的持久化存儲,文件系統(tǒng)則在磁盤的基礎(chǔ)上提供系統(tǒng)里所有文件的管理,在Linux里一切皆文件,不僅普通的文件和目錄,就連塊設備、套接字、管道等,也都要通過統(tǒng)一的文件系統(tǒng)來管理。今天我們就一起來聊一聊:磁盤和文件系統(tǒng)是怎么工作的?

索引節(jié)點和目錄項

在Linux文件系統(tǒng)中,一個文件的元數(shù)據(jù)包括:目錄項、索引節(jié)點、數(shù)據(jù)塊。

  • 目錄項:簡稱為dentry,用來記錄文件的名字、索引節(jié)點指針以及與其他目錄項的關(guān)聯(lián)關(guān)系。多個關(guān)聯(lián)的目錄項,就構(gòu)成了文件系統(tǒng)的目錄結(jié)構(gòu)。目錄項是由內(nèi)核維護的一個內(nèi)存數(shù)據(jù)結(jié)構(gòu),所以通常也被叫做目錄項緩存(Cache)。
  • 索引節(jié)點簡稱為inode,用來記錄文件的元數(shù)據(jù),包括inode 編號、文件大小、訪問權(quán)限、修改日期、數(shù)據(jù)的位置、鏈接數(shù)等,索引節(jié)點信息會持久化到磁盤中存儲,占用磁盤空間。
  • 數(shù)據(jù)塊: 簡稱為block,存儲文件數(shù)據(jù)的地方。磁盤的最小存儲單位叫做扇區(qū)(Sector),每個扇區(qū)存儲512字節(jié),相當于0.5KB,操作系統(tǒng)讀取硬盤的時候,不會一個扇區(qū)一個扇區(qū)地讀取,這樣效率太低,而是一次性連續(xù)讀取多個扇區(qū),即一次性讀取一個"塊"(block)。這種由多個扇區(qū)組成的"塊",是文件存取的最小單位。"塊"的大小,最常見的是4KB(八個sector)。

引節(jié)點是存儲在硬盤上的數(shù)據(jù),那么為了加速文件的訪問,通常會把索引節(jié)點加載到內(nèi)存中。另外,磁盤進行格式化的時候,會被分成三個存儲區(qū)域,分別是超級塊、索引節(jié)點區(qū)和數(shù)據(jù)塊區(qū)。

  • 超級塊,用來存儲文件系統(tǒng)的詳細信息,比如塊個數(shù)、塊大小、空閑塊等等。
  • 索引節(jié)點區(qū),用來存儲索引節(jié)點。
  • 數(shù)據(jù)塊區(qū),用來存儲文件或目錄數(shù)據(jù)。

虛擬文件系統(tǒng)

Linux系統(tǒng)中的虛擬文件系統(tǒng)(VFS,Virtual File System)是一個抽象層,用于提供統(tǒng)一的文件系統(tǒng)接口,使得用戶和應用程序能夠以相同的方式訪問不同類型的文件系統(tǒng),而無需關(guān)心底層文件系統(tǒng)的具體實現(xiàn)。

用戶程序和 glibc 庫都是屬于用戶空間的,本質(zhì)都是用戶程序。應用層的程序和glibc通過調(diào)用“系統(tǒng)調(diào)用層(SCI)”的函數(shù),完成對文件的操作。這些函數(shù)是 Linux 內(nèi)核對外提供的函數(shù)接口,用戶通過這些函數(shù)向系統(tǒng)申請操作。比如系統(tǒng)cat命令,它首先調(diào)用open()函數(shù) ,打開一個文件;然后調(diào)用read() 函數(shù),讀取文件的內(nèi)容;最后再調(diào)用 write()函數(shù) ,把文件內(nèi)容輸出到控制臺的標準輸出中。常見的文件系統(tǒng)類型又可以分為以下幾大類:

  • 基于本地磁盤:EXT3、EXT4、XFS、OverlayFS 等。這類文件系統(tǒng)的特點是數(shù)據(jù)直接存儲在計算機本地掛載的磁盤中,性能好,沒有網(wǎng)絡IO的訪問消耗。
  • 基于網(wǎng)絡文件系統(tǒng)NFS、CIFS/SMB、CephFS、GlusterFS等,這類文件的特點是它們允許用戶通過網(wǎng)絡訪問和管理文件。分布式、跨平臺、靈活性和可擴縮性是它們的最大優(yōu)勢。
  • 基于內(nèi)存文件系統(tǒng):tmpfs、ramfs、/proc等,這些基于內(nèi)存的文件系統(tǒng)通常用于特定的用途,如臨時文件存儲、緩存、快速數(shù)據(jù)訪問等。它們提供了在內(nèi)存中進行文件讀寫操作的高性能解決方案,但也需要注意內(nèi)存限制和數(shù)據(jù)易失性的特點。

文件 I/O

我們對磁盤進行的分區(qū)、格式化這些操作就是建立不同類型的文件系統(tǒng),這些文件系統(tǒng)需要通過mount的方式掛載到Linux的VFS上的某個目錄才能被系統(tǒng)使用,應用程序?qū)ξ募淖x寫有不同的方式,也就是我們常說的I/O類型,以下是我們常見的I/O類型。

緩沖與非緩沖I/O

  • 所謂不帶緩沖,并不是指內(nèi)核不提供緩沖,而是只單純的系統(tǒng)調(diào)用,不是函數(shù)庫的調(diào)用。系統(tǒng)內(nèi)核對磁盤的讀寫都會提供一個塊緩沖,當用write函數(shù)對其寫數(shù)據(jù)時,直接調(diào)用系統(tǒng)調(diào)用,將數(shù)據(jù)寫入到塊緩沖進行排隊,當塊緩沖達到一定的量時,才會把數(shù)據(jù)寫入磁盤。因此所謂的不帶緩沖的I/O是指進程不提供緩沖功能。每調(diào)用一次write或read函數(shù),直接系統(tǒng)調(diào)用。(內(nèi)核提供緩沖的)。
  • 而帶緩沖的I/O是指進程對輸入輸出流進行了改進,提供了一個流緩沖。當用write函數(shù)寫數(shù)據(jù)時,先把數(shù)據(jù)寫入流緩沖區(qū)中,當達到一定條件,比如流緩沖區(qū)滿了,這時候才會把數(shù)據(jù)一次送往內(nèi)核提供的塊緩沖,再經(jīng)塊緩沖寫入磁盤。(雙重緩沖)
  • 因此,帶緩沖的I/O在往磁盤寫入相同的數(shù)據(jù)量時,會比不帶緩沖的I/O調(diào)用系統(tǒng)調(diào)用的次數(shù)要少。

直接 I/O與非直接I/O

  • 直接I/O就是應用程序直接訪問磁盤數(shù)據(jù),而不經(jīng)過內(nèi)核緩沖區(qū),這樣做的目的是減少一次從內(nèi)核緩沖區(qū)到用戶程序緩存的數(shù)據(jù)復制。
  • 非直接I/O:就是文件讀寫時,先要經(jīng)過系統(tǒng)的頁緩存,然后再由內(nèi)核或額外的系統(tǒng)調(diào)用后寫入磁盤。
  • 對于直接I/O,如果訪問的數(shù)據(jù)不在應用程序緩存中,那么每次數(shù)據(jù)都會直接從磁盤加載,這種直接加載的效率會比較慢。但是類型于數(shù)據(jù)庫管理系統(tǒng)這類應用,它們更傾向于選擇它們自己的緩存機制,因為數(shù)據(jù)庫管理系統(tǒng)往往比操作系統(tǒng)更了解數(shù)據(jù)庫中存放的數(shù)據(jù),使用直接I/O更合適。

阻塞I/O和非阻塞I/O

  • 阻塞I/O:應用進程調(diào)用I/O操作時阻塞,只有等待要操作的數(shù)據(jù)準備好,并復制到應用進程的緩沖區(qū)中才返回。特點是:實現(xiàn)難度低、開發(fā)應用較容易,適用并發(fā)量小的網(wǎng)絡應用開發(fā)。
  • 非阻塞I/O:是指應用程序執(zhí)行 I/O 操作后,不會阻塞當前的線程,可以繼續(xù)執(zhí)行其他的任務,隨后再通過輪詢或者事件通知的形式,獲取調(diào)用的結(jié)果。特點是:相對來說復雜一些。適用并發(fā)量較小、且不需要及時響應的網(wǎng)絡應用開發(fā)

同步和異步 I/O

  • 同步I/O:是指應用程序執(zhí)行 I/O 操作后,要一直等到整個 I/O 完成后,才能獲得 I/O 響應。
  • 異步I/O:是指應用程序執(zhí)行 I/O 操作后,不用等待完成和完成后的響應,而是繼續(xù)執(zhí)行就可以。等到這次 I/O 完成后,響應會用事件通知的方式,告訴應用程序。

關(guān)于文件的一些常見小知識

磁盤剩余空間還很多,新建文件和目錄報空間不足。

  • 排查思路:大概率是小文件太多,inode用完了,可以使用df -i。

du和df統(tǒng)計的硬盤使用情況不一致問題。

  • du是統(tǒng)計被文件系統(tǒng)記錄到的每個文件的大小,然后進行累加得到的總大小,是通過文件系統(tǒng)獲取到的。而df主要是從超級塊(superblock)中讀入硬盤使用信息,df獲取到的是磁盤塊被使用的情況。產(chǎn)生這種情況大概率是有文件被刪除了,但是有別的進程正在使用它(占有句柄),可以通過lsof | grep deleted查到。當進程停止或者被kill時,這些空間將被釋放。

我們查詢磁盤容量的時候,Used+Avail的大小為啥總是小于總?cè)萘浚⊿Ize)。

  • 為了預防緊急情況,linux ext文件系統(tǒng)會預留部分硬盤空間,具體預留的數(shù)值可以通過tune2fs -l [dev_name] | grep “Reserved block count”查看到,(dev_name)是設備名,這里預留的空間會被df計算到已用空間中,從而導致df和du統(tǒng)計不一致。如果需要調(diào)整預留空間大小, 我們可以使用tune2fs -m [size] [dev_name]來進行調(diào)整。
責任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2022-04-07 08:37:05

鏈表技巧單鏈表

2022-05-30 08:05:11

架構(gòu)

2012-05-28 10:06:05

項目開發(fā)項目管理開發(fā)

2017-03-31 15:30:09

2015-11-20 11:20:54

js開發(fā)

2021-05-09 22:26:36

Python函數(shù)變量

2022-03-11 07:59:09

容器代碼元素

2021-03-11 15:49:44

人工智能深度學習

2017-10-28 23:00:52

多云混合云云計算

2020-02-18 16:48:48

大腦CPU包裝

2018-10-25 09:26:07

VLANVXLAN網(wǎng)絡

2021-03-19 14:12:24

2020-08-28 07:49:19

Linux文件系統(tǒng)

2017-09-26 10:36:52

云端部署內(nèi)部

2023-01-09 08:38:22

大數(shù)據(jù)架構(gòu)師YARN

2019-08-15 10:17:16

Webpack運行瀏覽器

2019-05-10 14:00:21

小程序運行機制前端

2020-11-17 08:32:22

存儲器鏈接

2009-12-11 10:52:37

PHP運行機制

2009-02-03 14:00:20

PHP運行PHP調(diào)用PHP原理
點贊
收藏

51CTO技術(shù)棧公眾號