查看: 1818| 回复: 2
跳转到指定楼层
上一主题 下一主题
收起左侧

[题目讨论] 一道defragmentation的题目求解

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
是在模拟的diskdrive上有很多file 每个file分散在多个disk block里面
如何能做到defragment(就是让 每个file的piece都是continuous)

楼主想到用hash table存储每个file然后再重新写入。。。
但是有RAM限制所以并不能把每个file都hash。。

有没有同学有灵感的提点我一下?
我是新手

上一篇:面试官教你破解系统设计题
下一篇:【诚心求教】parseJSON from Pocket Gems
推荐
stellari 2016-2-20 14:14:53 | 只看该作者
全局:
比如这个disk使用FAT格式,那么FAT表中应该已经有以下信息:
1、每个文件的起始簇(就是你说的block)编号;
2、每个文件的大小和占用的簇个数;
3、每个簇的下一个簇的序号。

所以,这个题说白了就是每个文件都是一个链表,要把链表节点重新安排到连续空间中。

假设磁盘尾部还有足够可用空间,我想可以用这些空间当做缓存空间来进行交换:
  1. 1、维护变量 i = 0表示当前可用的簇序号,iFile = 0表示当前正在处理的文件,iClus = GET_FIRST_CLUSTER_OF_FILE(iFile)表示当前正在处理的簇序号。
  2. 2、如果disk(i)不为空,且正好是当前文件的当前簇序号(即i == iClus),就直接i++,重复2;否则3:
  3. 3、如果disk(i)处不为空,那么先将disk(i)处的内容拷贝至磁盘尾部第一个空闲簇disk(j)。同时令FAT(j) = FAT(i), FAT(i) = j,然后抹去disk(i)处内容。
  4. 4、此时disk(i)一定为空,所以可将disk(iClus)处内容直接拷贝至disk(i),同时获得此文件中下一个簇的序号:iClus = FAT(iClus)。这里有一点特别注意就是得到的新iClus如果 < i(这说明下一个簇本来是在 i 之前,但此时肯定已经被覆盖了,但是还好我们在3中保留了一个指向拷贝后位置的连接),那么就再执行一次iClus = FAT(iClus)。
  5. 5、如果此时iFile的所有簇已经处理完毕,则iFile,然后重新初始化iClus。
  6. 6、如果所有的iFile都处理完毕,则转到7,否则重复2.
  7. 7、根据原始文件的数目和大小,重建FAT表。
复制代码
以上纯属个人见解,我其实并不知道实际的defragger是怎么运作的,仅供参考。

评分

参与人数 1大米 +3 收起 理由
ttttttmix + 3 很有用的信息!

查看全部评分

回复

使用道具 举报

🔗
3652ltc 2016-2-20 16:27:22 | 只看该作者
全局:
lz 要不你查查buddy system,虽然是内存管理策略,但是对disk也是启发
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表