b站 的網(wǎng)站 怎么做著名的營銷成功的案例
本文已收錄至《Linux知識與編程》專欄!
作者:ARMCSKGT
演示環(huán)境:CentOS 7
![]()
文件系統(tǒng)概述
- 前言
- 正文
- 文件與磁盤
- 磁盤介紹與機(jī)械硬盤
- 機(jī)械硬盤基礎(chǔ)結(jié)構(gòu)
- 機(jī)械硬盤數(shù)據(jù)存儲與管理
- 文件操作的細(xì)節(jié)
- 創(chuàng)建文件
- 訪問文件
- 刪除文件
- 恢復(fù)文件
- 其他情況
- 最后
前言
我們知道文件的存儲一般在磁盤上,操作系統(tǒng)需要管理這些文件就需要通過其文件系統(tǒng)進(jìn)行管理,高效的管理機(jī)制有利于提高我們IO的速度,本節(jié)我們將對Linux系統(tǒng)的文件系統(tǒng)進(jìn)行概述!
正文
本節(jié)理論較多,還請耐心閱讀和理解!
文件與磁盤
文件被打開后會加載到內(nèi)存,而沒有被打開的文件存儲在磁盤上!
對于磁盤文件的管理,主要為了解決快速定位,快速讀取和寫入
對于在磁盤上的文件,當(dāng)我們對文件進(jìn)行操作時,操作系統(tǒng)會通過文件的inode
編號找到文件屬性進(jìn)行文件操作,對于文件的inode編號
我們可以通過以下命令查看:ls -il
文件的inode編號就如同進(jìn)程的pid一樣,inode編號與文件一 一對應(yīng),通過文件的inode編號就可以訪問文件屬性進(jìn)而讀取文件內(nèi)容!
我們可以將磁盤對文件的管理比喻為物品寄存點
,每一個柜子有一個箱號,可以存放一個物品,存放成功后物主獲得箱號牌;待物主來取時通過箱號牌取出物品并歸還箱號牌;這就是文件的一次寫入和刪除操作!
向磁盤中寫入一個文件,存放在磁盤中,獲取一個inode編號,在刪除這個文件時歸還這個inode編號即可!
以上對文件的 “管理” 描述只是抽象概念,結(jié)合我們后面介紹的磁盤結(jié)構(gòu),才能更好的理解!
磁盤介紹與機(jī)械硬盤
在現(xiàn)代,磁盤分為兩種,即
機(jī)械硬盤
和固態(tài)硬盤
!
機(jī)械硬盤速度慢,但是便宜穩(wěn)定;固態(tài)硬盤速度快,但是價格比較貴且數(shù)據(jù)損壞率大于機(jī)械硬盤!
為了更好的介紹文件系統(tǒng),我們主要圍繞機(jī)械硬盤進(jìn)行講解!
機(jī)械硬盤基礎(chǔ)結(jié)構(gòu)
機(jī)械硬盤是我們計算機(jī)中的一個外部設(shè)備,也是計算機(jī)中唯一的機(jī)械設(shè)備,根據(jù)馮諾依曼體系,機(jī)械硬盤的速度遠(yuǎn)遠(yuǎn)低于CPU。如果要有一個數(shù)據(jù)去衡量,CPU的運行是納秒級別的話,機(jī)械硬盤則是毫秒級別!
而機(jī)械硬盤之所以這么慢,是由其內(nèi)部結(jié)構(gòu)決定的:
注意:不同磁盤中磁盤的盤片數(shù)量不一樣,但因為磁頭是通過一個磁頭臂驅(qū)動的,所以一個機(jī)械硬盤上的所有磁頭是共進(jìn)退的!機(jī)械設(shè)備的操作動作需要時間,相當(dāng)于固態(tài)硬盤中電子間的光速傳輸來說,非常慢!機(jī)械硬盤的主要結(jié)構(gòu):
- 盤片:有兩面都可以存儲數(shù)據(jù),一般是多個盤片組合成一組
- 磁頭:盤片的每一面都配有一個磁頭讀寫數(shù)據(jù)
- 主軸:帶動盤片轉(zhuǎn)動進(jìn)行尋址
- 音圈馬達(dá):控制磁頭進(jìn)退換道
- 磁頭臂:磁頭在磁頭臂的一端,通過音圈馬達(dá)的擺動,控制磁頭切換磁道
- 伺服電路板:對數(shù)據(jù)的讀寫進(jìn)行處理,控制機(jī)械硬盤的運行
- 其他 … …
關(guān)于機(jī)械硬盤的詳細(xì)結(jié)構(gòu)介紹,可閱讀:機(jī)械硬盤的內(nèi)部結(jié)構(gòu)
機(jī)械硬盤數(shù)據(jù)存儲與管理
在計算機(jī)中,數(shù)據(jù)是以二進(jìn)制存儲的,常見的可以表示二進(jìn)制的存儲方式有:高電平與低電平,波峰和波谷,南極和北極等等;而機(jī)械硬盤盤片的存儲的方式是磁極南極和北極!
讀寫數(shù)據(jù)時,距離盤面3納米
的磁頭會利用電磁鐵,改變磁盤上磁性材料的極性來記錄和刪除數(shù)據(jù),兩種極性分別對應(yīng) 0 或 1 ,磁頭移動到指定扇區(qū)位置,向扇區(qū)寫入數(shù)據(jù)
時磁極由N->S
,在扇區(qū)刪除數(shù)據(jù)
時磁極由S->N
(S為1 N為0)
磁頭和盤片的近距離操作,使得機(jī)械硬盤在運行時我們不能隨意移動,更不能發(fā)生碰撞,一旦因為外力使磁頭接觸到盤片損傷了盤片就會導(dǎo)致數(shù)據(jù)丟失!
關(guān)于機(jī)械硬盤的工作原理詳細(xì)講解:
對于一個盤片,有兩個盤面,每個盤面上又分為很多個磁道,每個磁道又分為很多個扇區(qū)!
![]()
單個扇區(qū)大小為 512 字節(jié)(或者 4 kb),這些扇區(qū)用來存儲數(shù)據(jù),同一半徑中的所有扇區(qū)組成一個扇面;而半徑相同的扇區(qū)組成磁道(柱面)!
注意:磁道上扇區(qū)的數(shù)量一般相同,因為磁道的面積會隨著向外越來越打,對于面積較小的磁道,其扇區(qū)比特位會做的相對緊密一些,面積較大的扇區(qū)則會做的稀疏一些!
未來要找一個扇區(qū):
- 先找磁頭(head):定位在哪一個盤片以及哪一個面,只需要確定哪一個磁頭(磁頭編號)就能找到哪一個面
- 再找柱面(cylinder):定位在哪一個磁道,由半徑?jīng)Q定,柱面也就是磁道
- 最后找扇區(qū)(sector):定位讀取位置在該磁道的哪一個扇區(qū),根據(jù)扇區(qū)的編號定位一個扇區(qū)
我們稱這種:先定位磁頭,再定位柱面(磁道),再定位扇區(qū)的方式,稱為CHS定位法
!
一個普通文件的屬性和數(shù)據(jù)都是數(shù)據(jù)(0/1),無非就是占用一個或多個扇區(qū)來進(jìn)行自己的數(shù)據(jù)存儲的;我們既然能夠用CHS定位任意一個扇區(qū),我們就能定位任意多個扇區(qū),從而將文件從硬件角度進(jìn)行讀寫!
通過上述,如果操作系統(tǒng)能夠得知任意一個CHS地址,就能訪問任意一個扇區(qū);但操作系統(tǒng)并非直接使用CHS地址,因為操作系統(tǒng)是軟件,磁盤是硬件,硬件是一個地址,如果操作系統(tǒng)直接使用這個地址,如果硬件參數(shù)發(fā)生了變化,操作系統(tǒng)的磁盤信息也要變化,操作系統(tǒng)要和硬件做好解耦工作,即便是扇區(qū),512字節(jié)單IO的基本數(shù)據(jù)量也是很小的,硬件是按照512字節(jié)處理,但操作系統(tǒng)實際進(jìn)行IO的基本單位是4KB進(jìn)行處理!
所以,操作系統(tǒng)的一次IO,無論讀取數(shù)據(jù)是多少,都是按照4KB進(jìn)行讀取,因此磁盤也稱塊設(shè)備!
我們將磁盤中一個盤面的所有磁道想象成磁帶被全部拉出來的樣子,那么就是一直連續(xù)的線性結(jié)構(gòu)!
操作系統(tǒng)需要有一套通用的新地址來進(jìn)行塊級別的訪問,如果將磁道比方成磁帶,那么一個磁道就可以當(dāng)成一個數(shù)組對待,數(shù)組天然有下標(biāo),此時定位一個扇區(qū),只需要一個數(shù)組下標(biāo)就可以定位一個扇區(qū),假設(shè)數(shù)組下標(biāo)為N,而其中我們的操作系統(tǒng)是以4KB為單位進(jìn)行IO的,故一個操作系統(tǒng)級別的文件塊要包括8個扇區(qū),甚至在OS角度,OS不關(guān)心扇區(qū)!
計算機(jī)常規(guī)的訪問方式是起始地址+偏移量的方式(語言/數(shù)據(jù)類型);操作系統(tǒng)只需要知道數(shù)據(jù)所在的起始地址(第一個扇區(qū)的下標(biāo)地址)+4kb(塊的類型)就能找到一個數(shù)據(jù),我們把數(shù)據(jù)塊看做一種類型!
所以塊的地址本質(zhì)就是數(shù)組的一個下標(biāo)N,以后我們表示一個塊,我們可以采用先選下標(biāo)N的方式定位任意一個塊了,我們稱這種線性地址為邏輯塊地址LBA
,這樣我們定位磁盤扇區(qū)就轉(zhuǎn)換為OS->N->LBA邏輯塊地址->CHS
;磁盤只認(rèn)CHS地址,所以LBA地址和CHS地址要相互轉(zhuǎn)換!
操作系統(tǒng)要管磁盤,就將磁盤看做一個大數(shù)組,對磁盤的管理,變成了對數(shù)組的管理,要對一個數(shù)組中的扇區(qū)進(jìn)行管理,就需
要先描述再組織
,通過struct對象封裝8個扇區(qū),存儲中數(shù)組中,在數(shù)組中每一個下標(biāo)對應(yīng)的就是一個數(shù)據(jù)塊
!
在操作系統(tǒng)中有描述一個塊的的結(jié)構(gòu)體struct block{}
硬盤比較大,為了合理的管理一般操作系統(tǒng)可以分區(qū),對于每個分區(qū)操作系統(tǒng)又會分組,這個組就是塊組!
對于分區(qū),就相對復(fù)雜一些!
我們在電腦中一般會對電腦進(jìn)行分區(qū),分區(qū)的意義在于,磁盤的空間是非常大的,如果不分區(qū),巨大的空間管理會消耗操作系統(tǒng)的資源,我們在現(xiàn)實生活中,各大學(xué)都會在學(xué)校設(shè)立不同的學(xué)院進(jìn)行高效管理,最重要的是上層管理者更好的調(diào)用管理資源,這種思想稱為分治思想!
在文件系統(tǒng)中,操作系統(tǒng)先將整個大文件系統(tǒng)分為不同的區(qū),存入struct disk
數(shù)組中進(jìn)行管理//分區(qū)屬性 struct disk {struct part[3]; //三個分區(qū) struct part是管理分區(qū)的對象類型//其他屬性... }
我們可以通過以下命令查看當(dāng)前Linux系統(tǒng)的分區(qū):
ll /dev/vda* -i
也可以通過下面的命令查看分區(qū)的信息:# 該命令相當(dāng)于Windows的 “此電腦” df -h
系統(tǒng)在分區(qū)后,需要對區(qū)塊進(jìn)行格式化,在格式化時寫入管理信息,不同的文件系統(tǒng)在格式化時寫入的數(shù)據(jù)是不同的,這里討論的是EXT
文件系統(tǒng)!對于分區(qū)
- 為了使分區(qū)能被正常使用,需要對分區(qū)進(jìn)行格式化
- 分區(qū)格式化:操作系統(tǒng)向分區(qū)寫入文件系統(tǒng)的管理屬性信息
- 磁盤分區(qū)后,分組、填寫系統(tǒng)屬性是操作系統(tǒng)做的事
當(dāng)然,分區(qū)再細(xì)分就是塊組!
由塊組
構(gòu)成的線性空間亦可稱為組線,代表一個分區(qū),而一個struct part對象管理一個分區(qū):struct part {struct part group[512]; //分為512個塊組int lba_start; //起始塊組位置(分區(qū)中第一個塊組的下標(biāo))int lba_end; //結(jié)束塊組位置(最后一個塊組下標(biāo))//其他屬性…… }
將現(xiàn)有資源再分配后,可以 最大化利用資源,避免造成浪費及拖慢效率,下面我們詳細(xì)介紹塊組!
塊組
是由分區(qū)
細(xì)分出的產(chǎn)物,塊組與分區(qū)的關(guān)系如圖所示:
關(guān)于這些分組信息的詳細(xì)介紹:
我們知道文件 = 內(nèi)容+屬性
,而Linux系統(tǒng)將文件屬性和內(nèi)容分離存儲!
用戶只認(rèn)文件名,Linux系統(tǒng)只認(rèn)inode號,文件的inode屬性中,并不存在文件名,文件名是給用戶用的,所以目錄也是文件,目錄也有inode,而目錄存儲的是文件名與inode的映射關(guān)系!
inode可以確定分組,inode編號
在一個分區(qū)內(nèi)唯一有效
,不能跨分區(qū),但一個inode是可以在整個分區(qū)有效的,所以每一個分區(qū)的inode編號有一個范圍(因為分組中的inode都有一個范圍),分組也是!
當(dāng)然,對于一些大文件,Linux系統(tǒng)不一定會直接分配塊進(jìn)行存儲,而是進(jìn)行塊索引多級存儲!
文件操作的細(xì)節(jié)
創(chuàng)建文件
簡單直接的說,就是實例化一個inode對象,就相當(dāng)于創(chuàng)建了一個文件,但是有一些細(xì)節(jié)!
當(dāng)我們增加一個文件時,操作系統(tǒng)需要:
- 首先操作系統(tǒng)在該目錄所在分組中的inode Bitmap找到一個沒有被使用的inode,在inode table中找到這個inode拿到
文件屬性和inode編號
- 將文件默認(rèn)屬性寫入inode中,一開始文件是空的所以沒有數(shù)據(jù)塊
- 在對應(yīng)目錄的存儲內(nèi)容中
追加一條文件名與inode的映射關(guān)系
,然后文件就創(chuàng)建好了未來對文件進(jìn)行寫入時,先去block Bitmap找到需要的數(shù)據(jù)塊將這些塊的bit位置為1,然后將這些數(shù)據(jù)塊的位圖信息填入文件inode的blocks數(shù)組中,再去data block中找到對應(yīng)的數(shù)據(jù)塊進(jìn)行寫入(刷新入)即可;同樣的,當(dāng)我們刪除了某些數(shù)據(jù),減小了數(shù)據(jù)塊的占用時,將該文件不用的數(shù)據(jù)塊在block Bitmap中置為0即可,表示可分配!
訪問文件
當(dāng)我們要訪問一個文件時,操作系統(tǒng)需要:
- 首先我們會在特定目錄下找到文件名(就相當(dāng)于找到了inode編號)
- 一個目錄也是一個文件,也一定隸屬于一個分區(qū),結(jié)合inode,在該分區(qū)中找到分組,在該分組的inode table中找到文件的
inode屬性
- 通過inode(的blocks數(shù)組)和data block的映射關(guān)系,找到該文件的數(shù)據(jù)塊,并加載到內(nèi)存中(被操作系統(tǒng)管理),并進(jìn)行訪問和操作
刪除文件
當(dāng)我們要刪除文件時,操作系統(tǒng)需要:
- 先通過當(dāng)前目錄下文件名找到對應(yīng)的inode編號
- 根據(jù)inode table找到文件的inode屬性,然后將inode屬性中blocks數(shù)組所占數(shù)據(jù)塊對應(yīng)的block Bitmap的bit位置為0
- 將inode Bitmap中文件inode位置的比特位設(shè)置為0,然后文件屬性就沒了,文件也就不存在了,被刪除了
所以刪文件只需要修改位圖即可,從這里可以看出,操作系統(tǒng)的刪除只是改變標(biāo)識,并沒有銷毀數(shù)據(jù)內(nèi)容,如果要徹底銷毀,則需要借助一點手段!
恢復(fù)文件
文件被誤刪不一定沒救,有可能可以恢復(fù)!
在數(shù)據(jù)被誤刪后,此時一定不要再動電腦,立刻斷電送修,還可能挽回數(shù)據(jù)!
前面說過,刪除并不是真刪除,訪問不到就行了,所以只要在刪除后,有些操作系統(tǒng)會記錄日志,日志中會保存被刪的inode編號!所以,理論上可以:
- 根據(jù)日志找到被刪文件的inode編號
- 根據(jù)inode編號找到對應(yīng)的inode,將分組中的該inode的inode Bitmap表其位置置為1
- 找到其所占用的Data block,將其占用的data block在block Bitmap置為1
其中的內(nèi)容沒有被覆蓋的,數(shù)據(jù)就可以找回來
所以,當(dāng)我們誤刪文件后,不進(jìn)行操作就可以防止被釋放的數(shù)據(jù)塊中的內(nèi)容被覆蓋!
當(dāng)然,如果我們不想這么麻煩,也可以學(xué)習(xí)Windows創(chuàng)建一個回收站!
其他情況
如果inode只是單單的用數(shù)組建立和datablock的映射關(guān)系,即只是將inode對象實例化不同的文件系統(tǒng)datablock數(shù)組大小不同存在組中inode用完了但datablock沒用完的情況,也存在inode沒用完但是datablock用完了的情況!
也就是說,存在兩種情況
- 如果我們一直只創(chuàng)建文件,但不寫入內(nèi)容,那么就會導(dǎo)致一個分組中indoe table被全部占滿,此時就會導(dǎo)致datablock數(shù)據(jù)塊沒有占用,但分組已經(jīng)無法再容納新文件了
- 如果我們創(chuàng)建幾個文件,但是文件內(nèi)容非常大,用完了這個分組的所有datablock數(shù)據(jù)塊,此時就會導(dǎo)致很多inode沒有使用,但分組空間已滿的情況
最后
文件系統(tǒng)概述到這里就基本結(jié)束了,本節(jié)我們帶領(lǐng)大家簡單的探究了Ext文件系統(tǒng)對于文件的管理方式,從硬件“機(jī)械硬盤”入手,再到文件系統(tǒng)的管理,兩者的結(jié)合,一氣呵成,相信大家了解了文件系統(tǒng)之后,才會發(fā)現(xiàn)操作系統(tǒng)對于文件的管理是多么高效和巧妙!
本次 <Linux文件系統(tǒng)概述> 就先介紹到這里啦,希望能夠盡可能幫助到大家。
如果文章中有瑕疵,還請各位大佬細(xì)心點評和留言,我將立即修補(bǔ)錯誤,謝謝!
🌟其他文章閱讀推薦🌟
Linux<重定向和緩沖區(qū)理解> -CSDN博客
Linux<文件理解和系統(tǒng)調(diào)用> -CSDN博客
Linux<進(jìn)程控制> -CSDN博客
Linux<進(jìn)程地址空間> -CSDN博客
Linux<環(huán)境變量> -CSDN博客
🌹歡迎讀者多多瀏覽多多支持!🌹