pread / pwrite,缓冲区和磁盘缓存

时间:2016-08-15 05:17:32

标签: c caching filesystems

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

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

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

另一个问题:在阅读pread(fd, ...) / fopen() / fread()和C ++的文件流时,我只看到了有关缓冲区的内容。是不是只有这些流和fwrite()系列函数有某种缓冲区,不像open / write / read / pwrite / pread / etc?此缓冲区是否与磁盘缓存相同或不同?

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

1 个答案:

答案 0 :(得分:3)

简单的答案是'它取决于'。什么是难以描述它依赖的东西。

简单地使用open()并不能避免内核磁盘缓冲池。为此,您需要在Linux上使用特殊选项(O_DIRECT)。但是,使用open()确实可以避免使用隐藏的应用程序缓冲区;您可以选择在何处读取或写入数据,而无需任何中间副本。相比之下,f*系列函数确实有一个'隐藏'应用程序缓冲区;数据经常被读入与FILE *文件流关联的I / O缓冲区,然后复制到应用程序缓冲区中。

如果您的/dev/sdXY设备已使用文件系统格式化,但您希望确保文件的连续文件存储,则必须复制文件系统驱动程序的大部分内容以确保分配空间正确。它不太可能合理地利用你的时间和精力。是的,您需要重新实现各种低级磁盘空间管理 - 这将是完全不重要的。此外,ext4的实现与ufs等的实现完全不同 - 所以你真的要为你做好工作。