Filesystems 将数据前置到文件

Filesystems 将数据前置到文件,filesystems,prepend,Filesystems,Prepend,据我所知,在任何操作系统中,程序都无法高效地将数据预先添加到文件中。 然而,这似乎并不困难——如果需要,文件系统可以向文件描述符添加另一个扩展数据块 所以问题是,为什么操作系统不实现这个(相当琐碎的)操作呢?在为文件添加数据之前,总是存在分配空间的问题。由于文件描述符指向文件流的开头,因此向文件追加额外空间比预加要容易得多。如果要附加到文件,则无需更改文件描述符,只需更改文件大小和分配的内存即可。如果要预先添加到文件,则必须立即实例化新的文件描述符,以便首先将预先添加的数据写入,或者在更新原始文

据我所知,在任何操作系统中,程序都无法高效地将数据预先添加到文件中。 然而,这似乎并不困难——如果需要,文件系统可以向文件描述符添加另一个扩展数据块


所以问题是,为什么操作系统不实现这个(相当琐碎的)操作呢?

在为文件添加数据之前,总是存在分配空间的问题。由于文件描述符指向文件流的开头,因此向文件追加额外空间比预加要容易得多。如果要附加到文件,则无需更改文件描述符,只需更改文件大小和分配的内存即可。如果要预先添加到文件,则必须立即实例化新的文件描述符,以便首先将预先添加的数据写入,或者在更新原始文件时存储预先添加的数据的位置


创建新的文件描述符可能很棘手,因为您还必须更新指向它的任何引用。这就是为什么操作系统很容易实现附加数据,而实现预结束则稍难的原因。

我认为这并不像你所说的那么容易。的确,文件系统可以分配一个新块,在其中存储预先指定的数据,将文件指针更改为指向该块,然后从该块链接文件的其余部分。就像在链表前面添加一个节点一样,对吗


但是,当(可能是这种情况)前置数据没有填充指定的块时会发生什么。我不认为许多文件系统会有链接部分块的机制,但即使它们这样做了,也会导致效率低下。你最终会得到一个大部分由空块组成的文件,你必须读写整个文件才能对其进行碎片整理。最好在开始准备时先进行读写操作。

前几天,我回答了一个类似的问题,我花了45分钟试图找到一个XFS
ioctl()
,可以做到这一点;但在很长一段时间没有找到它之后,我放弃了——也许是我的记忆误导了我。尽管我不认为它是琐碎的(无论如何都不象追加:),但我同意提供预编支持应该使某些任务比通常的读写每个字节的方法运行得快得多。+1:预编部分块是必要的反例,可以证明该操作不是“相当琐碎的”.啊,你完全正确!!我完全忘记了那座大楼不会被完全填满的情况,傻我。:)谢谢你的解释+1个很好的答案,那就是我正在寻找的答案,我没有想到这个块可能不会被填满,和OP一样思考:6年后回首这个答案,我不再相信:-如果你可以追加,你可以准备…您只需镜像完全相同的算法。文件系统将支持主要与之相关的操作系统所需的任何内容(这就是它们通常的编写方式),因此缺乏支持并不能令人信服。我有预感正确答案可能是什么,但我想我会留下这条评论,看看是否有人首先有回应。。。