受け入れられた答えは正しいですが、それは詳細には入りません。
間の主な違いの1つ /dev/disk
そして /dev/rdisk
あなたがユーザ空間からそれらにアクセスするとき、それはそれです /dev/disk
バッファリングされています。読み取り/書き込みパス /dev/disk
I / Oを4KBのチャンクに分割し、それをバッファキャッシュに読み込み、次にユーザスペースのバッファにコピーします(そして次の4KBの読み込みを発行します…)。これは、整列されていない読み取りと書き込みを実行できるという点で優れており、それだけで機能します。対照的に、 /dev/rdisk
基本的には単に読み取りまたは書き込みをデバイスに直接渡すだけです。つまり、I / Oの開始と終了はセクタの境界に合わせる必要があります。
1セクタよりも大きい読み取りまたは書き込みをすると、 /dev/rdisk
その要求はそのまま渡されます。下位層はそれを分割するかもしれません(例えば、USBプロトコルの最大ペイロードサイズのために、USBはそれを128KBの部分に分割します)が、通常はより大きくより効率的なI / Oを得ることができます。ストリーミングするときは、viaのように dd
128KBから1MBは、現在の非RAIDハードウェアでほぼ最適なパフォーマンスを得るためにはかなり良いサイズです。
によって行われているキャッシング /dev/disk
読み取り/書き込みパスは非常に単純で、ほぼ頭脳的に死んでいます。厳密には必要でなくてもキャッシュします。デバイスがメモリマップを作成してアプリのバッファに直接転送できるかのように。それは小さな(4KB)I / Oを行います、そしてそれはI / O毎の多くのオーバーヘッドにつながります。先読みも後書きもしません。