【问题标题】:pread/pwrite, buffers and disk cachepread/pwrite、缓冲区和磁盘缓存
【发布时间】:2016-12-21 08:06:58
【问题描述】:

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

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

我也很困惑是否需要重新实现低级别的东西,因为分区已经用文件系统格式化了。我读到RAW磁盘/分区就是这种情况。我已经知道需要处理哪些块是空闲的或正在使用的、文件和文件夹结构等,我已经在努力了。

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

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

【问题讨论】:

    标签: c caching filesystems


    【解决方案1】:

    简单的答案是“视情况而定”。很难描述它所依赖的内容。

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

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

    【讨论】:

    • 谢谢。我认为只需要处理哪些块是坏的、免费的或正在使用的以及文件和文件夹结构。我还需要重新实现什么?
    • 这足以让你忙一阵子,我想——它肯定会让我忙一阵子。我必须研究 ext4 文件系统才能知道还有什么需要担心的。 […经过 30 秒的思考…] 但是,我认为它是一个日志文件系统,所以你需要知道日志是如何工作的,以及如何在不弄乱的情况下对手动分配的文件进行更改提高分配空间的连续性。我非常怀疑,现在我想,这甚至是可能的。
    • 硬盘驱动器本身可以有缓存——这完全是另一种袋虫,但你可以忽略它。 HDD 应该让它看起来没有这样的缓存——除了它可能比没有这样的缓存时表现得更好。写入完成后,写入 HDD 的任何内容都应该是安全的,即使数据在 HDD 缓存中但实际上尚未在磁盘上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-18
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-12
    相关资源
    最近更新 更多