一種磁盤文件系統(tǒng)的設(shè)計(jì)

近日和朋友聊到存儲(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ù)。


image.png

磁盤一般有一個(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ù)的。


image.png

每個(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)始的。


image.png

根據(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é)。


image.png

柱面是我們抽象出來(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ù)等。


image.png

現(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ō)找到了父目錄的單元地址,操作如下:

  1. 在全局信息地址中找一個(gè)空閑單元,如8K,修改空閑單元入口地址為12K。
全局信息地址:0
    存儲(chǔ)單元大?。?K
    存儲(chǔ)單元入口地址:4K
    空閑單元入口地址:12K
  1. 修改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
  1. 修改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
刪除目錄:

刪除目錄是上面新增目錄的逆操作,操作步驟:

  1. 首先必須提供待刪除目錄的確定地址,如刪除上面新增的目錄8K,不需要特意的做數(shù)據(jù)區(qū)的擦除工作。
  2. 從8K的數(shù)據(jù)單元頭區(qū)找到父級(jí)存儲(chǔ)單元地址,如4K,然后讀取4K數(shù)據(jù)區(qū)的內(nèi)容,刪除對(duì)應(yīng)的子目錄,然后重新寫回?cái)?shù)據(jù)區(qū)。
  3. 將8K的數(shù)據(jù)單元重新加入到空閑單元中,需要先取出修改全局信息地址中的空閑單元入口地址,將8K存儲(chǔ)單元鏈向它,并將8K地址更新到空閑單元入口地址。
遍歷目錄:

遍歷通常實(shí)現(xiàn)為一個(gè)遞歸的過(guò)程,對(duì)每個(gè)遞歸單元來(lái)說(shuō),邏輯如下:

  1. 判斷提供的存儲(chǔ)單元的頭區(qū)數(shù)據(jù)類型,如果非目錄,返回不再執(zhí)行后續(xù)步驟。
  2. 根據(jù)數(shù)據(jù)區(qū)偏移找到目錄的數(shù)據(jù)結(jié)構(gòu),這里一個(gè)列表,讀取其內(nèi)容。
  3. 順序遍歷這個(gè)列表,判斷項(xiàng)目類型,如果是文件,打印文件名,如果是目錄,則遞歸。
  4. 判斷數(shù)據(jù)區(qū)的下一單元地址是否為0,非0表示目錄列表未展示完全,還需要讀取其他的單元,繼續(xù)回到步驟1執(zhí)行。
新增文件:

首先需要提供父目錄位置,即目錄存儲(chǔ)單元地址,以在根目錄添加文件為例,操作如下:

  1. 在全局信息地址中找一個(gè)空閑單元,如8K,修改空閑單元入口地址為12K。
全局信息地址:0
    存儲(chǔ)單元大小:4K
    存儲(chǔ)單元入口地址:4K
    空閑單元入口地址:12K
  1. 修改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
  1. 修改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)容為例,操作如下:

  1. 更新8K的頭區(qū)單元數(shù)據(jù)區(qū)大小為7。
  2. 更新8K的數(shù)據(jù)區(qū)的內(nèi)容為abcdefg。
讀取文件:

需要提供文件的存儲(chǔ)單元地址,以向上面的8K地址讀取為例,操作如下:

  1. 取得8K的頭區(qū)單元數(shù)據(jù)區(qū)大小,如7。
  2. 讀取8K的數(shù)據(jù)區(qū)內(nèi)容,讀取長(zhǎng)度7。
  3. 檢查數(shù)據(jù)區(qū)的下一單元地址,確保是否是最后數(shù)據(jù)區(qū),若不為0,切換存儲(chǔ)單元地址,繼續(xù)執(zhí)行步驟1。
刪除文件:

是新增文件的反操作,操作如下:

  1. 首先必須提供待刪除文件的確定地址,如刪除上面新增的文件8K,不需要特意的做數(shù)據(jù)區(qū)的擦除工作。
  2. 從8K的數(shù)據(jù)單元頭區(qū)找到父級(jí)存儲(chǔ)單元地址,如4K,然后讀取4K數(shù)據(jù)區(qū)的內(nèi)容,刪除對(duì)應(yīng)的子項(xiàng),然后重新寫回?cái)?shù)據(jù)區(qū)。
  3. 將8K的數(shù)據(jù)單元重新加入到空閑單元中,需要先取出修改全局信息地址中的空閑單元入口地址,將8K存儲(chǔ)單元鏈向它,并將8K地址更新到空閑單元入口地址。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容