目录实现(概述)

最为简单的目录实现方法其实就是使用存储文件名和数据块指针的线性列表,这种方法编程实现比较简单,但是运行的时候就会费时,就比如说我们要创建新文件必须要去搜索目录以确定没有同意名称的文件存在

如果我们要去新增加一个目录的话,要删除文件的时候,根据给定文件名搜索目录,接着释放分配给它的空间。如果要重用目录条目,我们有很多方法,比如说可以将目录条目标记为不再使用(为每个目录条目增加一个使用-非使用位)或者还可以将它加到空闲目录条目列表当中

我们使用链表来实现其实就是可以用来减少删除文件的时间

其实目录条目的线性列表的真正缺点就是查找文件需要线性搜索。如果目录信息需要经常使用,用户在访问文件的时候就会注意到实现的快慢

很多操作系统其实都是采用软件缓存来存储最近访问过的目录信息,缓存命中避免了不断从磁盘读取信息

如果需要排序列表的话,我们可以使用二分搜索,并减少平均搜索时间。但是列表始终需要排序的要求会使文件的创建和删除复杂化,这是因为可能需要移动不少的目录信息来保持目录的排序

用于文件目录的另一种方式就是哈希表根据文件名得到一个值,并返回线性列表存储目录条目,所以它就大大地减少目录搜索的时间。插入和删除也比较简单,但是我们需要去准备一些方案来避免冲突(两个文件名哈希到相同的位置)

实现哈希表的最大困难就是哈希函数对大小的依赖性,就比如说有这么个简单的哈希函数就是采用除以64的余数,可以将文件名转换为0-63的整数,如果在此之后我们想扩大目录的哈希表我们就要再去寻找一个新的哈希函数去映射更大的范围

还有个解决方法就是我们去使用chained-overflow 哈希表,每个哈希条目可以是链表而不是单个值,可以采用向链表增加一项来解决冲突,由于查找一个名词可能需要搜索冲突条目组成的链表,所以可能查找会变慢,但是这比线性搜索整个目录还是要快很多

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值