• 文件物理结构和存储空间管理


    磁盘结构:

    磁盘也和内存一样分块,并且块大小和内存块大小相同,方便数据交换。

    一、文件物理结构

    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代表非空闲块,根据磁盘块号算出位的位置,然后管理

  • 相关阅读:
    mysql check约束无效
    Illegal mix of collations for operation 'concat'
    执行automake时报错 error while making link: Operation not supported
    GCC 编译详解[转]
    gcc的选项
    关于MFLAGS与MAKEFLAGS
    gcc和g++的区别
    g++参数介绍
    gcc/g++基本命令简介
    semver语义化版本号
  • 原文地址:https://www.cnblogs.com/biningooginind/p/12467426.html
Copyright © 2020-2023  润新知