系统文件格式定义及其存储管理算法设计

来源:互联网 发布:科比02年总决赛数据 编辑:程序博客网 时间:2024/05/07 21:50

 一、当前文件格式定义:

PKG = 文件头 + 打包文件流

文件头 = 文件头标记 + 版本号 + 【空闲循环双链表头指针[初始化置空] + 非空闲双链表头指针[初始化为文件包首部偏移量] + 文件个数 + 索引表大小 + 索引表偏移 + 索引表

打包文件流 = 二进制文件包1 + 二进制文件包2 + …... + 二进制文件包n

索引表 = ID + 空闲/使用标记 + 文件/目录名称 + 偏移量(相对打包的文件流的首部,方便以后对文件进行管理) + 大小 + 类型 + ID

【逻辑上的二进制文件包】(暂定) = llink(指向前一空闲空间的首部偏移) + tag(本包使用标记,0为未使用;1为已使用) + size(本包的大小) + rlink(指向后一空闲包的首部偏移) + space(空闲空间) + tag(尾部使用标记,内容和前面一致) + uplink(指向本包首部偏移)

说明:二进制文件包的设计在实际分配的时候,可以把整个包全部分配给文件写入。这些标记域将不浪费任何存储空间。

二、存储空间管理算法

1、一些说明

对存储空间的分配与回收,是通过加载到内存的两个表:空闲块链表和占用块链表【这两个表是在用户对文件操作的过程中,根据索引表动态生成的表格】进行管理的。这两个表都为双向循环链表,因此用到双向循环链表的常用操作:创建结点、删除结点、插入结点等操作。包括了对双向循环链表的排序:思路可以再内存中对双向循环链表进行重构,采用插入排序,空间复杂度为O(1),性能上可行。基本操作:结点的创建、删除和插入操作。插入过程中按照size域进行排序。

2、存储空间分配算法【草稿,暂定】

分配算法分为三种:首次拟合法【无,首选】、最佳拟合法【从小到大排序】和最差拟合法【从大到小排序】。

程序流程:

删除【回收算法,见下】

插入【分配算法】:空闲块链头指针pav是否为空?

                                                                 |

——是———否———

|                                     |

                            在整个pkg尾部插|——————>结点大小是否合适

                            入文件修改索引表|                                   |

                            |                           |                           ——否———是——

                            |                           |                           |                             |

                            |                           |                  指针下移    修改空闲块各个标记,返回分配首地址

                            |                           |                  |                                       |

                            |                           —否—是否指空            写入文件,修改索引表

                            |<—————————是                                               |

                            |                                                                                     |

                            —————————————————————————

                                                                           |

                                                                   结束

3、文件存储空间的回收算法【草稿,暂定】

目标:物理上毗邻的空闲块组合成尽可能大的结点。

判别:释放区头部偏移量为p,则:

       上一块存储区底部偏移为:p-1

       下一块存储区头部偏移为:p+p->size

       使用情况判别方法:(p-1)->tag == 0 上临区为空闲块,p+p->size == 0 下临区为空闲块。

释放块操作:(四种)

1)  左右均为占用块:插入到空闲链表中。

2)  左邻区为空闲块,右邻区为占用块:修改左邻块size域;重设结点底部uplink

3)  右邻区为空闲块,左邻区为占用块:修改释放块的头部域,修改有邻块的底部域。

4)  左右邻区均为空闲块:增加左邻空块的space量,链中删去右邻空间块。

4、存储空间碎片整理算法【草稿,暂定】——存储紧缩算法

5、索引表生成空闲双链表算法【思考中

附:存储分配与回收算法模拟实现代码

 

原创粉丝点击