文件物理結構和存儲空間管理

来源:https://www.cnblogs.com/biningooginind/archive/2020/03/12/12467426.html
-Advertisement-
Play Games

磁碟結構: 磁碟也和記憶體一樣分塊,並且塊大小和記憶體塊大小相同,方便數據交換。 一、文件物理結構 1、連續分配 文件連續分配在磁碟的塊上,查找效率最高,磁頭移動最快,但是產生碎片最多,不容易擴展。 下麵用Python實現以下 連續分配 的邏輯 2、鏈接分配 (1) 顯式鏈接(支持隨機訪問) 文件目錄表 ...


磁碟結構:

磁碟也和記憶體一樣分塊,並且塊大小和記憶體塊大小相同,方便數據交換。

一、文件物理結構

1、連續分配

文件連續分配在磁碟的塊上,查找效率最高,磁頭移動最快,但是產生碎片最多,不容易擴展。

下麵用Python實現以下連續分配的邏輯

class Category: #文件目錄
    def __init__(self,size):
        self.table=[]
        self.disk = Disk(size) #模擬磁碟

    def append(self,file_name,length):
        t=[None]*2
        t[0] = file_name
        t[1] = self.disk.Distribution(length)
        self.table.append(t)


class Disk:
    def __init__(self,size):
        self.table=[None]*size
    def Distribution(self,length):
        for index,v in enumerate(self.table):
            if v==None and len(self.table)-length>0:
                for j in range(index,index+length):
                    self.table[j] = True
                return index

        print("磁碟已經滿了")
        return -1
if __name__ == '__main__':
    category = Category(100)
    category.append("one",20)
    category.append("three",30)
    category.append("tow",15)

    print(category.table)
    print(category.disk.table)

2、鏈接分配

(1) 顯式鏈接(支持隨機訪問)

文件目錄表FCB

文件名 .... 起始塊號
a.txt 0

FAT文件分配表(長駐記憶體,方便查找):

一個磁碟一張FAT表

物理塊號 下一個物理塊號(-1表示沒有)
0 3
1 2
2 -1
3 6
4 -1
6 -1

上面a.txt文件依次存放在0->3->6這三個塊中

(2)隱式鏈接

只支持順序訪問、存在連續的塊中,每個塊同時也有指向下一個塊的指針

FCB

文件名 .... 起始塊號 結束塊號
a.txt 0 6

下麵用Python模擬

class Category:
    def __init__(self,fat_size):
        self.table=[]
        self.fat = FAT(fat_size)

    def append(self,file_name,size):
        file =[None]*3
        file[0] = file_name
        file[1] = size
        file[2] = self.fat.FindEmpty()
        if file[2]==-1:
            print("沒有空閑塊")
            return
        self.fat.Distribution(file[2],file[1])
        self.table.append(file)






class FAT:
    def __init__(self,size):
        self.table=[]
        for i in range(size):
            t = list()
            t.append(i)
            t.append(None)
            self.table.append(t)





    def Distribution(self,cur,size):
        self.table[cur][1] = -1
        for c in range(size):
            self.table[cur][1] = self.FindEmpty()
            cur = self.table[cur][1]
        self.table[cur][1] = -1

    def FindEmpty(self):
        for i in self.table:
            if i[1]==None:
                return i[0]
        return -1


if __name__ == '__main__':
    fat_size = 100
    category = Category(fat_size)
    #
    category.append("one",4)
    category.append("tow",2)

    category.append("three",20)


    print(category.table)
    for w in category.fat.table:
        print(w[0],w[1])




3、索引分配

支持隨機訪問

FCB

文件名 ..... 索引塊號
a.txt 13

索引表(每個文件都有一個索引表,FCB保存著索引表的物理塊號)

邏輯塊 物理塊
0 6
1 98
2 5
3 12
4 4

上面文件存放的塊號為6->98->5->12->4,一個索引表不夠可以鏈接另外一個物理塊再創建一個索引表

,這種鏈式效率慢,一般採用多級索引。




二、文件存儲空間管理

分區

一個磁碟分為好幾個文件捲或區,A盤B盤D盤等,這些都是邏輯分區,

通常將一個磁碟分為好幾個邏輯分區,也可以把好幾個磁碟劃為一個邏輯分區

分區結構

在一個分區內分為目錄區文件區,目錄區存放目錄基本信息和索引、文件區存放具體數據

文件空閑空間管理

1、空閑區鏈表法

將連續的空閑塊鏈接成鏈表,使用時尋找最佳空閑區、如何刪除空閑鏈表節點、回收時加入鏈接尾部

2、位示圖法

0 1 2 3 4 5
1 1 1 0 1 1

位為1代表非空閑塊,根據磁碟塊號算出位的位置,然後管理


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 第一步 第二步 第三步 第四步 第五步 第六步 ...
  • Linux集群 使用多台伺服器搭建成一個集群來運行應用程式,不僅可以避免單點故障,還能提升伺服器的承載能力 集群從功能實現上分為兩種:高可用集群和負載均衡集群 高可用集群,當一臺伺服器宕機不能提供服務時,還有另外的伺服器頂替 負載均衡集群,把用戶的請求分攤到多台伺服器上 搭建高可用集群 高可用集群, ...
  • 一、CentOS7.7下載 官網下載地址:http://mirrors.163.com/centos 1、進入CentOS下載官網,找到CentOS7.4版本 2、在CentOS7.7版本頁面中,找到isos/ 3、進入頁面後,可以看到x86_64 4、在CentOS下載頁面中,選擇 CentOS- ...
  • 原文鏈接: "https://xiaoheidiannao.com/articles/SoftWare Self Start.html" "" 目錄 "介紹" "禁止軟體自啟" "開啟軟體自啟" 介紹 "軟體" 自啟也就是 "軟體" 開機自啟動,是指 "軟體" 隨 "操作系統" 一起啟動。有時候感覺 ...
  • 1.修改日誌文件的存儲位置:打開IIS-日誌 2.我們當然可以手動去刪除日誌文件。這邊只說更方便的一種做法是創建一個批處理文件(比如叫:deleteLog.bat)其內容如下: 新建文本文檔-複製以下代碼-保存,修改文件名為deleteLog.bat :: 清理IIS日誌文件 :: 備份MySql數 ...
  • CentOS7修改主機名的三種方法 在CentOS7中,有三種定義的主機名: 靜態的(Static hostname) “靜態”主機名也稱為內核主機名,是系統在啟動時從/etc/hostname自動初始化的主機名。 瞬態的(Tansient hostname) “瞬態”主機名是在系統運行時臨時分配的 ...
  • 原因:由於其他原因,或者odoo內部服務自動停止掉,需要一個腳本來監測狀態,自動啟動。 步驟: 1、在任意目錄下新建shell腳本odoodaemon.sh 1 #!/bin/sh 2 # ckconfig: 2345 20 81 3 4 while true; 5 do 6 processExis ...
  • 1、文件操作 打開文件: Open()系統調用 讀寫文件: 文件指針 刪除文件 :同時刪除目錄項的文件記錄條目 2、管理打開文件 1、系統打開文件表 每個open都會返回一個打開文件表的指針( 文件描述符,打開文件表的索引 )、所有文件操作都圍繞這個指針,打開一個文件 ,則搜索目錄,將文件信息cop ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...