1. 文件系統(tǒng)的引出
在之前的學(xué)習(xí)過程當(dāng)中,我們知道當(dāng)文件被打開后需要加載進(jìn)內(nèi)存,第一步為其創(chuàng)建struct file結(jié)構(gòu)體描述其結(jié)構(gòu)(操作系統(tǒng)需要管理被打開的文件:先描述再組織),在通過進(jìn)程當(dāng)中的文件描述符指針指向文件描述符表,根據(jù)文件描述符的分配規(guī)則給新打開的文件分配文件描述符,那么此時(shí)進(jìn)程就通過文件描述符和文件建立起聯(lián)系。
進(jìn)程與文件關(guān)系的博客鏈接
當(dāng)我們進(jìn)行文件操作時(shí),例如寫入文件就需要先將數(shù)據(jù)拷貝進(jìn)C語言封裝的文件緩沖區(qū),再拷貝進(jìn)內(nèi)核緩沖區(qū),最后再寫入到外設(shè)(磁盤)當(dāng)中…
文件緩沖區(qū)的博客鏈接
而以上這些操作都是進(jìn)程與被打開文件之間的關(guān)系,那么對于未打開的文件,操作系統(tǒng)是不是也需要進(jìn)行管理操作呢?
沒有被打開的文件都只能安靜的在磁盤上存放著,磁盤上存在大量文件需要被OS靜態(tài)管理起來,方便我們隨時(shí)打開 – 這就是文件系統(tǒng)的作用
2. 硬件結(jié)構(gòu)的學(xué)習(xí)
在詳細(xì)描述文件系統(tǒng)之前,需要我們對硬件有一定程度的了解,下面咱們就來簡單認(rèn)識(shí)一下吧?。?!
2.1 磁盤的物理結(jié)構(gòu)
目前在筆記本當(dāng)中已經(jīng)很少見到使用磁盤來作為存儲(chǔ)結(jié)構(gòu)了,大多數(shù)都是固態(tài)硬盤(同等存儲(chǔ)量固態(tài)硬盤的價(jià)格要高于機(jī)械硬盤,固態(tài)硬盤的訪問速度更快)
但是在企業(yè)當(dāng)中還是通常使用磁盤來作為數(shù)據(jù)存儲(chǔ)的主流,因?yàn)楣虘B(tài)硬盤還存在訪問次數(shù)的限制(訪問次數(shù)過多可能會(huì)造成擊穿現(xiàn)象)
而且磁盤的造價(jià)更低
磁盤是屬于計(jì)算機(jī)結(jié)構(gòu)當(dāng)中的唯一一個(gè)機(jī)械結(jié)構(gòu)?。?!
而且磁盤是外設(shè),這二者結(jié)合起來導(dǎo)致硬盤的訪問速度非常低(跟CPU相較而言)
盤面此時(shí)在高速旋轉(zhuǎn),磁頭也在不停擺動(dòng)
但是盤面和磁頭不接觸(盤面上存儲(chǔ)的就是大量的數(shù)據(jù),一旦磁頭和盤面進(jìn)行接觸,可能會(huì)刮花盤面,導(dǎo)致數(shù)據(jù)丟失)
可以通過小時(shí)候使用的光盤來理解,光盤只有一面有數(shù)據(jù),一旦刮花光盤播放起來就很卡(掉幀 – 數(shù)據(jù)丟失)
所以,磁盤對無塵環(huán)境的要求很高,一旦出現(xiàn)灰塵與盤面或者磁頭發(fā)生碰撞,都可能導(dǎo)致磁盤的損壞
2.2 磁盤的存儲(chǔ)結(jié)構(gòu)
磁盤的盤面的轉(zhuǎn)速很快,通常可能達(dá)到1w轉(zhuǎn)1s,這么快的標(biāo)準(zhǔn)是什么,需要讓磁頭快速定位到磁道和扇區(qū),在單位時(shí)間內(nèi)(非常短:1s/1w)將該扇區(qū)的數(shù)據(jù)全部讀出
2.3 磁盤的邏輯結(jié)構(gòu)
為何OS要對磁盤進(jìn)行邏輯抽象呢?直接用CHS尋址不行嗎?
- 方便管理
- 不想讓操作系統(tǒng)的代碼和硬件強(qiáng)耦合(當(dāng)磁盤切換成固態(tài)硬盤,這套管理方法也能適用,但是CHS就不行啦!)
雖然對應(yīng)的磁盤訪問的基本單位(扇區(qū))是512字節(jié),但是依舊很小,OS內(nèi)的文件系統(tǒng)定制的進(jìn)行多個(gè)扇區(qū)的讀取都是以1KB或者2KB或者4KB(通常是以4KB)為基本單位。即便你只是單純的想要讀取或者修改1個(gè)比特位,也必須將4KB的空間加載進(jìn)內(nèi)存進(jìn)行讀取或者修改,再重新將這些數(shù)據(jù)寫回磁盤
那么這種寫入方式不是非常浪費(fèi)內(nèi)存空間嗎?為啥操作系統(tǒng)會(huì)這樣操作呢?
因?yàn)榫植啃栽淼脑?
局部性原理是指CPU訪問存儲(chǔ)器時(shí),無論是存取指令還是存取數(shù)據(jù),所訪問的存儲(chǔ)單元都趨于聚集在一個(gè)較小的連續(xù)區(qū)域中。通俗來講,就是CPU訪問該字節(jié),那么極大概率會(huì)訪問該字節(jié)前后的數(shù)據(jù)
所以,直接將這一塊的數(shù)據(jù)全部加載進(jìn)內(nèi)存也能提高CPU訪問數(shù)據(jù)的效率
內(nèi)存是被劃分成為4KB大小空間(頁框) 磁盤當(dāng)中的文件尤其是可執(zhí)行文件也是按照4KB大小來劃分的(頁幀)
3. 文件系統(tǒng)
創(chuàng)建/刪除文件操作
創(chuàng)建文件:1. 在inode位圖結(jié)構(gòu)當(dāng)中將對應(yīng)的比特位由0置1,根據(jù)inode找到inode table ,將文件的屬性填入。
2. 將數(shù)據(jù)寫入data block當(dāng)中,建立inode和data block的映射關(guān)系
3. 最后返回inode編號(hào)
刪除文件:1. 找到inode編號(hào)在inode bitmap當(dāng)中的位置將其由1置0即可,數(shù)據(jù)塊當(dāng)中的bitmap位置也由1置0(惰性刪除)
刪除后恢復(fù)
文件刪除后是可以恢復(fù)的,只需要將inode編號(hào)得到,將inode bitmap當(dāng)中的比特位由0置1,再找到inode和數(shù)據(jù)塊之間的映射關(guān)系
將data block中的比特位由0置1… 但是Linux當(dāng)中恢復(fù)文件比較復(fù)雜
(不小心誤刪文件,什么都別做 再新建寫入文件就真正刪除)
目錄也是文件
當(dāng)我們自己在使用shell時(shí),查找文件都是使用文件名,并不是inode ,文件名和inode之間存在什么關(guān)系嘛?
任何一個(gè)文件肯定在目錄下,同樣的,目錄也是文件,也必然存在inode(文件屬性)和數(shù)據(jù)塊
目錄的數(shù)據(jù)塊當(dāng)中存放什么內(nèi)容呢?
目錄里面存放的是文件名和inode的映射關(guān)系?。?!
所以,我們在日常過程中使用ls,一定是查找當(dāng)前目錄下的數(shù)據(jù)塊當(dāng)中文件名,將inode和文件名之間的映射關(guān)系提取出來
同一目錄下不能存在同名文件,文件名在當(dāng)前目錄下就屬于唯一key值,通過文件名就可以索引到inode
之前的學(xué)習(xí)過程中,要在目錄下新建文件必須要有該目錄的寫入權(quán)限,這是為何?
因?yàn)橐陆ㄎ募捅仨氁撃夸浀臄?shù)據(jù)塊當(dāng)中寫入文件名和inode的映射關(guān)系
創(chuàng)建一個(gè)新文件主要有一下4個(gè)操作:文章來源:http://www.zghlxwxcb.cn/news/detail-485285.html
- 存儲(chǔ)屬性
內(nèi)核先找到一個(gè)空閑的i節(jié)點(diǎn)(這里是263466)。內(nèi)核把文件信息記錄到其中。 - 存儲(chǔ)數(shù)據(jù)
該文件需要存儲(chǔ)在三個(gè)磁盤塊,內(nèi)核找到了三個(gè)空閑塊:300,500,800。將內(nèi)核緩沖區(qū)的第一塊數(shù)據(jù)
復(fù)制到300,下一塊復(fù)制到500,以此類推。 - 記錄分配情況
文件內(nèi)容按順序300,500,800存放。內(nèi)核在inode上的磁盤分布區(qū)記錄了上述塊列表。 - 添加文件名到目錄
新的文件名abc。linux如何在當(dāng)前的目錄中記錄這個(gè)文件?內(nèi)核將入口(263466,abc)添加到目錄文
件。文件名和inode之間的對應(yīng)關(guān)系將文件名和文件的內(nèi)容及屬性連接起來。
4. 軟硬鏈接
文章來源地址http://www.zghlxwxcb.cn/news/detail-485285.html
到了這里,關(guān)于【Linux】15. 文件系統(tǒng)與軟硬鏈接的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!