Как каждый делает Необработанный IO на Mac OS X? (т.е. эквивалентный флагу O_DIRECT Linux)

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

Аплодисменты Tim

15
задан Evan Shaw 22 February 2010 в 14:46
поделиться

3 ответа

После некоторого дополнительного чтения man-страницы Я наконец нашел идеальный ответ. Оказывается, 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
    }
15
ответ дан 1 December 2019 в 03:52
поделиться

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

1
ответ дан 1 December 2019 в 03:52
поделиться

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

3
ответ дан 1 December 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: