回 帖 发 新 帖 刷新版面

主题:能自己开发出磁盘碎片整理软件吗?

一般的磁盘工具整理速度慢,效率不高,
能否通过分析磁盘的文件结构,提出某种最优原则,
建立切实可行的数学模型,找到一种高效的整理文件的算法!

问题可以如下描述:
给出一个很大的棋盘,上面摆放有很多颜色的棋子,
其中各个颜色的棋子都有号码表示,从1到n.
每个棋子占用一个格子.如果棋盘按行来给予每一格子编号,
那么对棋子来说,其顺序是杂乱无章的,
现在需要做一件事,就是把同颜色的棋子放到一块去,
并且同颜色的棋子按顺序摆放.
试给出一种算法,移动最少的棋子使得棋盘上棋子顺序化!

其实如果理解有些问题的话,想想这个题目原是磁盘碎片整理的另一种描述,
各位大师应该就能看懂题目了吧,颜色则表示文件,棋子编号应该是文件
块的号码,而棋盘号码则是硬盘分区号码.

希望大家可以讨论讨论!
提供一个好的解法


回复列表 (共12个回复)

沙发

操作系统为什么需要这种工具?
问题出在微软。

板凳

这不是说讨论就讨论得起来的

3 楼

很多事明知不可为而为之,为什么不试着做一个呢?
不过是讨论一下这个问题嘛

4 楼

先问几个问题好吗?
你是否想过用何种方式操做硬盘内数据?用绝对地址?还是其他方式?
你对文件管理系统有多了解?例如怎么取得一个大文件不同块在硬盘上分配的地址.
你对fat16,fat32标准是否有过深入研究,例如标志信息在哪个位置?硬盘上每个block多少字节?

如果你不了解,那么去做个清理棋盘游戏吧,这样更实际一些.

5 楼

其实我在这里讨论的主要东西是探讨算法,尽可能让外存中的数据移动次数减少
至于怎么实现,我想这个暂时不应该是主要的问题,所以我才要抽象出棋盘的事例说明这个问题.mythology似乎对我的目的有些偏激的想法.
如果您有什么好的想法,敬请赐教!

6 楼

期待各位的想法

7 楼

晕死,怎么说我有偏激的想法?

编过程的都知道内存碎片吧?没有好的内存池,不断的new然后delete.最终流下大量的小块不连续内存,再分配大的块就分配不了了.
硬盘碎块产生的原因跟这个类似.只不过硬盘对文件系统分配时候分了好多级别,先找连续的大块存储区,没有找页,再没有找块.
其实内存碎块整理不是要把同一文件放在连续存储区内(实际上大部分文件都是放在连续存储区域内的),而是把那些夹在大块存储区内的小块存储区用数据添满.

现在问题就出现了:多大的存储区算碎块?例如:一块新盘,你连续下3个1G的电影,然后把第二个删除了,那1G的存储区肯定不算随块,也不用整理.
:用什么数据填满它?这个数据要在什么位置,数据要多大都才满足添碎块的条件(这部分是最重要的,决定了操作的多少).
当然还有太多的其它问题了.

所以说你用棋盘描述硬盘碎块,这个创意是不错的.但是你把每块都设置为同样的大小,并且不以块的大小为是否移动的一个判断条件,还以把同一文件放在连续存储区为目的本身就是错误的.

如果想做内存碎块整理的算法(仅仅是算法),也必须要知道很多东西(我是不知道,网上应该有的).而你那个算法也仅仅是个棋盘整理算法而已.

8 楼

当然了,你也说了在这里仅仅是讨论算法,那就按你说的那个棋盘来吧.

9 楼

hehe,对不起,言语上有些不当
只是我想说明并不是没有讨论的必要
就当算法不可行,作为软件工程的过程也需要
经过可行性分析来决定的

整理碎块以后的结果是所有文件都顺序放置的,
因为这样可以节省磁头来回寻道的时间,
所以mythology的意思我把"每块都设置为同样的大小,
并且不以块的大小为是否移动的一个判断条件,
还以把同一文件放在连续存储区为目的本身就是错误的"的说法值得商榷,
只是我不能找到一个移动比较少的算法来移动块而已.

还是那句话,期待大家的热烈回应

10 楼

我觉得磁盘碎块产生的类型不同
怎么可能用一种算法来整理呢
所以不存在最少的步骤
只有一个适合各类型的最优算法

我来回复

您尚未登录,请登录后再回复。点此登录或注册