【问题标题】:How to implement defragmantation-like method in file system如何在文件系统中实现类似碎片整理的方法
【发布时间】:2013-10-12 20:01:53
【问题描述】:

我用 C 构建自己的虚拟文件系统。

现在我想实现某种碎片整理方法,它会查找间隙并关闭它们。

因此,如果文件 1 的大小为 10,位于 X 位置,文件 2 的大小为 20,位于 Z 位置,我希望它移动到 Y 位置。

我现在的想法是取文件 2 的大小,从文件 1 的大小中减去它,然后使用结果将文件 2 向左移动,与结果一样高。

我有一个伪代码,因为我想不出一个可行的解决方案:

for (int i = 0; i < files; i++) 
     //look for inconsistencies/gaps. 

if (found gaps)
    file 2 - file 1 = x;
    shiftfiletotheleft x bytes;

提前感谢您的想法和答案。

【问题讨论】:

  • “我如何为我发明的虚拟文件系统实现碎片整理”在此处方式超出了范围。尝试询问 Google 碎片整理的工作原理。

标签: c file system virtual vfs


【解决方案1】:

天真的碎片相当简单,假设disk[n] 指的是第 n 个块,files 是所有文件(或更准确地说,它们占用的块)的集合,包括一个所有剩余块的伪文件:

i = 0
for file in files:
  for blocknum in file:
    // Swap content
    buf = disk[i]
    disk[i] = disk[blocknum]
    disk[blocknum] = buf

    // Swap metadata
    swap_block(file, blocknum, i)
    file += i
    changed_file = find_file_by_block(blocknum)
    swap_block(changed_file, i, blocknum)

    i += 1

请注意,为了获得良好的用户体验,可以进行多种优化。例如,由于您无论如何都需要按块编号查找文件,因此您可以通过始终选择当前检查的 (i-th) 块所属的文件来防止已经碎片整理的文件系统被重新排序到。此外,如果您要交换的文件为空,您当然可以通过不实际复制内容来简化交换,如果blocknumi 相同,则完全跳过交换操作。

不过,伪代码如何转换为 C 代码完全取决于您的实现。

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 2010-10-16
    • 2011-08-10
    • 1970-01-01
    • 2021-11-28
    • 2012-08-05
    • 2014-06-10
    • 1970-01-01
    相关资源
    最近更新 更多