Переносимость open(O_DIRECT) в C?

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

int fd = open(filename, O_DIRECT);

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


person cheduardo    schedule 29.05.2009    source источник
comment
Вы должны включить флаг, отличный от O_DIRECT, в вызов open(); то, что вы сделали, неявно, это использование O_RDONLY, также известного как 0.   -  person Jonathan Leffler    schedule 29.05.2009
comment
Для будущих поисков Google на этот вопрос отвечает другой вопрос StackOverflow: stackoverflow.com/questions/2299402/   -  person Evan Jones    schedule 07.08.2010


Ответы (3)


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

person imaspy    schedule 05.03.2010

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

person Dietrich Epp    schedule 29.05.2009
comment
Спасибо. hdparm полезен (hdparm --direct -t и hdparm --direct -T дают скорость последовательной и пакетной передачи соответственно), но я также хотел бы протестировать случайные шаблоны ввода-вывода. - person cheduardo; 29.05.2009

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

person Community    schedule 29.05.2009