windows程序員系統(tǒng)的簡單介紹

程序員平常用什么系統(tǒng)做開發(fā)?

Windows,MacOS,BSD,Solaris以及各大版本的GNU/Linux系統(tǒng)我都在不同的情況下用過。

成都創(chuàng)新互聯(lián)公司-成都網(wǎng)站建設(shè)公司,專注成都網(wǎng)站建設(shè)、成都做網(wǎng)站、網(wǎng)站營銷推廣,域名注冊,虛擬主機,網(wǎng)站改版維護有關(guān)企業(yè)網(wǎng)站制作方案、改版、費用等問題,請聯(lián)系成都創(chuàng)新互聯(lián)公司。

只要你足夠了解系統(tǒng)知識,你可以去選擇任何你喜歡的系統(tǒng),或者根據(jù)你面向的需求學習使用任何系統(tǒng)。

回答問題:這主要是要看是做什么領(lǐng)域的程序員,或者要看程序員的個人愛好,比如:

1、做游戲開發(fā)的程序員多用Windows,因為Windows主要面對消費領(lǐng)域,特別是游戲消費領(lǐng)域,對各種圖形API也是支持最好最全的。

2、做前端的開發(fā)者比較樂于使用Mac,因為Mac的UI最適合出版和Web領(lǐng)域,Mac上有很多獨門的科技,例如字體渲染,頁面視覺效果最好。

3、做后端開發(fā)的程序員偏向于Linux。世界上大網(wǎng)站絕大部分后臺跑的都是Linux系統(tǒng),做后臺開發(fā)肯定離不開Linux。

程序員平常用什么系統(tǒng)做開發(fā)?

程序員平常做開發(fā)用的系統(tǒng)有:Windows,MacOS,BSD,Solaris以及各大版本的GNU/Linux。

windows, macOS,linux是當今主流三大操作系統(tǒng),普通用戶一般是選擇windows或macOS, linux主要是占據(jù)服務(wù)器領(lǐng)域市場。

普通用戶對于操作系統(tǒng)的選擇很簡單,經(jīng)濟實用選windows,錢多講究格調(diào)選macOS, 畢竟普通用戶切換操作系統(tǒng)的成本并不大。而程序員就不一樣了,換一個操作系統(tǒng),就意味著所有開發(fā)環(huán)境都要一并更換。而且在程序員群體中,操作系統(tǒng)有以下的鄙視鏈:macOS--linux--windows。

其實操作系統(tǒng)的比較并不是簡單粗暴的單一維度比較,用windows并不意味著low,用linux也不等同于你就是一個極客。關(guān)鍵在于你是如何使用。就好比編程語言的選擇,php是最招人黑的語言(沒有之一), 但黑php的人中有不少人寫的代碼同樣不堪入目。

不過作為一個程序員,你很有必要學會linux,如果你的程序最終是跑在線上的Linux服務(wù)器上,那么你就更應(yīng)該從現(xiàn)在開始投入linux的懷抱中,早日從windows脫坑。至于macOS,在命令行上與linux絕大部分相同,都是類unix的操作系統(tǒng)。

如何學linux?

工作中,看到不少工作好幾年的程序員,在操作linux時特別生疏,只會最基本的幾個命令:cdls mkdir 等。vim編輯器的操作更是讓人看了很著急,被譽為編輯器之神的vim在他們手中,完全沒有半點靈氣,感覺就像是編輯器之屎。

之所以會出現(xiàn)這種現(xiàn)象,很大原因在于他們的學習方式錯了,不少人都知道linux很重要,不掌握linux,基本上就只能停留在最基本的增刪改查功能上。他們學linux的方式可能是看書,也可能是看視頻,甚至有些還會去背命令,但由于他們的操作環(huán)境是windows,linux的應(yīng)用場景很少。根本沒辦法將所學的知識運用,更加感受不到linux的魅力。

學linux最好地方式,就是直接去用!直接將自己的開發(fā)環(huán)境都改成linux,一開始很蹩腳,很不適應(yīng),這很正常。如果你一直感到很舒服,只能說明你一直沒有進步。想想我們學了那么多年英語,絕大多數(shù)人還是無法掌握英語,看到英語文檔就直接自動屏蔽。其原因都是:一直在學,但從來沒在用。只學而不用,沒有半點用。

程序員必備知識(操作系統(tǒng)5-文件系統(tǒng))

本篇與之前的第三篇的內(nèi)存管理知識點有相似的地方

對于運行的進程來說,內(nèi)存就像一個紙箱子, 僅僅是一個暫存數(shù)據(jù)的地方, 而且空間有限。如果我們想要進程結(jié)束之后,數(shù)據(jù)依然能夠保存下來,就不能只保存在內(nèi)存里,而是應(yīng)該保存在 外部存儲 中。就像圖書館這種地方,不僅空間大,而且能夠永久保存。

我們最常用的外部存儲就是 硬盤 ,數(shù)據(jù)是以文件的形式保存在硬盤上的。為了管理這些文件,我們在規(guī)劃文件系統(tǒng)的時候,需要考慮到以下幾點。

第一點,文件系統(tǒng)要有嚴格的組織形式,使得文件能夠 以塊為單位進行存儲 。這就像圖書館里,我們會給設(shè)置一排排書架,然后再把書架分成一個個小格子,有的項目存放的資料非常多,一個格子放不下,就需要多個格子來進行存放。我們把這個區(qū)域稱為存放原始資料的 倉庫區(qū) 。

第二點,文件系統(tǒng)中也要有 索引區(qū) ,用來方便查找一個文件分成的多個塊都存放在了什么位置。這就好比,圖書館的書太多了,為了方便查找,我們需要專門設(shè)置一排書架,這里面會寫清楚整個檔案庫有哪些資料,資料在哪個架子的哪個格子上。這樣找資料的時候就不用跑遍整個檔案庫,在這個書架上找到后,直奔目標書架就可以了。

第三點,如果文件系統(tǒng)中有的文件是熱點文件,近期經(jīng)常被讀取和寫入,文件系統(tǒng)應(yīng)該有 緩存層 。這就相當于圖書館里面的熱門圖書區(qū),這里面的書都是暢銷書或者是常常被借還的圖書。因為借還的次數(shù)比較多,那就沒必要每次有人還了之后,還放回遙遠的貨架,我們可以專門開辟一個區(qū)域, 放置這些借還頻次高的圖書。這樣借還的效率就會提高。

第四點,文件應(yīng)該用 文件夾 的形式組織起來,方便管理和查詢。這就像在圖書館里面,你可以給這些資料分門別類,比如分成計算機類.文學類.歷史類等等。這樣你也容易管理,項目組借閱的時候只要在某個類別中去找就可以了。

在文件系統(tǒng)中,每個文件都有一個名字,這樣我們訪問一個文件,希望通過它的名字就可以找到。文件名就是一個普通的文本。 當然文件名會經(jīng)常沖突,不同用戶取相同的名字的情況還是會經(jīng)常出現(xiàn)的。

要想把很多的文件有序地組織起來,我們就需要把它們成為 目錄 或者文件夾。這樣,一個文件夾里可以包含文件夾,也可以包含文件,這樣就形成了一種 樹形結(jié)構(gòu) 。而我們可以將不同的用戶放在不同的用戶目錄下,就可以一定程度上避免了命名的沖突問題。

第五點,Linux 內(nèi)核要在自己的內(nèi)存里面維護一套數(shù)據(jù)結(jié)構(gòu),來保存哪些文件被哪些進程打開和使用 。這就好比,圖書館里會有個圖書管理系統(tǒng),記錄哪些書被借閱了,被誰借閱了,借閱了多久,什么時候歸還。

文件系統(tǒng)是操作系統(tǒng)中負責管理持久數(shù)據(jù)的子系統(tǒng),說簡單點,就是負責把用戶的文件存到磁盤硬件中,因為即使計算機斷電了,磁盤里的數(shù)據(jù)并不會丟失,所以可以持久化的保存文件。

文件系統(tǒng)的基本數(shù)據(jù)單位是 文件 ,它的目的是對磁盤上的文件進行組織管理,那組織的方式不同,就會形成不同的文件系統(tǒng)。

Linux最經(jīng)典的一句話是:“一切皆文件”,不僅普通的文件和目錄,就連塊設(shè)備、管道、socket 等,也都是統(tǒng)一交給文件系統(tǒng)管理的。

Linux文件系統(tǒng)會為每個文件分配兩個數(shù)據(jù)結(jié)構(gòu): 索引節(jié)點(index node) 和 目錄項(directory entry) ,它們主要用來記錄文件的元信息和目錄層次結(jié)構(gòu)。

●索引節(jié)點,也就是inode, 用來記錄文件的元信息,比如inode編號、文件大小訪問權(quán)限、創(chuàng)建時間、修改時間、 數(shù)據(jù)在磁盤的位置 等等。 索引節(jié)點是文件的唯一標識 ,它們之間一一對應(yīng), 也同樣都會被 存儲在硬盤 中,所以索引節(jié)點同樣占用磁盤空間。

●目錄項,也就是dentry, 用來記錄文件的名字、索引節(jié)點指針以及與其他目錄項的層級關(guān)聯(lián)關(guān)系。多個目錄項關(guān)聯(lián)起來,就會形成 目錄結(jié)構(gòu) ,但它與索引節(jié)點不同的是,目錄項是由內(nèi)核維護的一個數(shù)據(jù)結(jié)構(gòu),不存放于磁盤,而是 緩存在內(nèi)存 。

由于索引節(jié)點唯一標識一個文件,而目錄項記錄著文件的名,所以目錄項和索引節(jié)點的關(guān)系是多對一,也就是說,一個文件可以有多個別字。比如,硬鏈接的實現(xiàn)就是多個目錄項中的索引節(jié)點指向同一個文件。

注意,目錄也是文件,也是用索引節(jié)點唯一標識,和普通文件不同的是,普通文件在磁盤里面保存的是文件數(shù)據(jù),而目錄文件在磁盤里面保存子目錄或文件。

(PS:目錄項和目錄不是一個東西!你也不是一個東西(^_=), 雖然名字很相近,但目錄是個文件。持久化存儲在磁盤,而目錄項是內(nèi)核一個數(shù)據(jù)結(jié)構(gòu),緩存在內(nèi)存。

如果查詢目錄頻繁從磁盤讀,效率會很低,所以內(nèi)核會把已經(jīng)讀過的目錄用目錄項這個數(shù)據(jù)結(jié)構(gòu)緩存在內(nèi)存,下次再次讀到相同的目錄時,只需從內(nèi)存讀就可以,大大提高了 文件系統(tǒng)的效率。

目錄項這個數(shù)據(jù)結(jié)構(gòu)不只是表示目錄,也是可以表示文件的。)

磁盤讀寫的最小單位是 扇區(qū) ,扇區(qū)的大小只有512B大小,很明顯,如果每次讀寫都以這么小為單位,那這讀寫的效率會非常低。

所以,文件系統(tǒng)把多個扇區(qū)組成了一個 邏輯塊 ,每次讀寫的最小單位就是邏輯塊(數(shù)據(jù)塊) , Linux中的邏輯塊大小為4KB,也就是一次性讀寫 8個扇區(qū),這將大大提高了磁盤的讀寫的效率。

以上就是索引節(jié)點、目錄項以及文件數(shù)據(jù)的關(guān)系,下面這個圖就很好的展示了它們之間的關(guān)系:

索引節(jié)點是存儲在硬盤上的數(shù)據(jù),那么為了加速文件的訪問,通常會把索引節(jié)點加載到內(nèi)存中。

另外,磁盤進行格式化的時候,會被分成三個存儲區(qū)域,分別是超級塊、索引節(jié)點區(qū)和數(shù)據(jù)塊區(qū)。

●超級塊,用來存儲文件系統(tǒng)的詳細信息,比如塊個數(shù)、塊大小、空閑塊等等。

●索引節(jié)點區(qū),用來存儲索引節(jié)點;

●數(shù)據(jù)塊區(qū),用來存儲文件或目錄數(shù)據(jù);

我們不可能把超級塊和索引節(jié)點區(qū)全部加載到內(nèi)存,這樣內(nèi)存肯定撐不住,所以只有當需要使用的時候,才將其加載進內(nèi)存,它們加載進內(nèi)存的時機是不同的.

●超級塊:當文件系統(tǒng)掛載時進入內(nèi)存;

●索引節(jié)點區(qū):當文件被訪問時進入內(nèi)存;

文件系統(tǒng)的種類眾多,而操作系統(tǒng)希望 對用戶提供一個統(tǒng)一的接口 ,于是在用戶層與文件系統(tǒng)層引入了中間層,這個中間層就稱為 虛擬文件系統(tǒng)(Virtual File System, VFS) 。

VFS定義了一組所有文件系統(tǒng)都支持的數(shù)據(jù)結(jié)構(gòu)和標準接口,這樣程序員不需要了解文件系統(tǒng)的工作原理,只需要了解VFS提供的統(tǒng)一接口即可。

在Linux文件系統(tǒng)中,用戶空間、系統(tǒng)調(diào)用、虛擬機文件系統(tǒng)、緩存、文件系統(tǒng)以及存儲之間的關(guān)系如下圖:

Linux支持的文件系統(tǒng)也不少,根據(jù)存儲位置的不同,可以把文件系統(tǒng)分為三類:

●磁盤的文件系統(tǒng),它是直接把數(shù)據(jù)存儲在磁盤中,比如Ext 2/3/4. XFS 等都是這類文件系統(tǒng)。

●內(nèi)存的文件系統(tǒng),這類文件系統(tǒng)的數(shù)據(jù)不是存儲在硬盤的,而是占用內(nèi)存空間,我們經(jīng)常用到的/proc 和/sys文件系統(tǒng)都屬于這一類,讀寫這類文件,實際上是讀寫內(nèi)核中相關(guān)的數(shù)據(jù)。

●網(wǎng)絡(luò)的文件系統(tǒng),用來訪問其他計算機主機數(shù)據(jù)的文件系統(tǒng),比如NFS. SMB等等。

文件系統(tǒng)首先要先掛載到某個目錄才可以正常使用,比如Linux系統(tǒng)在啟動時,會把文件系統(tǒng)掛載到根目錄。

在操作系統(tǒng)的輔助之下,磁盤中的數(shù)據(jù)在計算機中都會呈現(xiàn)為易讀的形式,并且我們不需要關(guān)心數(shù)據(jù)到底是如何存放在磁盤中,存放在磁盤的哪個地方等等問題,這些全部都是由操作系統(tǒng)完成的。

那么,文件數(shù)據(jù)在磁盤中究竟是怎么樣的呢?我們來一探究竟!

磁盤中的存儲單元會被劃分為一個個的“ 塊 ”,也被稱為 扇區(qū) ,扇區(qū)的大小一般都為512byte.這說明即使一塊數(shù)據(jù)不足512byte,那么它也要占用512byte的磁盤空間。

而幾乎所有的文件系統(tǒng)都會把文件分割成固定大小的塊來存儲,通常一個塊的大小為4K。如果磁盤中的扇區(qū)為512byte,而文件系統(tǒng)的塊大小為4K,那么文件系統(tǒng)的存儲單元就為8個扇區(qū)。這也是前面提到的一個問題,文件大小和占用空間之間有什么區(qū)別?文件大小是文件實際的大小,而占用空間則是因為即使它的實際大小沒有達到那么大,但是這部分空間實際也被占用,其他文件數(shù)據(jù)無法使用這部分的空間。所以我們 寫入1byte的數(shù)據(jù)到文本中,但是它占用的空間也會是4K。

這里要注意在Windows下的NTFS文件系統(tǒng)中,如果一開始文件數(shù)據(jù)小于 1K,那么則不會分配磁盤塊來存儲,而是存在一個文件表中。但是一旦文件數(shù)據(jù)大于1K,那么不管以后文件的大小,都會分配以4K為單位的磁盤空間來存儲。

與內(nèi)存管理一樣,為了方便對磁盤的管理,文件的邏輯地址也被分為一個個的文件塊。于是文件的邏輯地址就是(邏輯塊號,塊內(nèi)地址)。用戶通過邏輯地址來操作文件,操作系統(tǒng)負責完成邏輯地址與物理地址的映射。

不同的文件系統(tǒng)為文件分配磁盤空間會有不同的方式,這些方式各自都有優(yōu)缺點。

連續(xù)分配要求每個文件在磁盤上有一組連續(xù)的塊,該分配方式較為簡單。

通過上圖可以看到,文件的邏輯塊號的順序是與物理塊號相同的,這樣就可以實現(xiàn)隨機存取了,只要知道了第一個邏輯塊的物理地址, 那么就可以快速訪問到其他邏輯塊的物理地址。那么操作系統(tǒng)如何完成邏輯塊與物理塊之間的映射呢?實際上,文件都是存放在目錄下的,而目錄是一種有結(jié)構(gòu)文件, 所以在文件目錄的記錄中會存放目錄下所有文件的信息,每一個文件或者目錄都是一個記錄。 而這些信息就包括文件的起始塊號和占有塊號的數(shù)量。

那么操作系統(tǒng)如何完成邏輯塊與物理塊之間的映射呢? (邏輯塊號, 塊內(nèi)地址) - (物理塊號, 塊內(nèi)地址),只需要知道邏輯塊號對應(yīng)的物理塊號即可,塊內(nèi)地址不變。

用戶訪問一個文件的內(nèi)容,操作系統(tǒng)通過文件的標識符找到目錄項FCB, 物理塊號=起始塊號+邏輯塊號。 當然,還需要檢查邏輯塊號是否合法,是否超過長度等。因為可以根據(jù)邏輯塊號直接算出物理塊號,所以連續(xù)分配支持 順序訪問和隨機訪問 。

因為讀/寫文件是需要移動磁頭的,如果訪問兩個相隔很遠的磁盤塊,移動磁頭的時間就會變長。使用連續(xù)分配來作為文件的分配方式,會使文件的磁盤塊相鄰,所以文件的讀/寫速度最快。

連續(xù)空間存放的方式雖然讀寫效率高,但是有 磁盤空間碎片 和 文件長度不易擴展 的缺陷。

如下圖,如果文件B被刪除,磁盤上就留下一塊空缺,這時,如果新來的文件小于其中的一個空缺,我們就可以將其放在相應(yīng)空缺里。但如果該文件的大小大于所

有的空缺,但卻小于空缺大小之和,則雖然磁盤上有足夠的空缺,但該文件還是不能存放。當然了,我們可以通過將現(xiàn)有文件進行挪動來騰出空間以容納新的文件,但是這個在磁盤挪動文件是非常耗時,所以這種方式不太現(xiàn)實。

另外一個缺陷是文件長度擴展不方便,例如上圖中的文件A要想擴大一下,需要更多的磁盤空間,唯一的辦法就只能是挪動的方式,前面也說了,這種方式效率是非常低的。

那么有沒有更好的方式來解決上面的問題呢?答案當然有,既然連續(xù)空間存放的方式不太行,那么我們就改變存放的方式,使用非連續(xù)空間存放方式來解決這些缺陷。

非連續(xù)空間存放方式分為 鏈表方式 和 索引方式 。

鏈式分配采取離散分配的方式,可以為文件分配離散的磁盤塊。它有兩種分配方式:顯示鏈接和隱式鏈接。

隱式鏈接是只目錄項中只會記錄文件所占磁盤塊中的第一塊的地址和最后一塊磁盤塊的地址, 然后通過在每一個磁盤塊中存放一個指向下一 磁盤塊的指針, 從而可以根據(jù)指針找到下一塊磁盤塊。如果需要分配新的磁盤塊,則使用最后一塊磁盤塊中的指針指向新的磁盤塊,然后修改新的磁盤塊為最后的磁盤塊。

我們來思考一個問題, 采用隱式鏈接如何將實現(xiàn)邏輯塊號轉(zhuǎn)換為物理塊號呢?

用戶給出需要訪問的邏輯塊號i,操作系統(tǒng)需要找到所需訪問文件的目錄項FCB.從目錄項中可以知道文件的起始塊號,然后將邏輯塊號0的數(shù)據(jù)讀入內(nèi)存,由此知道1號邏輯塊的物理塊號,然后再讀入1號邏輯塊的數(shù)據(jù)進內(nèi)存,此次類推,最終可以找到用戶所需訪問的邏輯塊號i。訪問邏輯塊號i,總共需要i+ 1次磁盤1/0操作。

得出結(jié)論: 隱式鏈接分配只能順序訪問,不支持隨機訪問,查找效率低 。

我們來思考另外一個問題,采用隱式鏈接是否方便文件拓展?

我們知道目錄項中存有結(jié)束塊號的物理地址,所以我們?nèi)绻卣刮募?,只需要將新分配的磁盤塊掛載到結(jié)束塊號的后面即可,修改結(jié)束塊號的指針指向新分配的磁盤塊,然后修改目錄項。

得出結(jié)論: 隱式鏈接分配很方便文件拓展。所有空閑磁盤塊都可以被利用到,無碎片問題,存儲利用率高。

顯示鏈接是把用于鏈接各個物理塊的指針顯式地存放在一張表中,該表稱為文件分配表(FAT, File Allocation Table)。

由于查找記錄的過程是在內(nèi)存中進行的,因而不僅顯著地 提高了檢索速度 ,而且 大大減少了訪問磁盤的次數(shù) 。但也正是整個表都存放在內(nèi)存中的關(guān)系,它的主要的缺點是 不適 用于大磁盤 。

比如,對于200GB的磁盤和1KB大小的塊,這張表需要有2億項,每一項對應(yīng)于這2億個磁盤塊中的一個塊,每項如果需要4個字節(jié),那這張表要占用800MB內(nèi)存,很顯然FAT方案對于大磁盤而言不太合適。

一直都在,加油!(*゜Д゜)σ凸←自爆按鈕

鏈表的方式解決了連續(xù)分配的磁盤碎片和文件動態(tài)打展的問題,但是不能有效支持直接訪問(FAT除外) ,索引的方式可以解決這個問題。

索引的實現(xiàn)是為每個文件創(chuàng)建一個 索引數(shù)據(jù)塊 ,里面存放的 是指向文件數(shù)據(jù)塊的指針列表 ,說白了就像書的目錄一樣,要找哪個章節(jié)的內(nèi)容,看目錄查就可以。

另外, 文件頭需要包含指向索引數(shù)據(jù)塊的指針 ,這樣就可以通過文件頭知道索引數(shù)據(jù)塊的位置,再通過索弓|數(shù)據(jù)塊里的索引信息找到對應(yīng)的數(shù)據(jù)塊。

創(chuàng)建文件時,索引塊的所有指針都設(shè)為空。當首次寫入第i塊時,先從空閑空間中取得一個塊, 再將其地址寫到索引塊的第i個條目。

索引的方式優(yōu)點在于:

●文件的創(chuàng)建、增大、縮小很方便;

●不會有碎片的問題;

●支持順序讀寫和隨機讀寫;

由于索引數(shù)據(jù)也是存放在磁盤塊的,如果文件很小,明明只需一塊就可以存放的下,但還是需要額外分配一塊來存放索引數(shù)據(jù),所以缺陷之一就是存儲索引帶來的開銷。

如果文件很大,大到一個索引數(shù)據(jù)塊放不下索引信息,這時又要如何處理大文件的存放呢?我們可以通過組合的方式,來處理大文件的存儲。

先來看看 鏈表+索引 的組合,這種組合稱為 鏈式索引塊 ,它的實現(xiàn)方式是在 索引數(shù)據(jù)塊留出一個存放下一個索引數(shù)據(jù)塊的指針 ,于是當一個索引數(shù)據(jù)塊的索引信息用完了,就可以通過指針的方式,找到下一個索引數(shù)據(jù)塊的信息。那這種方式也會出現(xiàn)前面提到的鏈表方式的問題,萬一某個指針損壞了,后面的數(shù)據(jù)也就會無法讀取了。

還有另外一種組合方式是 索引+索引 的方式,這種組合稱為多級索引塊,實現(xiàn)方式是通過一個索引塊來存放多個索引數(shù)據(jù)塊,一層套一層索引, 像極了俄羅斯套娃是吧?乛?乛??

前面說到的文件的存儲是針對已經(jīng)被占用的數(shù)據(jù)塊組織和管理,接下來的問題是,如果我要保存一個數(shù)據(jù)塊, 我應(yīng)該放在硬盤上的哪個位置呢?難道需要將所有的塊掃描一遍,找個空的地方隨便放嗎?

那這種方式效率就太低了,所以針對磁盤的空閑空間也是要引入管理的機制,接下來介紹幾種常見的方法:

●空閑表法

●空閑鏈表法

●位圖法

空閑表法

空閑表法就是為所有空閑空間建立一張表,表內(nèi)容包括空閑區(qū)的第一個塊號和該空閑區(qū)的塊個數(shù),注意,這個方式是連續(xù)分配的。如下圖:

當請求分配磁盤空間時,系統(tǒng)依次掃描空閑表里的內(nèi)容,直到找到一個合適的空閑區(qū)域為止。當用戶撤銷一個文件時,系統(tǒng)回收文件空間。這時,也需順序掃描空閑表,尋找一個空閑表條目并將釋放空間的第一個物理塊號及它占用的塊數(shù)填到這個條目中。

這種方法僅當有少量的空閑區(qū)時才有較好的效果。因為,如果存儲空間中有著大量的小的空閑區(qū),則空閑表變得很大,這樣查詢效率會很低。另外,這種分配技術(shù)適用于建立連續(xù)文件。

空閑鏈表法

我們也可以使用鏈表的方式來管理空閑空間,每一個空閑塊里有一個指針指向下一個空閑塊,這樣也能很方便的找到空閑塊并管理起來。如下圖:

當創(chuàng)建文件需要一塊或幾塊時,就從鏈頭上依次取下一塊或幾塊。反之,當回收空間時,把這些空閑塊依次接到鏈頭上。

這種技術(shù)只要在主存中保存一個指針, 令它指向第一個空閑塊。其特點是簡單,但不能隨機訪問,工作效率低,因為每當在鏈上增加或移動空閑塊時需要做很多1/0操作,同時數(shù)據(jù)塊的指針消耗了一定的存儲空間。

空閑表法和空閑鏈表法都不適合用于大型文件系統(tǒng),因為這會使空閑表或空閑鏈表太大。

位圖法

位圖是利用二進制的一位來表示磁盤中一個盤塊的使用情況,磁盤上所有的盤塊都有一個二進制位與之對應(yīng)。

當值為0時,表示對應(yīng)的盤塊空閑,值為1時,表示對應(yīng)的盤塊已分配。它形式如下:

在Linux文件系統(tǒng)就采用了位圖的方式來管理空閑空間,不僅用于數(shù)據(jù)空閑塊的管理,還用于inode空閑塊的管理,因為inode也是存儲在磁盤的,自然也要有對其管理。

前面提到Linux是用位圖的方式管理空閑空間,用戶在創(chuàng)建一個新文件時, Linux 內(nèi)核會通過inode的位圖找到空閑可用的inode,并進行分配。要存儲數(shù)據(jù)時,會通過塊的位圖找到空閑的塊,并分配,但仔細計算一下還是有問題的。

數(shù)據(jù)塊的位圖是放在磁盤塊里的,假設(shè)是放在一個塊里,一個塊4K,每位表示一個數(shù)據(jù)塊,共可以表示4 * 1024 * 8 = 2^15個空閑塊,由于1個數(shù)據(jù)塊是4K大小,那么最大可以表示的空間為2^15 * 4 * 1024 = 2^27個byte,也就是128M。

也就是說按照上面的結(jié)構(gòu),如果采用(一個塊的位圖+?一系列的塊),外加一(個塊的inode的位圖+一系列的inode)的結(jié)構(gòu)能表示的最大空間也就128M,

這太少了,現(xiàn)在很多文件都比這個大。

在Linux文件系統(tǒng),把這個結(jié)構(gòu)稱為一個 塊組 ,那么有N多的塊組,就能夠表示N大的文件。

最終,整個文件系統(tǒng)格式就是下面這個樣子。

最前面的第一個塊是引導(dǎo)塊,在系統(tǒng)啟動時用于啟用引導(dǎo),接著后面就是一個一個連續(xù)的塊組了,塊組的內(nèi)容如下:

● 超級塊 ,包含的是文件系統(tǒng)的重要信息,比如inode總個數(shù)、塊總個數(shù)、每個塊組的inode個數(shù)、每個塊組的塊個數(shù)等等。

● 塊組描述符 ,包含文件系統(tǒng)中各個塊組的狀態(tài),比如塊組中空閑塊和inode的數(shù)目等,每個塊組都包含了文件系統(tǒng)中「所有塊組的組描述符信息」。

● 數(shù)據(jù)位圖和inode位圖 ,用于表示對應(yīng)的數(shù)據(jù)塊或inode是空閑的,還是被使用中。

● inode 列表 ,包含了塊組中所有的inode, inode 用于保存文件系統(tǒng)中與各個文件和目錄相關(guān)的所有元數(shù)據(jù)。

● 數(shù)據(jù)塊 ,包含文件的有用數(shù)據(jù)。

你可以會發(fā)現(xiàn)每個塊組里有很多重復(fù)的信息,比如 超級塊和塊組描述符表,這兩個都是全局信息,而且非常的重要 ,這么做是有兩個原因:

●如果系統(tǒng)崩潰破壞了超級塊或塊組描述符,有關(guān)文件系統(tǒng)結(jié)構(gòu)和內(nèi)容的所有信息都會丟失。如果有冗余的副本,該信息是可能恢復(fù)的。

●通過使文件和管理數(shù)據(jù)盡可能接近,減少了磁頭尋道和旋轉(zhuǎn),這可以提高文件系統(tǒng)的性能。

不過,Ext2 的后續(xù)版本采用了稀疏技術(shù)。該做法是,超級塊和塊組描述符表不再存儲到文件系統(tǒng)的每個塊組中,而是只寫入到塊組0、塊組1和其他ID可以表示為3、5、7的冪的塊組中。

在前面,我們知道了一個普通文件是如何存儲的,但還有一個特殊的文件,經(jīng)常用到的目錄,它是如何保存的呢?

基于Linux?一切切皆文件的設(shè)計思想,目錄其實也是個文件,你甚至可以通過vim打開它,它也有inode, inode 里面也是指向一些塊。

和普通文件不同的是, 普通文件的塊里面保存的是文件數(shù)據(jù),而目錄文件的塊里面保存的是目錄里面一項一項的文件信息 。

在目錄文件的塊中,最簡單的保存格式就是 列表 ,就是一項一項地將目錄下的文件信息(如文件名、文件inode.文件類型等)列在表里。

列表中每一項就代表該目錄下的文件的文件名和對應(yīng)的inode,通過這個inode,就可以找到真正的文件。

通常,第一項是「則」,表示當前目錄,第二項是.,表示上一級目錄, 接下來就是一項一項的文件名和inode。

如果一個目錄有超級多的文件,我們要想在這個目錄下找文件,按照列表一項一項的找,效率就不高了。

于是,保存目錄的格式改成 哈希表 ,對文件名進行哈希計算,把哈希值保存起來,如果我們要查找一個目錄下面的文件名,可以通過名稱取哈希。如果哈希能夠匹配上,就說明這個文件的信息在相應(yīng)的塊里面。

Linux系統(tǒng)的ext文件系統(tǒng)就是采用了哈希表,來保存目錄的內(nèi)容,這種方法的優(yōu)點是查找非常迅速,插入和刪除也較簡單,不過需要一些預(yù)備措施來避免哈希沖突。

目錄查詢是通過在磁盤上反復(fù)搜索完成,需要不斷地進行/0操作,開銷較大。所以,為了減少/0操作,把當前使用的文件目錄緩存在內(nèi)存,以后要使用該文件時只要在內(nèi)存中操作,從而降低了磁盤操作次數(shù),提高了文件系統(tǒng)的訪問速度。

感謝您的閱讀,希望您能攝取到知識!加油!沖沖沖?。òl(fā)現(xiàn)光,追隨光,成為光,散發(fā)光!)我是程序員耶耶!有緣再見。-biubiu-?(`ω′∩)

windows環(huán)境下的程序員用什么操作系統(tǒng)?

你是哪類程序員?用的哪種語言?如果是跟網(wǎng)絡(luò)有關(guān)可以選擇SERVER 2003較容易上手。如果是普通軟件程序用XP就可以。

文章標題:windows程序員系統(tǒng)的簡單介紹
分享網(wǎng)址:http://muchs.cn/article16/hjdigg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、定制開發(fā)、網(wǎng)站內(nèi)鏈、電子商務(wù)、關(guān)鍵詞優(yōu)化、域名注冊

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護公司