Принятый ответ правильный, но не вдаваться в подробности.
Одно из ключевых отличий между /dev/disk
и /dev/rdisk
при доступе к ним из пользовательского пространства заключается в том, что /dev/disk
буферизуется. Путь чтения / записи для /dev/disk
разбивает ввод-вывод на 4 КБ порции, которые он считывает в буферный кеш, а затем копирует в буфер пространства пользователя (а затем выдает следующее чтение 4 КБ…). Это хорошо тем, что вы можете выполнять выравнивание чтения и записи, и это просто работает. Напротив, /dev/rdisk
основном просто передает чтение или запись прямо на устройство, что означает, что начало и конец ввода / вывода должны быть выровнены на границах секторов.
Если вы выполняете чтение или запись в /dev/rdisk
размером более одного сектора, этот запрос будет сразу передан. Нижние уровни могут разбить его (например, USB разбивает его на куски по 128 КБ из-за максимального размера полезной нагрузки в протоколе USB), но в целом вы можете получить более крупные и эффективные операции ввода-вывода. При потоковой передаче, например, через dd
, от 128 КБ до 1 МБ достаточно хороших размеров, чтобы получить почти оптимальную производительность на текущем оборудовании без RAID.
Кэширование, выполняемое путями чтения / записи в /dev/disk
очень просто и почти не работает. Он кэшируется, даже если это не строго необходимо; например, если устройство может отображать карту памяти и напрямую переноситься в буфер вашего приложения. Он выполняет небольшие операции ввода-вывода (4 КБ), что приводит к значительным накладным расходам на ввод-вывод. Это не делает никакого чтения вперед или записи позади.