Причем я гуглящий для способа сделать сырые данные (иногда названный прямым) i/o в соответствии с Mac OS. Сырые данные i/o повороты кэша страницы операционной системы дать приложению более прямой доступ к диску. Это полезно, потому что некоторые filestructure, которые я использую, не являются эффективной заменой страницы LRU использования. Это является довольно прямым для реализации заменяющих алгоритмов страницы, в которых мы нуждаемся, но сначала мы должны выключить OS x буферизация по умолчанию. Мы уже сделали это в соответствии с Linux с помощью флага O_DIRECT когда вводные файлы. Кто-либо знает, как выключить буферизацию страницы в соответствии с Mac OS?
Аплодисменты Tim
После некоторого дополнительного чтения 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
}
Вам нужно использовать open
вместо fopen
, и я полагаю, что для реального доступа вы должны читать из / dev / rdisk? напрямую.
Вы можете использовать системный вызов madvise
. Вы можете указать ядру, какие страницы следует очистить в первую очередь, используя MADV_DONTNEED
или MADV_WILLNEED
. OS X также поддерживает флаг mmap
MAP_NOCACHE
, который дает указание ядру сначала отбросить результирующие страницы.