柚子快報(bào)激活碼778899分享:運(yùn)維 Linux:認(rèn)識(shí)文件系統(tǒng)
柚子快報(bào)激活碼778899分享:運(yùn)維 Linux:認(rèn)識(shí)文件系統(tǒng)
一、認(rèn)識(shí)硬件——磁盤
1.1 物理構(gòu)成
? ? ?磁盤是唯一的一個(gè)機(jī)械設(shè)備,也是一個(gè)外設(shè)!
? ? ?以前的老式電腦上裝的就是機(jī)械磁盤,現(xiàn)在由于用戶對(duì)使用計(jì)算機(jī)的速度要求越來(lái)越高,現(xiàn)在我們普通人使用的電腦基本上都是用的SSD固態(tài)硬盤,SSD固態(tài)硬盤并沒有像機(jī)械磁盤那樣的機(jī)械運(yùn)動(dòng),讀寫速度更快,且具有體積小、低功耗、耐用性好、無(wú)噪音等特點(diǎn)!且未來(lái)還有很大的研究空間!所以在桌面領(lǐng)域幾乎取代了機(jī)械磁盤!
? ? ?但是企業(yè)級(jí)存儲(chǔ)更傾向于使用機(jī)械硬盤,由于其成本低、容量大的特點(diǎn)更有利于進(jìn)行大規(guī)模的數(shù)據(jù)存儲(chǔ),所以他其實(shí)很難被淘汰!?
1、寫入磁盤工作原理:二進(jìn)制序列會(huì)通過(guò)磁頭的充放電(任何硬件都只認(rèn)識(shí)二進(jìn)制序列,因?yàn)楸举|(zhì)上是用線連接的),將數(shù)據(jù)寫到盤片上。
2、 一些特點(diǎn):
(1)我們的計(jì)算機(jī)內(nèi)部的信息流動(dòng)是以電子或者光電信號(hào)的形式傳遞(非??欤?,而磁盤是機(jī)械運(yùn)動(dòng)相比之下速度很慢??!
(2)盤片高速旋轉(zhuǎn),磁頭左右轉(zhuǎn)動(dòng),磁頭是一面一個(gè)且和盤面不接觸!
(3)磁盤在設(shè)計(jì)的時(shí)候必須保證無(wú)塵環(huán)境且密封完好,因?yàn)橛谢覊m的話可能會(huì)導(dǎo)致盤面刮花造成數(shù)據(jù)丟失。
(4)內(nèi)存是掉電易失存儲(chǔ)介質(zhì),盤片是永久性存儲(chǔ)介質(zhì)。
?3、注:磁盤是有壽命的,大公司磁盤快報(bào)廢的時(shí)候并不敢直接把磁盤給丟掉,因?yàn)槔锩娲鎯?chǔ)了大量的用戶數(shù)據(jù)(磁盤密封性好且不易被銷毀),所以相關(guān)的安全部門對(duì)大公司的磁盤銷毀工作時(shí)有嚴(yán)格的要求的!
1.2 存儲(chǔ)構(gòu)成
磁頭的左右擺動(dòng)——>定位磁道(柱面)?
磁頭不動(dòng)的時(shí)候,盤片的旋轉(zhuǎn)——>定位扇區(qū)??
所以磁盤被訪問(wèn)的最基本單位是扇區(qū) ——> 512字節(jié)/4KB
——>因此我們可以把磁盤看做由無(wú)數(shù)個(gè)扇區(qū)構(gòu)成的存儲(chǔ)介質(zhì) !
——>所以我們要把數(shù)據(jù)存到磁盤,首先就是定位一個(gè)扇區(qū):(1)先找到哪一面(定位磁頭)(2)哪一個(gè)磁道(3)哪一個(gè)扇區(qū)
1.3 邏輯抽象
? ? ? ? 我們把假設(shè)把磁帶攤開,從邏輯上我們就可以把他看做是線性的!我們就可以用一個(gè)數(shù)組把扇區(qū)組織起來(lái),每個(gè)下標(biāo)對(duì)應(yīng)著一個(gè)扇區(qū)(我們把邏輯扇區(qū)地址叫做LBA地址)!
問(wèn)題1:那么我們?nèi)绾瓮ㄟ^(guò)下標(biāo)找到我們要寫入的扇區(qū)呢??
問(wèn)題2: 為什么扇區(qū)大小不均勻的但是LBA地址是均勻??
——>因?yàn)榇诺朗菑闹虚g向外輻射的,所以里面的磁道有多少個(gè)扇區(qū),外面的磁道就有多少個(gè)扇區(qū),只不過(guò)里面磁道的扇區(qū)會(huì)小一點(diǎn)(扇區(qū)大小不均勻)? ?但其實(shí)可以通過(guò)調(diào)整密度來(lái)變得均勻(里面的01序列稠密一點(diǎn),外面的稀疏一點(diǎn))?
? ? ? ? 現(xiàn)在的磁盤其實(shí)也是可以做到讓外面扇區(qū)較大的多存點(diǎn)數(shù)據(jù),但是這樣的話相關(guān)的算法就得更改!!?
?1.4 回歸硬件
?所以我們究竟是如何和硬件交互的呢???
不僅CPU有寄存器,其他外設(shè)也有寄存器,包括磁盤??!
CPU向磁盤發(fā)送IO方向的請(qǐng)求時(shí)——>
1、控制寄存器(告訴磁盤是打算讀還是打算寫)?
2、數(shù)據(jù)寄存器(告訴磁盤要寫入哪些數(shù)據(jù))
3、地址寄存器(告訴磁盤要寫的LBA地址,磁盤自己通過(guò)CHS尋址)
4、結(jié)果寄存器(CPU獲取IO請(qǐng)求是否成功的狀態(tài),比如可能空間不足寫入失?。?
二、文件系統(tǒng)?
? ? ? ? 通過(guò)邏輯抽象,我們可以把對(duì)扇區(qū)的地址抽象成線性的LBA地址,但是具體磁盤有多大呢?已經(jīng)用了多少扇區(qū)?哪些扇區(qū)還沒被使用?哪些扇區(qū)存的是屬性?哪些扇區(qū)存的是內(nèi)容?要往哪個(gè)扇區(qū)去寫入??——>諸如以上問(wèn)題,注定了我們的操作系統(tǒng)必須想辦法把磁盤空間組織起來(lái)??!
? ? 首先是磁盤分區(qū),我們可以把一個(gè)磁盤分成多個(gè)分區(qū)。
?而每個(gè)分區(qū),都可以用以下的區(qū)域來(lái)表示
?Boot Block:?是文件系統(tǒng)中的一個(gè)特殊塊,位于文件系統(tǒng)的起始位置。 它包含了引導(dǎo)加載程序(Boot Loader)所需的信息,用于引導(dǎo)操作系統(tǒng)的啟動(dòng)過(guò)程。
?Block group:每個(gè)分區(qū)被分成了一個(gè)個(gè)的block,該block的大小是由格式化確定的,不可被修改,每個(gè)block由可以細(xì)分為6個(gè)區(qū)域。
?Linux中,文件的屬性和內(nèi)容是分開存儲(chǔ)的!!
?2.1 inode??
? ? inode:存儲(chǔ)的是單個(gè)文件的全部屬性(128字節(jié)) ,一般而言,一個(gè)文件只有一個(gè)inode!
?Linux系統(tǒng)里標(biāo)記文件的唯一標(biāo)識(shí)用的是inode,且文件的屬性中不包含文件的名稱??!
通過(guò)ls -li 可以觀察到文件的inode編號(hào)?
其實(shí)這個(gè)信息除了通過(guò)這種方式來(lái)讀取,還有一個(gè)stat命令能夠看到更多信息?
?2.2 Data Block
? ? ?Data Block:存文件內(nèi)容的區(qū)域,以塊的形式呈現(xiàn),常見的是4KB大小,一般而言一個(gè)塊只有自己的數(shù)據(jù)!
? ? ?一個(gè)文件只有一個(gè)inode,但如果是個(gè)大文件可能會(huì)有很多個(gè)塊。所以在inode結(jié)構(gòu)體內(nèi)部會(huì)有一個(gè)block數(shù)組,存儲(chǔ)的是數(shù)據(jù)塊的塊號(hào)。
問(wèn)題:那難道是文件內(nèi)容需要多少個(gè)數(shù)據(jù)塊,block數(shù)組就需要有多大么???
——>并不是的,block數(shù)組內(nèi)部除了一部分是直接索引(存儲(chǔ)文件塊號(hào),可直接找到文件內(nèi)容),還有一小部分是二級(jí)索引(該塊號(hào)不會(huì)存儲(chǔ)文件內(nèi)容而是繼續(xù)存儲(chǔ)文件的塊號(hào))
2.3 Bitmap?
我怎么知道,哪些塊被使用過(guò),哪些塊沒被使用過(guò)呢???
塊位圖(Block Bitmap):Block Bitmap中記錄著Data Block中哪個(gè)數(shù)據(jù)塊已經(jīng)被占用,哪個(gè)數(shù)據(jù)塊沒有被占用
inode那么多,我怎么知道要給該文件分配哪個(gè)呢??
inode位圖(inode Bitmap):每個(gè)bit表示一個(gè)inode是否空閑可用。
問(wèn)題1: 為什么我們下載一個(gè)文件需要很久,但是刪除的時(shí)候卻很快呢??
?——>刪除一個(gè)文件的時(shí)候,并不會(huì)把塊(文件內(nèi)容)清空,而僅僅只是把對(duì)應(yīng)比特標(biāo)志位給修改了,表明該塊是空閑可用的。?
問(wèn)題2:如果我們想恢復(fù)一個(gè)被刪除的文件,要怎么辦呢???
——> 如果我們不小心誤刪的一個(gè)文件,如果這個(gè)文件很重要,最好的辦法就是什么都不做然后找專業(yè)的人去恢復(fù)(一般來(lái)說(shuō)恢復(fù)其實(shí)就是得找到該文件的inode編號(hào),比如通過(guò)Linux的日志信息找到被刪文件的inode,但是具體怎么恢復(fù)得依靠一些專業(yè)的東西!),因?yàn)殡m然內(nèi)容還在,但是他的位圖信息表明是可以被使用的,所以你如果亂操作可能會(huì)導(dǎo)致文件內(nèi)容被覆蓋。
?2.4?GDT和超級(jí)塊
GDT(Group Descriptor Table):塊組描述符,描述塊組屬性信息(該block組的分配信息和使用情況)。
超級(jí)塊(Super Block):存放文件系統(tǒng)本身的結(jié)構(gòu)信息。記錄的信息主要有:bolck 和 inode的總量, 未使用的block和inode的數(shù)量,一個(gè)block和inode的大小,最近一次掛載的時(shí)間,最近一次寫入數(shù)據(jù)的時(shí)間,最近一次檢驗(yàn)磁盤的時(shí)間等其他文件系統(tǒng)的相關(guān)信息。Super Block的信息被破壞,可以說(shuō)整個(gè) 文件系統(tǒng)結(jié)構(gòu)就被破壞了 (整個(gè)分區(qū)的相關(guān)信息)
? ? ? ? 因?yàn)槌?jí)快是在組里面存在的,但是記錄了整個(gè)分區(qū)的信息,所以并不需要每個(gè)組都有,?其實(shí)理論上來(lái)說(shuō)有一個(gè)就夠了(太多會(huì)影響速度),但是由于他非常重要,一旦損壞就會(huì)造成文件系統(tǒng)崩潰,所以一般來(lái)說(shuō)一個(gè)分區(qū)里面會(huì)有個(gè)別組有超級(jí)快,這樣即使一個(gè)超級(jí)塊崩了,也可以通過(guò)其他超級(jí)塊區(qū)對(duì)文件系統(tǒng)做修正!!
問(wèn)題:超級(jí)塊決定了文件系統(tǒng)能否正常運(yùn)行,塊又那么多,操作系統(tǒng)是如何定位超級(jí)塊的呢??
?——> 魔數(shù),一個(gè)隨機(jī)值,在超級(jí)塊中的位置是確定的,只要我們操作系統(tǒng)去讀該塊的規(guī)定偏移量位置看看是否存在魔數(shù),就可以確定該塊是不是超級(jí)塊?。?/p>
2.5 格式化
? ? ? ?每個(gè)分區(qū)在使用之前,就必須提前將部分文件系統(tǒng)的屬性信息提前設(shè)置到對(duì)應(yīng)的分區(qū)中,方便我們后續(xù)使用這個(gè)分區(qū)或者分組??!
? ? ? ?對(duì)磁盤做格式化可以幫助我們讓磁盤恢復(fù)到完全沒有被使用過(guò)的狀態(tài)。?
?三、對(duì)目錄的理解
3.1 新建和刪除文件,系統(tǒng)做了什么?
?1、新建文件:系統(tǒng)會(huì)在某個(gè)路徑下去創(chuàng)建,路徑幫助我們確定在哪一個(gè)分區(qū),讀取了超級(jí)塊后確定了一個(gè)block,然后通過(guò)查該block的GDT知道該分區(qū)的inode還有很多沒有被使用,于是到inodebitmap位圖結(jié)構(gòu)里找到了沒有用過(guò)的inode,然后分配給該文件,分配好之后把自己的屬性往里面填,這樣就算新建成功了??!
? ?如果還打算寫入的話,先確認(rèn)一下要寫入內(nèi)容的大小,確定一下需要幾個(gè)塊,然后到blockbitmap里面找到?jīng)]被使用的塊,把塊號(hào)填到inode結(jié)構(gòu)體里面的block數(shù)組里,然后再把文件內(nèi)容寫進(jìn)這些塊里面
2、刪除文件:先找到分區(qū),再找到inode,然后把對(duì)應(yīng)inodebitmap和blockbitmap的位置置0。其實(shí)文件還在,只不過(guò)對(duì)應(yīng)的塊可以被覆蓋?。?/p>
?我們會(huì)發(fā)現(xiàn),無(wú)論是什么操作,最重要的就是如何去找到文件的inode,可以我們?nèi)绾沃酪粋€(gè)文件的inode呢??其實(shí)使用者壓根沒關(guān)心過(guò)inode,我們只關(guān)心文件名?。?/p>
?3.2 目錄文件
目錄也是文件,也有自己的inode ,也是有內(nèi)容+屬性構(gòu)成!
?重點(diǎn):目錄文件的文件內(nèi)容放的是文件的文件名+對(duì)應(yīng)文件的inode映射關(guān)系!!
?問(wèn)題1:為什么一個(gè)目錄下不能有同名文件??
——>因?yàn)槲募蚷node是key和value的關(guān)系,key值必須唯一。
問(wèn)題2:為什么沒有w無(wú)法創(chuàng)建文件??
——>w意味著無(wú)法寫,所以我們就無(wú)法將文件名和inode的映射關(guān)系寫進(jìn)去,因此無(wú)法創(chuàng)建文件。
問(wèn)題3:為什么沒r無(wú)法查看文件??
——>r意味著無(wú)法讀,所以我們也看不到文件名和inode的映射關(guān)系,找不到inode就找不到文件。
問(wèn)題4:為什么沒有x無(wú)法進(jìn)入目錄??
——>x意味著沒有操作權(quán)限,要進(jìn)入一個(gè)目錄必須cd目錄名,并且將當(dāng)前目錄名更新到環(huán)境變量PWD中,所以無(wú)法進(jìn)行該操作的話我們就無(wú)法進(jìn)入。
?問(wèn)題5:通過(guò)讀取目錄文件內(nèi)容可以找到文件的inode,那么目錄的inode如何查找呢??
——>你當(dāng)前的目錄其實(shí)也是別的目錄的子目錄,所以就得遞歸往上找,一直找到根目錄,然后再?gòu)母夸浲抡一貋?lái),讀取每個(gè)目錄的數(shù)據(jù)塊,直到找到該目錄的inode.所以訪問(wèn)文件必須帶路徑??!
3.3 dentry緩存(擴(kuò)展)
? ? ? ?找目錄的inode要遞歸向上找到根目錄,然后再找回來(lái),難度不會(huì)很慢么??確實(shí)會(huì)的,所以Linux提供了dentry緩存,將常用文件的inode信息緩存起來(lái)!!?
? ? ? ? dentry緩存,簡(jiǎn)稱dcache,是Linux為了提高目錄項(xiàng)對(duì)象的處理效率而設(shè)計(jì)的。它是一個(gè)slab cache,保存在全局變量dentry_cache中,用于保存目錄項(xiàng)的緩存。dentry結(jié)構(gòu)是一種含有指向父節(jié)點(diǎn)和子節(jié)點(diǎn)指針的雙向結(jié)構(gòu),多個(gè)這樣的雙向結(jié)構(gòu)構(gòu)成一個(gè)內(nèi)存里面的樹狀結(jié)構(gòu),也就是文件系統(tǒng)的目錄結(jié)構(gòu)在內(nèi)存中的緩存了。
linux 內(nèi)核 目錄項(xiàng)高速緩存 dentry cache 簡(jiǎn)介-CSDN博客
四、軟硬鏈接?
建立方式:
4.1 如何理解硬鏈接?
硬鏈接不是一個(gè)獨(dú)立的文件,因?yàn)樗麤]有獨(dú)立的inode!!
——>所謂的建立硬鏈接,本質(zhì)上就是在特定目錄的數(shù)據(jù)塊中新增文件名和指向的文件inode編號(hào)的映射關(guān)系(有點(diǎn)像起別名的感覺,可以讓多個(gè)文件名指向一個(gè)inode)。?
?
問(wèn)題1:為什么dir的引用計(jì)數(shù)是2??
——>因?yàn)?.? 是dir的一個(gè)硬鏈接
問(wèn)題2:為什么dir的上級(jí)目錄引用計(jì)數(shù)是3?
——>因?yàn)?dir中的 ..是上級(jí)目錄的一個(gè)硬鏈接?
總結(jié):
(1)無(wú)論他的引用計(jì)數(shù)是多少,-2就是他當(dāng)前子目錄的數(shù)目(比如21,那么他的子目錄就是19)
(2)所以刪除文件并不是直接把該文件的位圖清空,本質(zhì)上是先把目錄里該文件的inode映射關(guān)系去掉,然后再到inode里面把引用計(jì)數(shù)--? ?引用計(jì)數(shù)為0時(shí)才是把文件的位圖清空。
問(wèn)題3:為什么Linux不允許對(duì)目錄建立硬鏈接??(重點(diǎn)?。。?/p>
???????
——>為了防止出現(xiàn)環(huán)的題,b比方說(shuō)我們要找一個(gè)目錄的inode,會(huì)向上索引找到根目錄,再向下找回來(lái),如果恰好這個(gè)過(guò)程中出現(xiàn)了 上級(jí)目錄的硬鏈接,那么就會(huì)回退回去,造成死循環(huán)!!
問(wèn)題4:可是目錄內(nèi)部不是有. 和 .. 的硬鏈接嗎??(重點(diǎn)?。。?/p>
——> (1) . 和 .. 是操作系統(tǒng)創(chuàng)建的,他不讓你創(chuàng)建是為了你好,擔(dān)心你創(chuàng)建之后出現(xiàn)環(huán)的問(wèn)題,其實(shí). 和..按照道理也會(huì)有環(huán)的問(wèn)題,但是操作系統(tǒng)提前規(guī)定好了 .和..不會(huì)被做搜索,這是強(qiáng)制規(guī)定的!所以不會(huì)有環(huán)的問(wèn)題! (2)其實(shí)操作系統(tǒng)干嘛要多此一舉搞個(gè). 和 ..呢??不就是為了方便讓用戶使用相對(duì)路徑么??? 由于目錄文件的inode需要遞歸向上索引才能找到,所以我們總是需要給想要找的文件加上絕對(duì)路徑,現(xiàn)在操作系統(tǒng)給我們. 和 .. ,我們就可以用相對(duì)路徑了!? ??
硬鏈接應(yīng)用場(chǎng)景:通常用來(lái)做路徑定位?。】梢酝ㄟ^(guò)硬鏈接進(jìn)行目錄切換?。ú怀S茫?
4.2 如何理解軟鏈接?
? ? ? 軟連接是一個(gè)獨(dú)立的文件,有獨(dú)立的inode,也有獨(dú)立的數(shù)據(jù)塊?,他的內(nèi)容里面保存的是指向的文件的路徑。(相當(dāng)于windows的快捷方式)
?
?應(yīng)用場(chǎng)景:當(dāng)一個(gè)可執(zhí)行文件在路徑深處時(shí),我們要找到他比較麻煩,如果我們?cè)诋?dāng)前路徑使用,就可以在當(dāng)前路徑建立一個(gè)該文件的軟連接。(可執(zhí)行程序隨便放都行,只要有軟鏈接,較常用)
?五、文件系統(tǒng)和內(nèi)存系統(tǒng)的關(guān)聯(lián)
5.1 硬件和內(nèi)存交互的基本單位
物理內(nèi)存是以4KB為基本單位的(由操作系統(tǒng)決定的)? ??
物理內(nèi)存交互的單位叫做頁(yè)框,而磁盤交互的單位叫做頁(yè)幀
?問(wèn)題:為什么是4KB而不是要多少給多少呢??難道我訪問(wèn)100字節(jié)不比訪問(wèn)4KB快嗎??
——>理論上是這樣的,但是100字節(jié)可能在4KB的不同位置,需要訪問(wèn)的話還需要對(duì)磁盤做更精細(xì)的計(jì)算(磁盤速度太慢了),甚至是文件系統(tǒng)也需要更精細(xì)的方法,操作系統(tǒng)文:你能保證你后幾秒不用上下文數(shù)據(jù)嗎??反正4kB和100字節(jié)效率差不是很多,我都給你拿過(guò)來(lái),說(shuō)不定你用得上呢?。ǜ鶕?jù)局部性原理:程序傾向于訪問(wèn)近期或者近鄰的數(shù)據(jù),這是計(jì)算機(jī)性能優(yōu)化的重要原則,合理運(yùn)用可以整體提速!)
?總結(jié):(1)硬件:減少IO的次數(shù)——減少訪問(wèn)外設(shè)的次數(shù)
(2)軟件:基于局部性原理而產(chǎn)生的預(yù)加載——整體提速
5.2 操作系統(tǒng)如何管理內(nèi)存
? ? ? ?虛擬地址是操作系統(tǒng)提供的,我們用戶只能看到純的虛擬地址,具體這個(gè)虛擬地址具體映射到物理內(nèi)存的哪個(gè)位置,我們并不關(guān)心也并不知道,這是操作系統(tǒng)幫我們決定好的,所以操作系統(tǒng)必然可以看得到物理地址??!
? ? ? ? 那么操作系統(tǒng)要如何去管理我們的內(nèi)存呢??
?Page的配置不能太大,因?yàn)檫@樣的話會(huì)占據(jù)大量的空間。
?flag:檢查當(dāng)前page的狀態(tài)(比如說(shuō)當(dāng)前檢測(cè)到我們要訪問(wèn)的內(nèi)容并沒有被加載到內(nèi)存中,所以這個(gè)時(shí)候就會(huì)發(fā)生缺頁(yè)中斷)?
count:引用計(jì)數(shù)(可以通過(guò)引用計(jì)數(shù)知道當(dāng)前有多少個(gè)進(jìn)程在共享我這個(gè)page,當(dāng)有進(jìn)程需要去修改內(nèi)部的數(shù)據(jù)的時(shí)候,就會(huì)發(fā)生寫時(shí)拷貝)
所有申請(qǐng)內(nèi)存的工作,本質(zhì)上都是訪問(wèn)Page數(shù)組?。。ǜ鶕?jù)一個(gè)隨機(jī)地址判斷這個(gè)地址屬于哪個(gè)Page的方法:1KB=2^10字節(jié)? 所以4KB=2^12字節(jié)? 恰好在16進(jìn)制地址中就是后三位數(shù)字,所以我們?nèi)魏我粋€(gè)地址只要 & 0xFFFF F000 ,就可以找到該地址對(duì)應(yīng)的Page)?
5.3 文件頁(yè)緩沖區(qū)
在Linux中,我們每一個(gè)進(jìn)程打開的每一個(gè)文件都具有自己的inod和文件頁(yè)緩沖區(qū)!!
? ? ? 在我們的file結(jié)構(gòu)體貍貓有一個(gè)address_spqce結(jié)構(gòu)體,里面又有一個(gè)page_tree,里面又有一個(gè)?radix_tree_node節(jié)點(diǎn)?
?page_tree這個(gè)結(jié)構(gòu)有點(diǎn)類似于B樹。他不斷延伸最后會(huì)找到我們想要尋找的Page結(jié)構(gòu)體!
內(nèi)存管理,并不是直接讓那個(gè)我們?nèi)ピL問(wèn)page數(shù)組,而是通過(guò)一些配套的算法。?
5.4 字典樹的理解
? ? ? 以上是一顆相對(duì)簡(jiǎn)單的字典樹(組合式的KV模型),比方說(shuō)我們想要找cba,我們就可以按照這顆樹索引下去,找到我們想要找到的內(nèi)容(某個(gè)對(duì)象數(shù)據(jù))?
?為什么操作系統(tǒng)要用字典樹這個(gè)結(jié)構(gòu)來(lái)管理我們的page呢??
——>因?yàn)槲募膬?nèi)容按照4KB是有偏移量的。(雖然我們的塊是4KB大小,但是我們不一定是在開頭去讀取或?qū)懭?,而操作系統(tǒng)通過(guò)字典樹這種組合式的KV結(jié)構(gòu)來(lái)幫助我們定位具體的位置)
5.5 串聯(lián)進(jìn)程管理、文件管理、內(nèi)存管理
? ? ? ? ?首先我們創(chuàng)建了一個(gè)進(jìn)程,創(chuàng)建了一個(gè)PCB結(jié)構(gòu)體,然后還會(huì)順便創(chuàng)建一張文件描述符表,我們調(diào)用C接口去打開寫入文件的時(shí)候,該文件會(huì)在該文件描述符表中分配一個(gè)位置,然后創(chuàng)建一個(gè)file結(jié)構(gòu)體,里面分配了inode,但是文件的內(nèi)容會(huì)先寫入在C層的緩沖區(qū),?當(dāng)滿足刷新策略的時(shí)候,再通過(guò)一些方式將其刷新到我們的page中(內(nèi)核緩沖區(qū))。然后最后再刷新到磁盤中。所以這個(gè)過(guò)程數(shù)據(jù)被拷貝了3次
? ? ? 當(dāng)我們的進(jìn)程將數(shù)據(jù)交給內(nèi)存后,其實(shí)他就不管了,所以我們的操作系統(tǒng)必須關(guān)心內(nèi)存要如何刷新到磁盤上,且可能同一時(shí)間有大量的IO請(qǐng)求,因此我們的操作系統(tǒng)也要關(guān)心先執(zhí)行哪個(gè)請(qǐng)求。所以這就涉及到IO子系統(tǒng)(操作系統(tǒng)和驅(qū)動(dòng)做交互的系統(tǒng))?
? 我們的IO請(qǐng)求會(huì)將相關(guān)的一些需求和配置寫到一個(gè)request結(jié)構(gòu)體里,然后再由操作系統(tǒng)做管理
——>因?yàn)槲覀兊牟煌腎O請(qǐng)求可能是向不同的扇區(qū)寫入,所以我們肯定希望比較接近的扇區(qū)在一起被寫入,這樣減少磁頭定位能夠提高整體效率,所以我們會(huì)用一個(gè)隊(duì)列把request管理起來(lái),然后設(shè)計(jì)一些IO排序和IO合并算法,來(lái)給IO請(qǐng)求整體提速??!
? ? ?
? ? ? ?在我們開機(jī)的時(shí)候,因?yàn)槲锢韮?nèi)存經(jīng)常需要跟磁盤做交互,所以會(huì)提前把一些訪問(wèn)物理內(nèi)存所需要的區(qū)域會(huì)被預(yù)先加載進(jìn)去,尤其是文件系統(tǒng)的相關(guān)功能。
——>說(shuō)明操作系統(tǒng)真的幫助我們做了很多事情!!?
?5.6 slab分配器和伙伴系統(tǒng)(擴(kuò)展)
從我們創(chuàng)建進(jìn)程開始,或者是申請(qǐng)文件,我們就會(huì)有各種各樣的結(jié)構(gòu)體不斷地被創(chuàng)建和釋放
? ? ? 所以當(dāng)我們的內(nèi)核數(shù)據(jù)結(jié)構(gòu)想要釋放的時(shí)候,操作系統(tǒng)并不會(huì)直接釋放,而是會(huì)把一些高頻使用的內(nèi)核數(shù)據(jù)結(jié)構(gòu)體通過(guò)某些機(jī)制暫時(shí)緩存起來(lái),當(dāng)你下次需要的時(shí)候你就不需要跟內(nèi)存模塊做申請(qǐng),而是直接把之前緩存里面的內(nèi)核數(shù)據(jù)結(jié)構(gòu)拿出來(lái)初始化即可!
slap分配器:Linux 內(nèi)核 | 內(nèi)存管理——slab 分配器 - 知乎 (zhihu.com)?
伙伴系統(tǒng):一篇看懂!伙伴系統(tǒng)之伙伴系統(tǒng)概述--Linux內(nèi)存管理 - 知乎 (zhihu.com)
?
柚子快報(bào)激活碼778899分享:運(yùn)維 Linux:認(rèn)識(shí)文件系統(tǒng)
參考鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。