欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

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

程序员文章站 2022-06-25 08:35:23
磁盘结构: 磁盘也和内存一样分块,并且块大小和内存块大小相同,方便数据交换。 一、文件物理结构 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代表非空闲块,根据磁盘块号算出位的位置,然后管理