~からhttps://unix.stackexchange.com/a/472920/674
「文字デバイス」と「ブロックデバイス」は、Unixスタイルのシステムでさまざまなデバイスを分類するために一般的に使用される抽象概念です。
デバイスは、ハードウェア(デバイスまたはデバイスコントローラ)、デバイスドライバ、ファイルシステム、オペレーティングシステムカーネルI / Oサブシステム、および/または他のものによって決定されるブロックデバイスまたは文字デバイスですか?
これは、デバイスドライバ、ファイルシステム、オペレーティングシステムのカーネルI / Oサブシステムとは無関係の純粋なハードウェア(デバイスまたはデバイスコントローラ)の概念であると思います。
~からブロック/文字デバイスとランダム/シーケンシャルアクセスの間に影響はありますか?
目に見える唯一の違いは、ブロックデバイスはバッファキャッシュを使用し、文字デバイスは使用しないことです。 (一部のブロックデバイスドライバは、ファイルごとにバッファキャッシュをバイパスするオプションを提供できます。)
バッファキャッシュは、デバイスドライバ、ファイルシステム、またはハードウェア(デバイスまたはデバイスコントローラ)によって提供されるブロックデバイスで使用されますか?ハードウェアによって決定された場合、そのデバイスがブロックデバイスであるかキャラクタデバイスであるかは、完全にハードウェア(デバイスまたはデバイスコントローラ)によって決定されることを意味しますか?
ありがとうございます。
答え1
いいえ、これはオペレーティングシステムによって決定されます。
FreeBSD アーキテクチャマニュアル日付は2018年9月23日11時38分04秒です。
9.4 ブロック装置(消失)
他のUNIX®システムは、ブロックデバイスと呼ばれる2番目のタイプのディスクデバイスをサポートできます。ブロックデバイスは、カーネルがキャッシュを提供するディスクデバイスです。ディスクI / Oインフラストラクチャの近代化の一環として、FreeBSDはキャッシュされたディスクデバイスのサポートを中止しました。
FreeBSDには、まだディスクブロックを読み書きできる文字デバイスである「raw」デバイスがあります。
名前のせいで混同しないでください。ブロックデバイスはバッファリングを提供するため、バイト単位で読み書きできます。生デバイスは文字デバイスですが、ブロック単位で読み書きする必要があります。ブロックサイズは特定のディスクハードウェアによって異なります。
「文字デバイス」は、元の名前が指定されていたはずです。テレタイププライター実際に一度に1文字ずつ動作する端末。ブロックデバイスは、デバイスドライバと直接対話するのではなく、バッファキャッシュと対話read()
する特別なケースです。write()
文字デバイスは一般的なケースになり、他のすべてのデバイスファイルに使用されます。インターフェイスは、デバイス固有read()
と。write()
ioctl()
https://en.wikipedia.org/wiki/Device_file#Block_devices
ほとんどのシステムは、ハードディスクなどのハードウェアを表すためにブロックデバイスと文字デバイスを作成します。 FreeBSDとLinuxは明らかにこれを行いません。前者はブロックデバイスのサポートを削除し、[6]後者はブロックデバイスのみを生成します。Linuxでは、ディスク上の文字デバイスを取得するには、「raw」ドライバを使用する必要があります。ただし、Linux固有のフラグを使用してブロックデバイスを開くと、文字デバイスを開くのと同じ効果が得られます
O_DIRECT
。特殊ファイルのブロックまたはブロックデバイスハードウェアデバイスへのバッファリングされたアクセスとその詳細のいくつかの抽象化を提供します。 [5]文字デバイスとは異なり、ブロックデバイスを使用すると、プログラマは常にすべてのサイズ(単一文字/バイトを含む)とすべてのソートのブロックを読み書きできます。欠点は、ブロックデバイスがバッファリングされるため、プログラマは、書き込まれたデータがカーネルバッファから実際のデバイスに転送されるのにどれくらい時間がかかるか、実際には2つの別々の書き込みが物理デバイスにどの順序で到着するかを知ることができないことです。デバイス。さらに、同じハードウェアが文字デバイスとブロックデバイスの両方を公開している場合、文字デバイスを使用するクライアントはブロックデバイスバッファの変更を認識しないため、データ破損の危険があります。