Риски и преимущества использования /dev/autofs_nowait в OS X
Во всем источнике инфраструктуры CoreFoundation вызовы API файловой системы POSIX (например, open()
, stat()
и др.) заключены в идиому, в которой дескриптор /dev/autofs_nowait
приобретено - с open(…, 0)
- до выполнения вызовов POSIX; впоследствии дескриптор close()
До выхода из сферы.
Какая польза от этого? Каковы риски?
Ли приобретать
/dev/autofs_nowait
дескриптор оказывает какое-либо влияние на флаги или влияет на нихopen()
звонки (например, напримерO_NONBLOCK
)?/dev
на моем компьютере под управлением OS X 10.10.5 есть другие записи "autofs":... ни один из которых не имеет
man
страницы доступны. Если бы эти файловые устройства могли предложить преимущества в этом ключе, мне было бы интересно услышать об их использовании также, как это может относиться.
Приложение: я не мог найти много на эту тему; В сообщении Google Plus за 2011 год утверждается, что:
[t] его файл - это специальное устройство, отслеживаемое реализацией файловой системы autofs в ядре. При открытии файловая система autofs не блокирует этот процесс ни при каких операциях ввода-вывода в файловой системе autofs.
Я не совсем уверен, что это значит (они конкретно говорили о том, как launchd
работает, FWIW), но мне самому было любопытно, поэтому я написал быструю структуру RAII context-manager-y, чтобы попробовать - нецелевое профилирование показывает тесты с вызовами POSIX, выполняющимися быстрее, но с общими хеш-метками; Я исследую эту тактику с помощью более тонкого гребня после того, как узнаю больше о том, как все это работает.
1 ответ
Эти устройства позволили разработчику (ям) избежать определения нового syscall
или же ioctl
для функциональности, и, возможно, он был реализован таким образом, потому что это было проще, требует обновления меньшего количества кода и не изменяет API VFS, что могло быть проблемой в то время.
Когда вы открываете /dev/autofs_nowait
и обходя путь, вы запускаете автоматическое монтирование, но не ждите, пока оно завершится (в противном случае ваш процесс блокируется до монтирования файловой системы или после истечения времени ожидания операции), поэтому вы можете получить ENOENT
при открытии файла, даже если все идет хорошо.
Ото, /dev/autofs_notrigger
делает процесс даже не запускает автонастройку.
Это все, что делают эти устройства. Дело в том, что в реализации Дарвина open
может блокировать при прохождении файловой системы даже с O_NONBLOCK
или же O_NDELAY
,
Вы можете следить за потоком от VFS, из open
операция vnode
:
vn_open
->vn_open_auth
->namei
->lookup
->...
По этому пути нет обработки (не) блокирующего поведения.