![]() |
1
2
根据我的理解
关于其他优化的实际答案从如何存储文件的介绍开始,如果您已经知道了,可以跳过它。 在典型的Linux FS中,文件的存储方式有三层:
例如,硬链接是某个目录中的记录,它指向与“原始”文件相同的inode(并增加inode中的“链接计数器”)。这意味着只有文件名(可能还有目录)是不同的,其余的数据和元数据在硬链接之间共享。请注意,创建硬链接是一种非常快速的文件复制方法。唯一的缺点是两个文件现在都必须永远共享它们的内容,所以这不是真正的副本。但是如果我们用一些 copy-on-write 方法修复“write”部分,效果会很好。这就是一些金融服务机构(如 Btrfs )通过回流进行支撑。 这种在写时复制的技巧的思想是,您可以使用新的适当元数据创建一个新的inode,但仍然共享相同的数据块。您还可以在inode元数据的“不可见”部分的两个inode之间添加交叉引用,这样它们就知道它们共享数据块。显然,与真正的拷贝相比,这个操作非常快。再说一次,只要文件是只读的,所有的工作都是完美的。但与硬链接不同的是,我们可以处理写操作,并将它们视为独立的。执行某些写入操作时,fs会检查文件(或者更确切地说,inode)是否是数据块的唯一所有者,否则会在写入数据块之前复制数据。根据FS实现的不同,它可以在第一次写入时复制整个文件,也可以存储一些更详细的元数据,只复制必须修改的块,其余的块仍在文件之间共享。在以后的情况下,如果写大小大于块,则可能根本不需要复制块。
所以最简单的技巧
如果fs支持数据块上更详细的元数据,那么还可以进行一些更高级的优化。假设您将文件开头的前n个字节复制到一个新文件中。然后,fs可以共享起始块,可能只需要复制最后一个未完全复制的块。 |
![]() |
CaTx · 使用带有一个大于号和两个大于号的回波的区别 2 年前 |
![]() |
Ari157 · x86_64 Linux程序集中的逻辑与实现 2 年前 |
![]() |
Ty Q. · 分段故障GLFW3/GLAD 2 年前 |
![]() |
ShortArrow · 如何使用git管理链接源文件? 2 年前 |
![]() |
Bastien L. · 多Linux Grafana集成 2 年前 |