Переносимость open (... O_DIRECT) в C? - PullRequest
1 голос
/ 29 мая 2009

При вводе / выводе файла C можно использовать флаг O_DIRECT, чтобы минимизировать эффекты кэширования для файла open() ed. Я понимаю, что это не функция POSIX, присутствует в ядре Linux начиная с версии 2.4.10, и что Линус против интерфейса в целом. Под NetBSD, похоже, работает как рекламируется. Пример вызова:

int fd = open(filename, O_DIRECT);

Я пытаюсь написать некоторые низкоуровневые утилиты для тестирования производительности дисков, и использование O_DIRECT выглядит потенциально хорошим способом измерения производительности диска и накопителя без влияния файловой системы ОС / блочного кэша. В идеале я хотел бы иметь возможность запустить тест на Linux, Windows (Cygwin в порядке), Mac OS X и BSD. Является ли O_DIRECT лучшим способом обхода дисковых кешей ОС с точки зрения переносимости и надежности для тестирования производительности? Есть ли альтернативы?

Ответы [ 3 ]

2 голосов
/ 05 марта 2010

Для окон вы должны взглянуть на функцию CreateFile с флагами FILE_FLAG_NO_BUFFERING и FILE_FLAG_WRITE_THROUGH. (http://msdn.microsoft.com/en-us/library/aa363858(VS.85).aspx). Но тогда вам придется использовать функции Windows для чтения и записи: SetFilePointer, WriteFile, ReadFile ...

1 голос
/ 29 мая 2009

Я не думаю, что это поддерживается Windows - по крайней мере, я не могу найти упоминания в MSDN. Это означает, что он предположительно не может быть поддержан Cygwin, так как Cygwin должен использовать базовую ОС Windows.

1 голос
/ 29 мая 2009

O_DIRECT даже не существует в Mac OS X (я просто grep'd для него в / usr / include, и его там не было). Что касается Linux, что будет делать ваш инструмент, чего не делает hdparm?

...