文件的狀態(tài)有被打開(kāi)和沒(méi)有被打開(kāi),之前談到一個(gè)文件被進(jìn)行讀寫,就要打開(kāi)加載到內(nèi)存中,通過(guò)對(duì)應(yīng)的系統(tǒng)調(diào)用,fd文件描述符的管理,write和read等函數(shù)的增刪查改。并且借助緩沖區(qū)對(duì)文件屬性和內(nèi)容的修改。
大部分文件是沒(méi)有被打開(kāi)的(不需要訪問(wèn)),都在磁盤里保存的!對(duì)于沒(méi)被進(jìn)程打開(kāi)的文件也要進(jìn)行管理。在一個(gè)偌大的磁盤中,需要找到某份內(nèi)容,就要進(jìn)行核心工作------快速定位!
文件的管理工作包括:1、打開(kāi)的文件進(jìn)行管理? 2、沒(méi)被打開(kāi)的文件在磁盤里管理
這一個(gè)管理工作就叫文件系統(tǒng)。本質(zhì)就是文件的存儲(chǔ)問(wèn)題。
了解磁盤的物理結(jié)構(gòu)
磁盤是計(jì)算機(jī)唯一的機(jī)械設(shè)備,早些年計(jì)算機(jī)用的激素機(jī)械硬盤,這幾年逐步過(guò)渡到ssd。根據(jù)馮諾依曼體系,里cpu越員,速度就會(huì)越慢。磁盤的速度是慢于內(nèi)存慢于ssd。
雖然磁盤的速度效率慢,但是它的造價(jià)便宜,內(nèi)存容量大。所以企業(yè)一般是使用機(jī)械硬盤。
磁盤的主要結(jié)構(gòu)
包括盤片和磁頭
盤片:一片有倆面
磁頭:一個(gè)磁頭負(fù)責(zé)一片,用來(lái)讀取修改1或0
簡(jiǎn)述這一個(gè)過(guò)程:
一個(gè)磁盤會(huì)有多個(gè)盤片堆疊。一個(gè)磁頭負(fù)責(zé)一個(gè)盤片。盤片沿著指定方向高速旋轉(zhuǎn),磁頭沿著半徑方向轉(zhuǎn)動(dòng),一秒鐘內(nèi)盤片可能轉(zhuǎn)了上萬(wàn)次。因此在這樣的高速旋轉(zhuǎn)下,盤面的每一個(gè)小單元都能被識(shí)別到。
這里需要主要磁頭和盤片不是貼在一起,而是非常接近。因此一個(gè)細(xì)微的抖動(dòng)或者是灰塵都會(huì)影響磁盤的數(shù)據(jù)。
寫入:計(jì)算機(jī)的世界上只有0和1,0和1是一種標(biāo)志,就好比N和S級(jí)。在高速旋轉(zhuǎn)中,磁頭通過(guò)磁化將一個(gè)比特位的空間磁化為0或1的過(guò)程就是寫入。
磁盤的存儲(chǔ)結(jié)構(gòu)
這里對(duì)磁盤的盤片詳細(xì)介紹。一個(gè)盤片可以等分分成多個(gè)扇形,每一個(gè)扇形就叫做扇區(qū)。
磁盤又可以做同心環(huán),每倆個(gè)環(huán)之間包圍的區(qū)域就叫做磁盤。
因此,研究盤片主要是研究扇區(qū)和磁道。一個(gè)磁道可以有多個(gè)扇區(qū),一個(gè)扇區(qū)也可以有多個(gè)磁道。這是一個(gè)劃分。
扇區(qū)就是磁盤的最小存儲(chǔ)單元512字節(jié),4kb.
磁頭Head
磁道 Track
扇區(qū) Sector
CHS定位法
一個(gè)磁盤有許多塊盤片,盤片上有扇區(qū)和磁道。如何在一個(gè)磁盤中找到指定位置的數(shù)據(jù)?
多個(gè)磁道堆疊,就好比一個(gè)空心的圓柱cylinder 。
尋找地址的方法:
- 選擇哪一面: 本質(zhì)是選擇磁頭
- 選擇哪一個(gè)磁道 :因?yàn)榇_定了面,所以要確定磁道,就是確定哪一個(gè)柱面
- 選擇在磁道上的哪一個(gè)扇區(qū)
這一個(gè)過(guò)程就是Head Cylinder Sector? CHS定位法?
存儲(chǔ)的邏輯抽象
將磁盤的結(jié)構(gòu)由圓盤抽象成線性
類似于磁帶,我們將圓盤拉直后,就是線性的存儲(chǔ)介質(zhì)
這一個(gè)將磁盤的抽象線性化,得到的數(shù)組地址。就叫做LBA(邏輯塊地址)。
那么我們想要對(duì)磁盤寫入只需要知道LBA地址,然后通過(guò)LBA與CHS的映射關(guān)系就能在磁盤上找到那一塊空間。
舉例
假設(shè):LBA地址為1234,有倆片盤片,共4面,每面可以存儲(chǔ)1000字節(jié),每面磁道有10個(gè),扇區(qū)有100個(gè)1234 / 1000=1 在第一面上(從0開(kāi)始計(jì)算)
234/10=23? 第23個(gè)磁道上
234/100=2? 第2個(gè)扇區(qū)上
因此就是得到HCS
這樣,我們對(duì)磁盤的管理就轉(zhuǎn)化為對(duì)扇區(qū)數(shù)組的管理
OS可以按照扇區(qū)為單位進(jìn)行存取,也可以基于文件系統(tǒng),按照文件塊對(duì)文件系統(tǒng)數(shù)據(jù)存取。
總結(jié):
對(duì)存儲(chǔ)設(shè)備的管理,OS層面就是對(duì)數(shù)組的增刪查改
文件系統(tǒng)
磁盤里的文件是龐大的,為了便于管理,通常會(huì)將抽象的線性LBA拆分成小部分,將每一小份管理好,借鑒經(jīng)驗(yàn),來(lái)管理整體。這是分治的思想。
假設(shè)磁盤有500G。可以通過(guò)分區(qū)來(lái)將一個(gè)磁盤分成幾個(gè)小區(qū)。通常我們的筆記本就有一塊磁盤,一塊磁盤被分成C盤\D盤。假設(shè)我們將500G分成五個(gè)區(qū),每個(gè)區(qū)域就是100G,在對(duì)100G劃分成組,每一份就是2G。
inode
每個(gè)區(qū)的起始位置都有一個(gè)Boot Block
Boot? Block是至關(guān)重要的 記錄OS用于引導(dǎo)用戶的操作與配置,記錄分區(qū)的信息等。
每個(gè)區(qū)的劃分就是組,下面對(duì)組詳細(xì)研究
一個(gè)組被劃分成 super block(超級(jí)塊)? ? ? ? ?group descriptor table(組織描述符)? block bitmap(塊位圖)? ? ? ? inode bitmap( i結(jié)點(diǎn)位圖)? ? ? ? ? bata block(數(shù)據(jù)塊)
i結(jié)點(diǎn)表
用來(lái)存儲(chǔ)文件的屬性,如大小,所有組,權(quán)限,修改時(shí)間等
inode表應(yīng)該是一個(gè)定長(zhǎng)的結(jié)構(gòu)體
struct inode{
大小,權(quán)限,所屬組,ACM,inode編號(hào)等
引用計(jì)數(shù)
block[n]
}
每個(gè)inode結(jié)構(gòu)體的大小是128字節(jié),一般而言一個(gè)文件就有一個(gè)inode編號(hào),一個(gè)組有多少個(gè)inode編號(hào)是可以計(jì)算的? 一個(gè)組的大小是4KB 4KB=4096字節(jié) 就有inode=4096/128=32個(gè)
數(shù)據(jù)段
:存放文件內(nèi)容
ionde結(jié)構(gòu)體會(huì)記錄編號(hào)?
通過(guò)數(shù)據(jù)塊的映射關(guān)系就能快速找到需要的內(nèi)容
其中
0-12為 1 級(jí)映射
13為間接映射
14為3 級(jí)映射
一級(jí)映射:1-》2? ? 2-》3
間接映射? ?13-》20
三級(jí)映射? 向四面八方(發(fā)散)尋找
inode位圖/塊位圖
來(lái)標(biāo)識(shí)每一個(gè)bit的inode(數(shù)據(jù)塊)是否空閑可用
用法同位圖 0表示空閑/1表示存在
超級(jí)塊(super block)
用來(lái)記錄文件系統(tǒng)本身的基本信息。包括inode和數(shù)據(jù)塊的總量,未使用的inode和block數(shù)目,掛載信息,最后一次檢擦磁盤的時(shí)間。
文件=內(nèi)容+屬性 都是數(shù)據(jù) 并且內(nèi)容和屬性是分開(kāi)存儲(chǔ)的
要把多個(gè)文件的數(shù)據(jù)寫入組中,就要先把管理組的信息寫入。
一個(gè)磁盤被格式化后,就是重新寫入管理者信息。要想使用分區(qū),就要先進(jìn)行掛載。
如果超級(jí)塊被破壞,那么就不能正常使用磁盤。但是OS會(huì)對(duì)超級(jí)塊拷貝幾份到不同的組起始位置,以備意外的修改。
細(xì)節(jié)問(wèn)題
文件的內(nèi)容和屬性是分開(kāi)的,inode標(biāo)識(shí)符是文件的唯一標(biāo)志,文件名和inode是映射關(guān)系,Linux識(shí)別文件只認(rèn)inode
描述文件的創(chuàng)建
根據(jù)文件名 映射到空閑的inode_bitmap 把0修改為1,找到對(duì)應(yīng)inode表的結(jié)點(diǎn),寫入相應(yīng)的屬性。為其分配數(shù)據(jù)塊,向數(shù)據(jù)塊寫入信息。再block_bitmap對(duì)應(yīng)位置的0修改為1,建立inode 和 datablock的映射關(guān)系,最后返回inode
創(chuàng)建文件,一定是再某個(gè)路徑底下!
通過(guò)inode編號(hào)->找到所處目錄->根據(jù)文件的inode找到目錄的data block->將文件名和inode編號(hào)映射關(guān)系寫入目錄數(shù)據(jù)塊中。
文件的刪除
在文件目錄中找到 inode,再找到對(duì)應(yīng)的block,在數(shù)據(jù)塊里通過(guò)映射關(guān)系找到要?jiǎng)h除文件的inode編號(hào)
再根據(jù)inode的編號(hào)找到block group(組) ,在倆個(gè)(inode和block)位圖中,都將1修改為0。
最后在目錄的數(shù)據(jù)塊映射除,把文件名和inode映射關(guān)系解除。完成刪除工作。
軟硬鏈接
在當(dāng)前路徑底下,有test.txt文件和dir目錄
軟鏈接
類似于window的快捷方式
通過(guò)指令 ln -s test.txt test.soft 將前的文件鏈接到后
通過(guò)ls -il查看inode 得到源文件和軟連接的文件的inode不同,不是同一份文件!
因此軟鏈接是創(chuàng)建獨(dú)立文件,有獨(dú)立的inode
軟鏈接的內(nèi)容是指向目標(biāo)文件的路徑
如果刪除了源文件,鏈接文件存在。但是不能存在或者執(zhí)行
目錄是無(wú)法進(jìn)行軟鏈接的
硬鏈接
創(chuàng)建文件myfile.txt 通過(guò)硬鏈接指令 ln myfile.txt myfile.hard
通過(guò)ls -il指令 對(duì)比源文件myfile和硬鏈接文件myfile.hard得到這倆個(gè)文件是同一個(gè)inode編號(hào),因此它們不是獨(dú)立文件,是同一份文件。
還可以觀察到 文件權(quán)限后的標(biāo)識(shí)符是軟硬鏈接數(shù)目
軟鏈接不改變鏈接數(shù)目
硬鏈接改變鏈接數(shù)目
刪除硬鏈接文件后,源文件的軟硬鏈接數(shù)目減一
刪除源文件后,硬鏈接的文件鏈接數(shù)目會(huì)減一
這里就涉及到了引用計(jì)數(shù)
硬鏈接的本質(zhì)就是在目錄下建立的文件名和inode的映射關(guān)系
被硬鏈接一次映射關(guān)系就會(huì)多1 ,引用計(jì)數(shù)會(huì)增加。
當(dāng)文件名和inode的映射關(guān)系全部解除? ,計(jì)數(shù)從1減到0時(shí)。文件才會(huì)被刪除。找到inode編號(hào),修改inode位圖和block位圖
目錄的鏈接數(shù):
一個(gè)目錄被創(chuàng)建出來(lái),就有倆個(gè)鏈接數(shù),鏈接文件為本身目錄和當(dāng)前目錄下的 .
如果在目錄下建立新目錄,上一層目錄的鏈接數(shù)也會(huì)增加
目錄硬鏈接會(huì)出現(xiàn)路徑錯(cuò)誤文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-807848.html
軟硬鏈接就在為了不切換路徑,而能夠打開(kāi)的快捷方式文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-807848.html
到了這里,關(guān)于【Linux】磁盤結(jié)構(gòu) | 文件系統(tǒng) | 軟硬鏈接的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!