系统文件格式定义及其存储管理算法设计
来源:互联网 发布:科比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、索引表生成空闲双链表算法【思考中…】
附:存储分配与回收算法模拟实现代码
- 系统文件格式定义及其存储管理算法设计
- 系统文件格式定义及其存储管理算法设计
- Hex文件格式及其校验算法
- 算法定义及其主要特征
- 稀疏矩阵三元组存储结构的定义及其有关算法的实现
- 算法及其设计原则
- AT45DB041D存储驱动设计和页式存储管理算法设计
- 存储结构的定义及其分类
- 页面存储管理系统
- 4.管理系统存储
- 管理系统存储
- 管理系统存储
- 管理系统存储
- 管理系统存储
- 管理系统存储
- 管理系统存储
- linux系统日志及其管理
- 软件定义存储(SDS)的定义及其分类
- Pooling 池化和非池化
- tomcat 启动时遇到的问题
- progressbar
- VS2005中使程序界面具有XP风格
- Informatica Interview Questions
- 系统文件格式定义及其存储管理算法设计
- 关于破解网络验证的一点心得
- JAVA环境变量的设置方法和设置作用
- 当协同遭遇SOA 发展趋势和应用如何走?
- .Net中关于Random类产生的随机数相同问题解决
- 红外线节能灶头
- Some Concepts
- SQL Server数据库开发的二十一条军规
- 什么是Web2.0? — Web2.0图解