Как сделать Raw IO на Mac OS X?(т.е. эквивалентно флагу Linux O_DIRECT) - PullRequest
14 голосов
/ 19 февраля 2010

Я искал способ сделать необработанный (иногда называемый прямым) ввод / вывод под Mac OS.Необработанный ввод / вывод поворачивает кеш страниц операционной системы, чтобы предоставить приложению более прямой доступ к диску.Это полезно, потому что некоторые из используемых мной файловых структур неэффективны при замене страницы LRU.Довольно просто реализовать алгоритмы замены страниц, которые нам нужны, но сначала нам нужно отключить буферизацию os x по умолчанию.Мы уже сделали это под Linux, используя флаг O_DIRECT при открытии файлов.Кто-нибудь знает, как отключить буферизацию страниц под Mac OS?

Cheers Tim

Ответы [ 3 ]

14 голосов
/ 21 февраля 2010

После еще одного прочтения справочных страниц я наконец нашел идеальный ответ.Оказывается, Mac OS на самом деле имеет механизм, очень похожий на O_DIRECT, но не через функцию open, а через fcntl.В частности, есть опция F_NOCACHE, которая позволяет вам включать или выключать кеш для определенного файлового дескриптора, что именно то, что я хотел.См. http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man2/fcntl.2.html для ознакомления с полным перечнем других вещей, которые вы можете сделать с Mac-версией fcntl, и объяснением ее точного использования.Я надеюсь, что этот ответ поможет кому-то еще.


http://lists.apple.com/archives/filesystem-dev/2007/Sep/msg00010.html Хорошая тема, объясняющая, как ведет себя флаг F_NOCACHE в зависимости от номера версии вашего Mac OS.


Окончательный код (в ходу):

    r1, r2, err := syscall.Syscall(syscall.SYS_FCNTL, uintptr(self.file.Fd()), syscall.F_NOCACHE, 1)
    if err != 0 {
        fmt.Printf("Syscall to SYS_FCNTL failed\n\tr1=%v, r2=%v, err=%v\n", r1, r2, err)
        self.Close()
        return false
    }
3 голосов
/ 21 февраля 2010

Возможно, вы захотите использовать системный вызов madvise. Вы можете дать подсказки ядру о том, какие страницы нужно сначала очистить, используя MADV_DONTNEED или MADV_WILLNEED. OS X также поддерживает флаг mmap MAP_NOCACHE, который инструктирует ядро ​​сначала отбрасывать получившиеся страницы.

1 голос
/ 19 февраля 2010

Вам нужно использовать open вместо fopen, и я считаю, что для действительно необработанного доступа вам нужно читать из / dev / rdisk? напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...