近日和朋友聊到存儲(chǔ)系統(tǒng)設(shè)計(jì)的相關(guān)技術(shù),結(jié)合以前我在互聯(lián)網(wǎng)公司做分布式系統(tǒng)的一些經(jīng)驗(yàn),本篇就粗略地講一講如何設(shè)計(jì)一個(gè)簡(jiǎn)單的磁盤文件系統(tǒng)。
磁盤的結(jié)構(gòu):
傳統(tǒng)的磁盤結(jié)構(gòu)是像下面這個(gè)樣子的,它有一個(gè)或多個(gè)盤片,用于存儲(chǔ)數(shù)據(jù)。盤片多采用鋁合金材料;中間有一個(gè)主軸,所有的盤片都繞著這個(gè)主軸轉(zhuǎn)動(dòng)。一個(gè)組合臂上面有多個(gè)磁頭臂,每個(gè)磁頭臂上面都有一個(gè)磁頭,負(fù)責(zé)讀寫數(shù)據(jù)。

磁盤一般有一個(gè)或多個(gè)盤片。每個(gè)盤片可以有兩面,即第一個(gè)盤片的正面為0面,反面為 1 面;第二個(gè)盤片的正面為 2 面…依次類推。磁頭的編號(hào)也和盤面的編號(hào)是一樣的,因此有多少個(gè)盤面就有多少個(gè)磁頭。盤面正視圖如下圖,磁頭的傳動(dòng)臂只能在盤片的內(nèi)外磁道之間移動(dòng)。因此不管開(kāi)機(jī)還是關(guān)機(jī),磁頭總是在盤片上面。關(guān)機(jī)時(shí),磁頭停在盤片上面,抖動(dòng)容易劃傷盤面造成數(shù)據(jù)損失,為了避免這樣的情況,所以磁頭都是停留在起停區(qū)的,起停區(qū)是沒(méi)有數(shù)據(jù)的。

每個(gè)盤片的盤面被劃分成多個(gè)狹窄的同心圓環(huán),數(shù)據(jù)就存儲(chǔ)在這樣的同心圓環(huán)上面,我們將這樣的圓環(huán)稱為磁道 (Track)。每個(gè)盤面可以劃分多個(gè)磁道,最外圈的磁道是0號(hào)磁道,向圓心增長(zhǎng)依次為1磁道、2磁道…磁盤的數(shù)據(jù)存放就是從最外圈開(kāi)始的。

根據(jù)硬盤的規(guī)格不同,磁道數(shù)可以從幾百到成千上萬(wàn)不等。每個(gè)磁道可以存儲(chǔ)數(shù) Kb 的數(shù)據(jù),但是計(jì)算機(jī)不必要每次都讀寫這么多數(shù)據(jù)。因此,再把每個(gè)磁道劃分為若干個(gè)弧段,每個(gè)弧段就是一個(gè)扇區(qū) (Sector)。扇區(qū)是硬盤上存儲(chǔ)的物理單位,現(xiàn)在每個(gè)扇區(qū)可存儲(chǔ) 512 字節(jié)數(shù)據(jù)已經(jīng)成了業(yè)界的約定。也就是說(shuō),即使計(jì)算機(jī)只需要某一個(gè)字節(jié)的數(shù)據(jù),但是也得把這個(gè) 512 個(gè)字節(jié)的數(shù)據(jù)全部讀入內(nèi)存,再選擇所需要的那個(gè)字節(jié)。

柱面是我們抽象出來(lái)的一個(gè)邏輯概念,簡(jiǎn)單來(lái)說(shuō)就是處于同一個(gè)垂直區(qū)域的磁道稱為柱面 ,即各盤面上面相同位置磁道的集合。需要注意的是,磁盤讀寫數(shù)據(jù)是按柱面進(jìn)行的,磁頭讀寫數(shù)據(jù)時(shí)首先在同一柱面內(nèi)從 0 磁頭開(kāi)始進(jìn)行操作,依次向下在同一柱面的不同盤面(即磁頭上)進(jìn)行操作,只有在同一柱面所有的磁頭全部讀寫完畢后磁頭才轉(zhuǎn)移到下一柱面。因?yàn)檫x取磁頭只需通過(guò)電子切換即可,而選取柱面則必須通過(guò)機(jī)械切換。數(shù)據(jù)的讀寫是按柱面進(jìn)行的,而不是按盤面進(jìn)行,所以把數(shù)據(jù)存到同一個(gè)柱面是很有價(jià)值的。
磁盤被磁盤控制器所控制(可控制一個(gè)或多個(gè)),它是一個(gè)小處理器,可以完成一些特定的工作。比如將磁頭定位到一個(gè)特定的半徑位置;從磁頭所在的柱面選擇一個(gè)扇區(qū);讀取數(shù)據(jù)等。

現(xiàn)代硬盤尋道都是采用CHS(Cylinder Head Sector)的方式,硬盤讀取數(shù)據(jù)時(shí),讀寫磁頭沿徑向移動(dòng),移到要讀取的扇區(qū)所在磁道的上方,這段時(shí)間稱為尋道時(shí)間(seek time)。因讀寫磁頭的起始位置與目標(biāo)位置之間的距離不同,尋道時(shí)間也不同。磁頭到達(dá)指定磁道后,然后通過(guò)盤片的旋轉(zhuǎn),使得要讀取的扇區(qū)轉(zhuǎn)到讀寫磁頭的下方,這段時(shí)間稱為旋轉(zhuǎn)延遲時(shí)間(rotational latencytime)。然后再讀寫數(shù)據(jù),讀寫數(shù)據(jù)也需要時(shí)間,這段時(shí)間稱為傳輸時(shí)間(transfer time)。
根據(jù)上文的信息,我們可以得出磁盤容量的計(jì)算公式為:
磁盤容量 = 總盤面數(shù) x 每盤面柱面數(shù) x 每磁道扇區(qū)數(shù) x 512
注:以上信息來(lái)源于網(wǎng)絡(luò)。
文件系統(tǒng)的設(shè)計(jì):
磁盤在物理上是一個(gè)很復(fù)雜的混和結(jié)構(gòu),對(duì)軟件開(kāi)發(fā)者來(lái)說(shuō),基本上不需要直接接觸它們,我們所有的訪問(wèn)都在磁盤控制器的接口之一,使用與內(nèi)存相似的統(tǒng)一尋址,只不過(guò)磁盤支持持久化,且性能相對(duì)于內(nèi)存有數(shù)量級(jí)差。我們可以考慮使用靜態(tài)鏈表來(lái)設(shè)計(jì)文件系統(tǒng)。
靜態(tài)鏈表:
靜態(tài)鏈表是一種利用順序存儲(chǔ)結(jié)構(gòu)來(lái)進(jìn)行鏈?zhǔn)酱鎯?chǔ)的特殊結(jié)構(gòu),使用它可以在一段連接的存儲(chǔ)空間模擬離散的鏈?zhǔn)浇Y(jié)構(gòu)。它通過(guò)將整塊大內(nèi)存劃分為小的塊,塊與塊之間通過(guò)指針連接,這個(gè)小的塊,我稱為之存儲(chǔ)單元。
文件系統(tǒng)結(jié)構(gòu)定義:
在存儲(chǔ)單元之上,一個(gè)基本的文件系統(tǒng)需要有邏輯的目錄、文件,通常一個(gè)塊不可能存儲(chǔ)完整個(gè)目錄或文件,因此它們實(shí)際上可能需要跨多個(gè)塊。下面是存儲(chǔ)單元和目錄結(jié)構(gòu)的定義:
存儲(chǔ)單元結(jié)構(gòu)定義:
頭區(qū)(保留32字節(jié)):
本單元數(shù)據(jù)區(qū)大小(4字節(jié))
數(shù)據(jù)類型(4字節(jié)):目錄 / 文件
數(shù)據(jù)區(qū)偏移(4字節(jié)):32
父級(jí)存儲(chǔ)單元地址(4字節(jié))
數(shù)據(jù)區(qū)的下一單元地址(4字節(jié))
本單元的下一空閑單元地址(4字節(jié))
數(shù)據(jù)區(qū)(大小由頭區(qū)指定):
目錄數(shù)據(jù) / 文件數(shù)據(jù)
目錄結(jié)構(gòu)定義:
項(xiàng)目數(shù)(4字節(jié))
項(xiàng)目1(保留16字節(jié)):
項(xiàng)目類型(4字節(jié)):目錄 / 文件
項(xiàng)目名稱(4字節(jié)):目錄名 / 文件名
項(xiàng)目所在存儲(chǔ)單元地址(4字節(jié))
項(xiàng)目2(保留16字節(jié)):
項(xiàng)目類型(4字節(jié)):目錄 / 文件
項(xiàng)目名稱(4字節(jié)):目錄名 / 文件名
項(xiàng)目所在存儲(chǔ)單元地址(4字節(jié))
文件結(jié)構(gòu)定義:
純文件內(nèi)容
此外,還需要有空閑單元結(jié)構(gòu)等信息,這里增加一個(gè)全局磁盤信息定義:
存儲(chǔ)單元大小
存儲(chǔ)單元入口地址
空閑單元入口地址
文件系統(tǒng)內(nèi)容布局:
下面以一個(gè)64K的磁盤,假設(shè)起始地址從0開(kāi)始,最大地址64K-1,對(duì)于如下的邏輯存儲(chǔ):
/
|------目錄1
| |------目錄2
| | |------文件3 (大小3.1K)
| |
| |------文件2 (大小100)
|
|------文件1 (大小100)
假設(shè)定義每單元大小為4K,在4K字節(jié)中,需要存儲(chǔ)單元頭32字節(jié),其余4K-32可存儲(chǔ)目錄或文件內(nèi)容,假設(shè)在下面的設(shè)計(jì)中,每個(gè)單元若存儲(chǔ)文件內(nèi)容最多不超過(guò)3K。且假設(shè)定義全局磁盤信息在0單元,其實(shí)際物理布局如下:
全局信息地址:0
存儲(chǔ)單元大?。?K
存儲(chǔ)單元入口地址:4K
空閑單元入口地址:32K
單元地址:4K (/目錄)
頭區(qū):
本單元數(shù)據(jù)區(qū)大小:36(4 + 2x16)
數(shù)據(jù)類型:目錄
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
目錄數(shù)據(jù),內(nèi)容如下:
項(xiàng)目數(shù):2
項(xiàng)目1:
項(xiàng)目類型:目錄
項(xiàng)目名稱:目錄1
項(xiàng)目所在存儲(chǔ)單元地址:8K
項(xiàng)目2:
項(xiàng)目類型:文件
項(xiàng)目名稱:文件1
項(xiàng)目所在存儲(chǔ)單元地址:12K
單元地址:8K (目錄1)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?6(4 + 2x16)
數(shù)據(jù)類型:目錄
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:4K
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
目錄數(shù)據(jù),內(nèi)容如下:
項(xiàng)目數(shù):2
項(xiàng)目1:
項(xiàng)目類型:目錄
項(xiàng)目名稱:目錄2
項(xiàng)目所在存儲(chǔ)單元地址:16K
項(xiàng)目2:
項(xiàng)目類型:文件
項(xiàng)目名稱:文件2
項(xiàng)目所在存儲(chǔ)單元地址:20K
單元地址:12K (文件1)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?00
數(shù)據(jù)類型:文件
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:4K
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
文件數(shù)據(jù),內(nèi)容如下:
abcdefg....(100字節(jié))
單元地址:16K (目錄2)
頭區(qū):
本單元數(shù)據(jù)區(qū)大小:20(4 + 1x16)
數(shù)據(jù)類型:目錄
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:8K
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
目錄數(shù)據(jù),內(nèi)容如下:
項(xiàng)目數(shù):1
項(xiàng)目1:
項(xiàng)目類型:文件
項(xiàng)目名稱:文件3
項(xiàng)目所在存儲(chǔ)單元地址:24K
單元地址:20K (文件2)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?00
數(shù)據(jù)類型:文件
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:8K
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
文件數(shù)據(jù),內(nèi)容如下:
abcdefg....(100字節(jié))
單元地址:24K (文件3)
頭區(qū):
本單元數(shù)據(jù)區(qū)大小:3K
數(shù)據(jù)類型:文件
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:16K
數(shù)據(jù)區(qū)的下一單元地址:28K
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
文件數(shù)據(jù),內(nèi)容如下:
abcdefg....(3K字節(jié))
單元地址:28K (文件3)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?00
數(shù)據(jù)類型:文件
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:16K
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
文件數(shù)據(jù),內(nèi)容如下:
abcdefg....(100字節(jié))
單元地址:32K
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:36K
數(shù)據(jù)區(qū):
無(wú)
單元地址:36K
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:40K
數(shù)據(jù)區(qū):
無(wú)
單元地址:40K
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:44K
數(shù)據(jù)區(qū):
無(wú)
單元地址:44K
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:48K
數(shù)據(jù)區(qū):
無(wú)
單元地址:48K
頭區(qū):
本單元數(shù)據(jù)區(qū)大小:0
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:52K
數(shù)據(jù)區(qū):
無(wú)
單元地址:52K
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:56K
數(shù)據(jù)區(qū):
無(wú)
單元地址:56K
頭區(qū):
本單元數(shù)據(jù)區(qū)大小:0
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:60K
數(shù)據(jù)區(qū):
無(wú)
單元地址:60K
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
無(wú)
操作設(shè)計(jì):
一個(gè)合格的文件系統(tǒng)至少應(yīng)支持以下操作:
格式化:
包括低級(jí)格式化和高級(jí)格式化,低級(jí)格式化由廠商提供,由控制器提供支持,主要用于消除數(shù)據(jù),重建扇區(qū)存儲(chǔ)結(jié)構(gòu)。高級(jí)格式化由操作系統(tǒng)提供,主要目的是向固定扇區(qū)寫入特定結(jié)構(gòu),這些結(jié)構(gòu)包括磁盤或分區(qū)元信息表,管理整個(gè)磁盤或分區(qū)的全局和入口信息。
對(duì)我們的簡(jiǎn)單系統(tǒng)來(lái)說(shuō),需要初使化全局信息地址和根目錄,以及各存儲(chǔ)單元,初使化為:
全局信息地址:0
存儲(chǔ)單元大小:4K
存儲(chǔ)單元入口地址:4K
空閑單元入口地址:8K
單元地址:4K (/目錄)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:目錄
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
目錄數(shù)據(jù),暫無(wú)
單元地址:8K
頭區(qū):
本單元數(shù)據(jù)區(qū)大小:0
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:12K
數(shù)據(jù)區(qū):
無(wú)
......
單元地址:60K
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:0
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
無(wú)
新增目錄:
首先需要找到父目錄所在的單元位置,由于整個(gè)文件系統(tǒng)是一個(gè)樹(shù)型結(jié)構(gòu),需要從根目錄位置開(kāi)始尋找。若在根目錄添加,或者說(shuō)找到了父目錄的單元地址,操作如下:
- 在全局信息地址中找一個(gè)空閑單元,如8K,修改空閑單元入口地址為12K。
全局信息地址:0
存儲(chǔ)單元大?。?K
存儲(chǔ)單元入口地址:4K
空閑單元入口地址:12K
- 修改4K所在的根目錄存儲(chǔ)單元內(nèi)容,如下:
單元地址:4K (/目錄)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?0(4 + 2x16)
數(shù)據(jù)類型:目錄
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
目錄數(shù)據(jù),內(nèi)容如下:
項(xiàng)目數(shù):1
項(xiàng)目1:
項(xiàng)目類型:目錄
項(xiàng)目名稱:目錄名稱
項(xiàng)目所在存儲(chǔ)單元地址:8K
- 修改8K的存儲(chǔ)單元內(nèi)容,如下:
單元地址:8K (目錄名稱)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?
數(shù)據(jù)類型:目錄
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:4K
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
目錄數(shù)據(jù),內(nèi)容如下:
項(xiàng)目數(shù):0
刪除目錄:
刪除目錄是上面新增目錄的逆操作,操作步驟:
- 首先必須提供待刪除目錄的確定地址,如刪除上面新增的目錄8K,不需要特意的做數(shù)據(jù)區(qū)的擦除工作。
- 從8K的數(shù)據(jù)單元頭區(qū)找到父級(jí)存儲(chǔ)單元地址,如4K,然后讀取4K數(shù)據(jù)區(qū)的內(nèi)容,刪除對(duì)應(yīng)的子目錄,然后重新寫回?cái)?shù)據(jù)區(qū)。
- 將8K的數(shù)據(jù)單元重新加入到空閑單元中,需要先取出修改全局信息地址中的空閑單元入口地址,將8K存儲(chǔ)單元鏈向它,并將8K地址更新到空閑單元入口地址。
遍歷目錄:
遍歷通常實(shí)現(xiàn)為一個(gè)遞歸的過(guò)程,對(duì)每個(gè)遞歸單元來(lái)說(shuō),邏輯如下:
- 判斷提供的存儲(chǔ)單元的頭區(qū)數(shù)據(jù)類型,如果非目錄,返回不再執(zhí)行后續(xù)步驟。
- 根據(jù)數(shù)據(jù)區(qū)偏移找到目錄的數(shù)據(jù)結(jié)構(gòu),這里一個(gè)列表,讀取其內(nèi)容。
- 順序遍歷這個(gè)列表,判斷項(xiàng)目類型,如果是文件,打印文件名,如果是目錄,則遞歸。
- 判斷數(shù)據(jù)區(qū)的下一單元地址是否為0,非0表示目錄列表未展示完全,還需要讀取其他的單元,繼續(xù)回到步驟1執(zhí)行。
新增文件:
首先需要提供父目錄位置,即目錄存儲(chǔ)單元地址,以在根目錄添加文件為例,操作如下:
- 在全局信息地址中找一個(gè)空閑單元,如8K,修改空閑單元入口地址為12K。
全局信息地址:0
存儲(chǔ)單元大小:4K
存儲(chǔ)單元入口地址:4K
空閑單元入口地址:12K
- 修改4K所在的根目錄存儲(chǔ)單元內(nèi)容,如下:
單元地址:4K (/目錄)
頭區(qū):
本單元數(shù)據(jù)區(qū)大?。?0(4 + 2x16)
數(shù)據(jù)類型:目錄
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:0
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
目錄數(shù)據(jù),內(nèi)容如下:
項(xiàng)目數(shù):1
項(xiàng)目1:
項(xiàng)目類型:文件
項(xiàng)目名稱:文件名稱
項(xiàng)目所在存儲(chǔ)單元地址:8K
- 修改8K的存儲(chǔ)單元內(nèi)容,如下:
單元地址:8K (文件名稱)
頭區(qū):
本單元數(shù)據(jù)區(qū)大小:0
數(shù)據(jù)類型:文件
數(shù)據(jù)區(qū)偏移:32
父級(jí)存儲(chǔ)單元地址:4K
數(shù)據(jù)區(qū)的下一單元地址:0
本單元的下一空閑單元地址:0
數(shù)據(jù)區(qū):
無(wú)
寫入文件:
需要提供文件的存儲(chǔ)單元地址,以向上面的8K地址寫入abcdefg內(nèi)容為例,操作如下:
- 更新8K的頭區(qū)單元數(shù)據(jù)區(qū)大小為7。
- 更新8K的數(shù)據(jù)區(qū)的內(nèi)容為abcdefg。
讀取文件:
需要提供文件的存儲(chǔ)單元地址,以向上面的8K地址讀取為例,操作如下:
- 取得8K的頭區(qū)單元數(shù)據(jù)區(qū)大小,如7。
- 讀取8K的數(shù)據(jù)區(qū)內(nèi)容,讀取長(zhǎng)度7。
- 檢查數(shù)據(jù)區(qū)的下一單元地址,確保是否是最后數(shù)據(jù)區(qū),若不為0,切換存儲(chǔ)單元地址,繼續(xù)執(zhí)行步驟1。
刪除文件:
是新增文件的反操作,操作如下:
- 首先必須提供待刪除文件的確定地址,如刪除上面新增的文件8K,不需要特意的做數(shù)據(jù)區(qū)的擦除工作。
- 從8K的數(shù)據(jù)單元頭區(qū)找到父級(jí)存儲(chǔ)單元地址,如4K,然后讀取4K數(shù)據(jù)區(qū)的內(nèi)容,刪除對(duì)應(yīng)的子項(xiàng),然后重新寫回?cái)?shù)據(jù)區(qū)。
- 將8K的數(shù)據(jù)單元重新加入到空閑單元中,需要先取出修改全局信息地址中的空閑單元入口地址,將8K存儲(chǔ)單元鏈向它,并將8K地址更新到空閑單元入口地址。