A resposta aceita está certa, mas não entra em muitos detalhes.
Uma das principais diferenças entre /dev/disk
e /dev/rdisk
, quando você as acessa do espaço do usuário, é que /dev/disk
está em buffer. O caminho de leitura / gravação para /dev/disk
divide os blocos de E / S em 4KB, que ele lê no cache de buffer, e copia no buffer de espaço do usuário (e emite a próxima leitura de 4KB…). Isso é legal porque você pode fazer leituras e gravações desalinhadas, e isso simplesmente funciona. Em contraste, /dev/rdisk
basicamente passa a leitura ou escreve diretamente no dispositivo, o que significa que o início e o fim da E / S precisam estar alinhados nos limites do setor.
Se você ler ou escrever mais de um setor para /dev/rdisk
, essa solicitação será transmitida diretamente. As camadas inferiores podem dividi-lo (por exemplo, o USB divide em 128 KB devido ao tamanho máximo de carga útil no protocolo USB), mas geralmente você pode obter I / Os maiores e mais eficientes. Quando o streaming, como via dd
, 128 KB a 1 MB são tamanhos muito bons para obter um desempenho quase ideal em hardware não-RAID atual.
O cache que está sendo feito pelos caminhos de leitura e gravação de /dev/disk
é muito simples e quase com morte cerebral. Ele armazena em cache, mesmo que não seja estritamente necessário; como se o dispositivo pudesse mapear a memória e transferir diretamente para o buffer do seu aplicativo. Ele faz pequenas E / Ss (4KB), o que leva a muita sobrecarga por E / S. Não faz nenhuma leitura adiante ou escreve atrás.