【问题标题】:Portability of open(...O_DIRECT) in C?C 中 open(...O_DIRECT) 的可移植性?
【发布时间】:2010-10-29 19:43:18
【问题描述】:

在 C 文件 I/O 中,O_DIRECT 标志可用于最小化被 open()ed 的文件的缓存影响。我知道这不是 POSIX 功能,自 2.4.10 版以来一直存在于 Linux 内核中,并且 Linus 通常反对该接口。在 NetBSD 下,它似乎像宣传的那样工作。调用示例:

int fd = 打开(文件名,O_DIRECT);

我正在尝试编写一些低级磁盘基准测试实用程序,并且使用O_DIRECT 看起来是一种在不受操作系统文件系统/块缓存影响的情况下测量磁盘和驱动器性能的潜在好方法。理想情况下,我希望能够在 Linux、Windows(Cygwin 可以)、Mac OS X 和 BSD 系统上运行基准测试。在基准测试的可移植性和可靠性方面,O_DIRECT 是绕过 OS 磁盘缓存的最佳方式吗?有替代品吗?

【问题讨论】:

  • 您应该在调用 open(); 时包含一个标志,而不仅仅是 O_DIRECT;你所做的,隐含地,是使用 O_RDONLY,也就是 0。
  • 对于未来的 Google 搜索,这个问题由另一个 StackOverflow 问题回答:stackoverflow.com/questions/2299402/…

标签: c file caching disk


【解决方案1】:

对于 Windows,您应该查看带有标志 FILE_FLAG_NO_BUFFERING 和 FILE_FLAG_WRITE_THROUGH 的 CreateFile 函数。 (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx)。 但是你必须使用windows函数进行读写:SetFilePointer、WriteFile、ReadFile...

【讨论】:

    【解决方案2】:

    O_DIRECT 在 Mac OS X 上什至不存在(我只是在 /usr/include 中找到它,但它不存在)。至于 Linux,你的工具会做什么 hdparm 没有?

    【讨论】:

    • 谢谢。 hdparm 很有用(“hdparm --direct -t”和“hdparm --direct -T”分别给出了驱动器的顺序和突发传输率),但我还想测试随机 I/O 模式。
    【解决方案3】:

    我认为 Windows 不支持它 - 至少我在 MSDN 中找不到任何提及。这意味着 Cygwin 可能也不支持它,因为 Cygwin 需要使用底层的 Windows 操作系统。

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2011-08-11
      • 2013-01-12
      • 1970-01-01
      • 2010-09-16
      • 2010-10-02
      • 1970-01-01
      • 1970-01-01
      • 2013-05-16
      相关资源
      最近更新 更多