`/dev/null`と`null_blk`によって駆動されるデバイスの違い

`/dev/null`と`null_blk`によって駆動されるデバイスの違い

最近触れたLinux空のブロックデバイスドライバまた、null_blk特定のブロックデバイスのベンチマークではなく、I / Oスタックをベンチマークしています。このドライバで作成されたデバイス(/dev/nullb0たとえば、デバイス名を使用)は非常に興味深いものです。特に、/dev/nullデバイス名が類似していることを考慮すると、さらにそうです。 Stackoverflowはこのトピックに関する既存の質問を見つけることができなかったので、説明を求めることにしました。

私の主な質問は次のとおりです。/dev/nullデバイスドライバで生成されたブロックデバイスとの違いは何ですかnull_blk


これまでにいくつかの違いを見つけました。

  • まず、(私が理解している限り)空のデバイスは/dev/nullドライバを通過しません。ただし、その下に作成されたデバイスは、null_blkデータが通過する必要がある実際のブロックドライバです。また、fio両方のデバイスで実行して、/dev/nullランダム読み取りIOPSとコミット待ち時間の点でパフォーマンスが優れていることを確認しました。
  • /dev/null第二に、読み取りはEOF(例:)が生成されることを知っていますが、cat /dev/null試してみるとcat /dev/nullb0EOFは返されずに中断されます。
  • また、参考までにカーネル文書には設定パラメータが記載されていますが、同様の設定オプションはnull_blk表示されません。/dev/null

似た名前でも大きな違いがあるようです。これらの違いについてより正式な洞察力や説明を提供できる人はいますか?ありがとうございます!

ベストアンサー1

/dev/null はいデバイスドライバで処理されますが、これはとても簡単です。

/dev/nullとの主な違いは、null_blk前者はキャラクターデバイスであり、後者はブロックデバイスであることです。以前のプロセス文字シーケンスデバイスを使用するシステム呼び出しと、ドライバでそのタスクを実装するコードとの間に、多くの間接的な操作なしで、それを使用するプログラムが呼び出すタスクを直接実装します。後者のより複雑、セクタ全体で実行され、コマンドキューなどをサポートします。単一の要求を処理するには、より多くの作業が必要です。

もちろん目的にも大きな違いがあります。/dev/null実際の直接使用のためのものですが、null_blkブロックデバイス処理スタックの他の部分をベンチマークしたいカーネル開発者のためのサポート機能です。

おすすめ記事