1. 程式人生 > >IO-3、檔案分配塊的三種方式

IO-3、檔案分配塊的三種方式

計算機的記憶體大小有限,而且屬於易失性(就是拔掉電源或者關機,所儲存的資料就消失了)的儲存介質,所以許多檔案是存放在磁碟上,對磁碟的訪問屬於I/O操作,磁碟的訪問速率就對計算機的效能有舉足輕重的影響。在此我只淺談檔案的儲存分配方式以及訪問策略,對硬體的訪問速率不做討論。(磁碟儲存的基本單位是塊)

1、 連續分配:

連續分配就是在磁碟上分配一組連續的塊來儲存一個檔案,磁碟每個塊都有一個地址,且按照線性排列。那麼計算機儲存檔案就只需要儲存檔名、檔案首地址、檔案長度。具體示例如下圖:

圖1:連續分配

這樣的分配方式的優點就在於:1、訪問容易;2、由於檔案系統會記住上一次訪問的地址,所以該方式支援直接訪問和順序訪問。

缺點在於:

1)、新檔案分配和拓展問題:當檔案被建立的時候,我們需要按照檔案的大小分配空間,但是在檔案的使用過程中,檔案可能會變大,也可能會被刪除。

如果檔案緊貼著彼此,就很難進行拓展;一種解決方式是:當空間不夠的時候,在最後一塊加一個拓展指標,指向另一空塊進行拓展,以此類推。

如果我們給每個檔案分配一定的可拓展的空間,但是當用戶不再拓展一些檔案的時候,就會造成空間的浪費。

2)、外部碎片(整個塊沒法使用)問題:在不斷的增加和刪除檔案過程中,會造成一些集中的小塊(比如圖中的18、19塊)沒法用,它們周圍的檔案不擴充套件,也沒有這麼小的檔案可以儲存到其中,就會造成浪費。一種解決方案是定期合併這些小的碎片,通過移動其他檔案塊的位置使這些小碎片集中成一個大塊,供以後使用。但是這種方式嚴重的時間代價,而且會使計算機在此期間無法工作。

2、連結分配:

這種分配方式的思想類似於連結串列,每個塊就是一個節點,每個塊的尾部儲存下一個塊的地址。檔案訪問時,當訪問到一塊的最後時,獲取下一個塊的地址,從而進行下一塊的訪問,當訪問檔案結束時,那一塊的地址就為一個特定的終止符(圖例中的終止符為-1)。那麼檔案的目錄結構就只需要檔名、起始地址、終結地址了。

圖2:連結分配

連結分配的優點在於:

1)、不會出現外碎片問題,因為這種分配方式沒有位置的限制,任何一個塊都可以指向任意塊,也可以被任意塊指向。

2)、便於拓展:檔案如果需要擴充套件,那麼只需要在檔案鏈的尾部新增節點,並且修改原尾節點和檔案目錄的終結地址即可。

但是連結分配也有它自身的缺陷:

1)、只能順序訪問:由於這種磁碟分配方式採用的連結串列,所以只能順序訪問,要訪問檔案的第i塊,就必須從頭開始,跟著指標,找到第i塊。

2)、指標浪費記憶體:由於每一塊都需要儲存額外的指標,這樣就造成了空間的浪費。一種優化方式是:多塊共用一個地址,看成一塊,稱為簇。這樣就可以有效的減少指標的數量,但是如果最後一個簇用不完,例如一個簇包含4個塊,但是檔案+指標一共需要13個塊,那麼就需要4個簇,但是最後一個簇就只使用了一個塊,而一個簇公用一個地址,所以其他三塊就沒法分配出去,只能被浪費了。

3、索引分配:

為了解決上面兩種方式的問題,可以採用索引分配。索引分配簡單的說就是把連結分配的指標集中順序存放在一個塊中,那麼檔案目錄就只需要儲存檔名和索引塊的地址,然後在這個塊中按照地址依次訪問,當然也可以通過偏移量直接查詢到想訪問的地址之後就直接訪問。

3、索引分配

這種訪問方式有一個問題:就是一個塊儲存的索引地址的數量是有限的,那麼分配該怎麼把握呢?針對這一目的的機制包括如下:

1)、連結方案:簡單地說,就是用連結分配來拓展索引塊,一個索引塊用完了,就通過指標連結到下一塊。

2)、多層索引:就像樹一樣,目錄的索引塊指向根節點,然後塊中的地址就指向另一個塊,是第二層索引,以此類推。

3)、組合方案:例如在如下的圖中,一個索引塊含有15個指標(直接塊+間接塊),其中的頭12個指標是直接塊;即它們包括了能儲存檔案資料的塊的地址。因此,小檔案不需要其他是索引塊。一級間接塊就是二層索引結構,二級間接塊就是三層索引結構,三級間接塊就是四層索引結構,通過這種分層的方式,可以使大小不同檔案分配到合適的索引結構。

圖4、組合分配方案