我想買個空間自己做網(wǎng)站steam交易鏈接在哪看
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??作者主頁:? ? ?作者主頁
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 本篇博客專欄:Linux
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??創(chuàng)作時間 :2024年10月17日
一、磁盤的物理結構
磁盤的物理結構如圖所示:
其中具體的物理存儲結構如下:
磁盤中存儲的基本單位為扇區(qū),一個扇區(qū)的大小一般為512字節(jié)或者4kb,這里我們暫且認為是512字節(jié)。一般的磁盤,一個扇區(qū)都是512字節(jié),同半徑所有的扇區(qū)構成了一圈磁道。????????
所以我們要讀取指定文件數(shù)據(jù)的時候,要首先根據(jù)確定是哪一個盤面,其次再去確定是哪一個磁道,最后根據(jù)扇區(qū)的編號去定位扇區(qū)即可。其中通過磁頭、柱面(磁道)、扇區(qū)確來定位扇區(qū)的方法叫做CHS定位法。
?一個普通文件包括屬性 + 內(nèi)容,本質上都是數(shù)據(jù),占據(jù)一個或多個扇區(qū),我們既然能夠用?CHS?定位任意一個扇區(qū),就能定位任意多個扇區(qū),從而將文件從硬件角度讀取或者寫入。
二、磁盤邏輯抽象
我們已經(jīng)知道如果OS可以得知CHS的地址,就能夠訪問任意一個扇區(qū)。但是由于OS是軟件,磁盤是硬件,為了防止硬件發(fā)生迭代變化OS也要跟著變化,就要做好OS與硬件的解耦工作,因此OS內(nèi)部使用的不是CHS的地址。
為了減少進行IO操作的頻率,OS與外設進行IO操作的基本單位大小是4KB(可以調(diào)整)。就算只需要修改一個字節(jié)的數(shù)據(jù),也需要把這個數(shù)據(jù)所在的4KB大小的數(shù)據(jù)都加載進內(nèi)存,修改好后再統(tǒng)一寫回磁盤,因此我們把磁盤稱為塊設備。OS需要有一套新的地址來進行塊級別的訪問。
?把磁盤磁道看作一個連續(xù)的空間結構:
扇區(qū)就相當于連續(xù)的數(shù)組,此時定位一個扇區(qū)就只需要一個數(shù)組下標了。由于OS是以4KB為單位進行IO的,所以一個OS級別的文件塊要包括8個扇區(qū)。OS不關心扇區(qū)的概念,計算機常規(guī)的訪問地址是通過 起始地址 + 偏移量 的方式進行的,因此OS訪問數(shù)據(jù)塊時,只需要知道數(shù)據(jù)塊的起始地址 + 4KB 就可以了,把數(shù)據(jù)塊看作一種類型。
?所以塊的地址本質就是數(shù)組的一個下標N,以后就可以采用下標N的方式定位任意一個塊了。這種尋址方式被稱為 LBA ,即邏輯塊地址。
?獲得 LBA 地址后,通過簡單的數(shù)學計算就可以轉換成磁盤的 CHS 地址。假如已知 LBA = 6500 ,磁盤一個磁面的大小為 5000 ,一個磁道的大小為 1000 。則其對應的地址是第 2 個磁面,第 6 個磁道,第 500 個扇區(qū)。
從此之后,對于磁盤的管理就被抽象成了對一個大數(shù)組的管理。
三、文件系統(tǒng)
由于磁盤很大,為了更加方便的管理,OS對磁盤塊進行了分區(qū)。分區(qū)后再對每一個磁盤區(qū)域進行分組。具體結構如下:
在OS對磁盤進行分區(qū)時,會在最開始的位置設置一個 Boot Block ,這段區(qū)域里面主要保存與OS相關的內(nèi)容,比如分區(qū)表、鏡像地址等等。一般而言這個分區(qū)存在于 0 號盤面的 0 號磁道的 1 號扇區(qū)。當用戶開機時,OS會加載磁盤的驅動,讀取磁盤的分區(qū)表,再從特定分區(qū)的開始位置讀取到OS所在的地址,并加載OS,此時OS才算真正運行起來。
?在之后是OS對每一個分區(qū)進行分組形成的諸多?Block group,即塊組?。 每一個?Block group?都有上圖所示的?6?塊區(qū)域。
1、Super Block
Super Block保存的是文件系統(tǒng)的所有的屬性信息,包括文件系統(tǒng)的類型、整個分組的情況。記錄的信息主要有:block和inode的總量,未使用的block和inode的數(shù)量,一個block和inode的大小,最近一次掛載的時間,最后一次寫入數(shù)據(jù)的時間,最近一次寫入磁盤的時間等其他文件系統(tǒng)的相關信息。
2、Group Descriptor Table
GDT?為組描述符,保存該組內(nèi)的詳細統(tǒng)計等屬性信息。比如本組內(nèi)從哪里到哪里是哪部分內(nèi)容,本組被使用了多少等等。
3、inode Table
一般而言,我們把文件內(nèi)部所有屬性的集合叫做inode節(jié)點,一般大小為128字節(jié)。一個文件會有一個inode,一個分組內(nèi)會有大量的文件,也有大量的inode節(jié)點,所以在組內(nèi)會有一個專門的區(qū)域來保護這些inode節(jié)點,這個區(qū)域就叫做inode Table,也叫 inode 表。
在分組內(nèi)部,每個inode表都有自己的inode編號,inode編號本身也屬于對應文件的屬性,Linux查找一個文件的時候,也是通過inode編號來查找的。
一個inode對應一個文件,該文件的inode屬性和該文件對應的數(shù)據(jù)塊是有映射關系的。
4、Data Blocks
?文件的內(nèi)容是變化的,用數(shù)據(jù)塊來進行保存。所以要保存一個有效文件的內(nèi)容,就需要?n?個數(shù)據(jù)塊。如果有多個文件就需要多個數(shù)據(jù)塊。這些數(shù)據(jù)塊所在的區(qū)域就是?Data Blocks?。一個數(shù)據(jù)塊的默認大小是?4KB?。
Linux查找一個文件,首先找到該文件的inode。在inode結構體內(nèi)部有一個?int blocks[NUM]?數(shù)組,數(shù)組內(nèi)記錄了存儲該文件內(nèi)容的數(shù)據(jù)塊的地址。一個分組中,百分之95以上的內(nèi)容都是?Data Blocks?。
?當操作系統(tǒng)要加載一個文件時,只加載該文件的?inode?節(jié)點。而?inode?節(jié)點中包含該文件內(nèi)容數(shù)據(jù)塊的映射關系,想要訪問哪部分內(nèi)容,就根據(jù)映射關系把哪一部分內(nèi)容加載到內(nèi)存中。
5、inode Bitmap
inode Bitmap?是一個位圖結構,每個bit表示一個?inode?是否空閑可用。
6、Block Bitmap
?Block Bitmap?是一個位圖結構,記錄著?Data Block?中哪個數(shù)據(jù)塊已經(jīng)被占用,哪個數(shù)據(jù)塊沒
有被占用。
四、Linux下文件系統(tǒng)
在Linux中,使用?ls?指定加上?-i?命令選項,就可以觀察到文件的?inode?:
1、inode與文件名
Linux系統(tǒng)只認inode值,且inode屬性中不會包含文件名,因為文件名只是提供給用戶看的
任何一個文件一定存在于目錄中,目錄其實也是一個文件,也有自己的inode值和對應的數(shù)據(jù)塊,目錄的數(shù)據(jù)庫塊里保存的是該目錄的文件名和inode值對應的映射關系,而且在目錄內(nèi),文件名與inode編號互為key值
?inode number?在一個分區(qū)內(nèi)唯一有效,不能跨分區(qū)使用。根據(jù)?inode number?可以確定該文件在當前分區(qū)的哪一個分組。
2、文件的增刪查改
2.1、查看文件內(nèi)容
?當用戶訪問一個目標文件的內(nèi)容時,一定是在特定目錄下訪問的,具體流程如下:
- 先要在當前目錄下找到目標文件的 inode number 。
- 一個目錄也是文件,也隸屬于一個分區(qū),在該分區(qū)中通過目標文件的 inode number 找到分組,在該組的 inode Table 區(qū)域找到目標文件的 inode 。
- 通過目標文件的 inode 與對應 Data blocks 的映射關系,找到該文件的數(shù)據(jù)塊,加載到OS,最后顯示在顯示器上。
2.2、刪除文件
當用戶刪除一個目標文件時,具體流程如下:
- 在當前目錄下,根據(jù)文件名找到目標文件的 inode number 。
- 根據(jù) inode number 找到目標文件的 inode ,結合與對應 Data blocks 的映射關系,把 block bitmap 對應的比特位設置為 0 。
- 根據(jù) inode number 把 inode bitmap 對應的比特位設置為 0 。
2.3、創(chuàng)建文件
當用戶創(chuàng)建一個目標文件時,一定是在一個目錄下創(chuàng)建的。具體流程如下:
- OS在目錄所處的分組里掃描 inode bitmap ,找到空余的位置并設置為 1 ,獲得 inode number 。
- 把該文件創(chuàng)建出來后的默認屬性填充到對應的 inode 中。
- 在當前所處的目錄文件的 Data blocks 里追加一條新的文件名與 inode number 的映射關系。
2.4、補充內(nèi)容
?上面的內(nèi)容包括分區(qū)、分組、填寫系統(tǒng)屬性等等,這些工作都是OS做的。分區(qū)完成之后,為了讓分區(qū)能夠正常使用,需要對分區(qū)做格式化操作,即OS向分區(qū)寫入文件系統(tǒng)的管理屬性信息,并做區(qū)域劃分工作。如果區(qū)域劃分之前已經(jīng)做好了,那么格式化操作把位圖結構清空,把屬性字段設置為初始狀態(tài)就可以了。
?文件系統(tǒng)給 inode 與 Data blocks 建立映射關系通過數(shù)組來完成,由于 Data blocks 很大,為了能夠映射的過來,數(shù)組采用了直接索引、二級索引、三級索引的方式來完成映射,因為不是重點內(nèi)容,僅作了解,不作講解。
?文件系統(tǒng)中,有可能出現(xiàn) inode 沒用完,Data blocks 用完了。或者 inode 用完了,但是 Data blocks 還有剩余的情況。比如只建立一個文件,然后不斷地往這一個文件中塞入數(shù)據(jù),消耗 Data blocks?;蛘卟粩嗟亟⒖瘴募?#xff0c;消耗 inode 。這種問題目前是沒有辦法解決避免的。
五、軟硬鏈接
1、軟鏈接
建立軟鏈接指令:ln -s [目標文件] [軟鏈接文件名稱]
使用 code-soft 鏈接了code。code-soft 是一個鏈接文件。
?觀察到 code-soft 與 code.c的 inode number 不同,這說明軟鏈接是一個獨立的鏈接文件。有自己的 inode number,必有自己的inode屬性和內(nèi)容。軟鏈接的內(nèi)容是自己所指向的文件的路徑。可以讓用戶快速的找到目標文件。
?軟鏈接的具體用法是:如果一個目標文件的路徑非常深,我們每次訪問目標文件都要寫一遍很長的路徑,效率不高。此時就可以使用軟鏈接在工作目錄制作一個軟鏈接文件,以方便訪問目標文件。類似 Windows 系統(tǒng)中的快捷方式。
2、硬鏈接
建立硬鏈接指令:ln [目標文件] [軟鏈接文件名稱]
?具體操作如下:
?使用 code-hard 鏈接了code.c。 code-hard 是一個普通文件。
?觀察到 code-hard 與code.c的 inode number 相同,這說明硬鏈接與原文件是同一個文件,硬鏈接只是建立了新的文件名與老的inode number的映射關系,只修改了當前目錄的內(nèi)容。
? code-hard 與 code.c 的硬鏈接數(shù)都變成了 2 。意思是此時有兩種方法可以找到該文件,分別對應兩個文件名。硬鏈接數(shù),本質是一種引用計數(shù)。
現(xiàn)在我們使用指令?unlink?來刪除硬鏈接:
?此時文件的硬鏈接數(shù)又變成了 1?
接下來我們再創(chuàng)建一個目錄文件,觀察硬鏈接數(shù):
可以看到目錄文件的默認硬連接數(shù)是 2 。這是因為目錄文件天生擁有兩個硬鏈接,一個是它本身的名字,另一個是在該目錄內(nèi)部的 " . " 符號。如果目錄文件的內(nèi)部還有目錄文件,那么該目錄文件的硬鏈接數(shù)就變成了 3 :本身的名字、該目錄內(nèi)部的 " . " 符號、該目錄內(nèi)部的目錄內(nèi)的 " .. " 符號:
Linux中不允許對目錄進行硬鏈接
3、為什么要有硬鏈接
一、文件備份與冗余
- 提供額外的文件訪問路徑:創(chuàng)建硬鏈接后,多個文件名可以指向同一個文件的 inode(索引節(jié)點)。這意味著可以通過不同的路徑名來訪問同一個文件內(nèi)容。如果一個路徑名被意外刪除或損壞,仍然可以通過其他硬鏈接路徑訪問文件,起到了一種備份的作用。
- 增加文件的可靠性:在一些關鍵應用場景中,通過創(chuàng)建硬鏈接可以確保文件在多個位置都能被訪問,降低了因單個文件名丟失或損壞而導致數(shù)據(jù)丟失的風險。
二、文件管理與組織
- 方便文件共享:多個用戶或程序可以通過不同的硬鏈接路徑同時訪問同一個文件,無需復制文件內(nèi)容,節(jié)省了磁盤空間和時間。例如,在一個團隊項目中,不同的成員可以通過各自的工作目錄中的硬鏈接來訪問共享的文件,實現(xiàn)文件的協(xié)同操作。
- 簡化文件結構:可以使用硬鏈接來組織文件系統(tǒng),使得相關的文件可以通過多個路徑進行訪問。這對于一些復雜的文件系統(tǒng)結構或需要靈活訪問文件的情況非常有用。
三、與傳統(tǒng)文件系統(tǒng)的兼容性
- 與舊有系統(tǒng)和工具的兼容性:許多傳統(tǒng)的文件系統(tǒng)工具和應用程序都能夠理解和處理硬鏈接。這使得在從舊系統(tǒng)遷移到 Linux 或在不同的文件系統(tǒng)環(huán)境中工作時,能夠繼續(xù)使用熟悉的文件管理方式。
- 穩(wěn)定性和可靠性:硬鏈接的實現(xiàn)基于文件系統(tǒng)的底層結構,相對穩(wěn)定可靠。不像某些高級文件系統(tǒng)特性可能會在不同的操作系統(tǒng)版本或文件系統(tǒng)實現(xiàn)中存在差異,硬鏈接在大多數(shù)情況下都能提供一致的行為。
六、動靜態(tài)庫
動靜態(tài)庫的本質就是可執(zhí)行程序的"半成品"。
一段代碼生成一個可執(zhí)行程序需要以下的四個步驟:
- 預處理:完成頭文件的展開,去掉注釋,宏替換,條件編譯等,最終形成xx.i文件
- 編譯:完成語法分析,詞法分析,語義分析,符號匯總,檢查無誤后將代碼編譯成匯編指令,最終形成xx.s文件
- 匯編:將匯編指令轉換成二進制文件,xx.o文件
- 鏈接:將生成的各個.o文件進行鏈接,最終形成可執(zhí)行程序
詳細內(nèi)容在下一篇文章中……
最后:
十分感謝你可以耐著性子把它讀完和我可以堅持寫到這里,送幾句話,對你,也對我:
1.一個冷知識:
屏蔽力是一個人最頂級的能力,任何消耗你的人和事,多看一眼都是你的不對。
2.你不用變得很外向,內(nèi)向挺好的,但需要你發(fā)言的時候,一定要勇敢。
正所謂:君子可內(nèi)斂不可懦弱,面不公可起而論之。
3.成年人的世界,只篩選,不教育。
4.自律不是6點起床,7點準時學習,而是不管別人怎么說怎么看,你也會堅持去做,絕不打亂自己的節(jié)奏,是一種自我的恒心。
5.你開始炫耀自己,往往都是災難的開始,就像老子在《道德經(jīng)》里寫到:光而不耀,靜水流深。
最后如果覺得我寫的還不錯,請不要忘記點贊?,收藏?,加關注?哦(。・ω・。)
愿我們一起加油,奔向更美好的未來,愿我們從懵懵懂懂的一枚菜鳥逐漸成為大佬。加油,為自己點贊!