2016-08-15 194 views
1

如果我的代码执行类似fd = open("/dev/sdXY", ...)pwrite(fd, ...)/pread(fd, ...),那么I/O操作是否会跳过缓冲区或磁盘缓存?假设/dev/sdXY是未挂载的格式化磁盘分区(ext4,ufs等)。pread/pwrite,缓冲区和磁盘缓存

我问,因为需要在我正在处理的应用程序中授予连续的文件存储空间,并且我读到实现它的唯一方法就是执行类似于我所描述的操作。但是,如果这会导致丢失缓冲区,磁盘缓存或其他有用的功能,我可能会删除对连续存储的需求。

我也很困惑,如果我需要重新实现低级别的东西,因为分区已经被格式化为文件系统。我读到这是RAW磁盘/分区的情况。我已经知道需要处理哪些块是免费或正在使用的,文件和文件夹结构等,我已经在研究这个问题。

另一个问题:当我读到fopen()/fread()/fwrite()和C++的文件流时,我只看到了有关缓冲区的信息。是不是只有这些流和f*函数家族有某种缓冲区,不像open/write/read/pwrite/pread/etc?这个缓冲区是否与磁盘缓存相同或不同?

最后一个:HDD缓存是由自己的驱动器还是由文件系统(ext4,ufs等)处理?

回答

2

简单的答案是'它取决于'。什么是困难的特点是什么依赖。

只需使用open()不会避免内核磁盘缓冲池。要做到这一点,你需要Linux上的特殊选项(O_DIRECT)。但是,使用open()确实避免使用隐藏的应用程序缓冲区;您可以选择数据读取或写入的位置,而不需要任何中间副本。相比之下,f*函数家族确实有一个'隐藏'的应用程序缓冲区;数据经常被读入与FILE *文件流关联的I/O缓冲区,然后复制到您的应用程序缓冲区中。

如果您/dev/sdXY设备已格式化的文件系统,但要确保文件连续文件的存储,你将不得不复制文件系统驱动的显著部分,以确保您正确地分配空间。这不太可能是你的时间或精力的合理使用。是的,你需要重新实现各种低级别的磁盘空间管理 - 这将是完全不重要的。此外,ext4的实现将与ufs等的实现完全不同 - 因此,您真的可以为自己裁减工作。

+0

谢谢。我认为只需要处理哪些块是坏的,自由的或正在使用的以及文件和文件夹结构。我还需要重新执行什么? –

+0

这足以让你忙一阵子,我想 - 这肯定会让我忙一阵子。我不得不研究ext4文件系统以了解还有什么需要担心的。 _ [... 30秒的思考时间...]但是,我认为这是一个日记文件系统,因此您需要知道日志记录的工作方式,以及如何更改手动分配的文件,而不会扰乱文件的连续性分配空间。我怀疑,现在我想,甚至有可能。 –

+0

硬盘本身可以存储缓存 - 这是一个可以忽略的其他类型的袋子。硬盘应该让它看起来没有这样的缓存 - 除了它可能比没有这样的缓存更好的性能。一旦写入完成,写入HDD的任何内容都应该是安全的,即使数据位于HDD缓存中,但实际上还不在磁盘上。 –