web-dev-qa-db-ja.com

ユーザースペースがカーネルよりも遅いのはなぜですか?

Fuseベースのファイルシステムは、ユーザースペースプログラムに実装されているため、速度が遅いことで有名だと聞きました。カーネルよりも遅いユーザースペースについてはどうですか?

3
dan

コードは、カーネル内であろうとユーザーランド内であろうと同じ速度で実行されますが、ユーザーランドコードがフープを飛び越えなければならない間にカーネルコードが直接実行できることがあります。特に、カーネルコードはアプリケーションメモリを直接マップできるため、アプリケーションメモリとハードウェアのコピー元またはコピー先の内部バッファとの間でファイルの内容を直接コピーできます。ユーザーコードは、パイプまたはソケットを介して追加のコピーを作成するか、より複雑なメモリ共有操作を作成する必要があります。

さらに、各ファイル操作はカーネルを経由する必要があります。プロセスが何かと対話する唯一の方法は、システムコールを使用することです。ファイル操作が完全にカーネル内で実行される場合、実行するユーザー/カーネル遷移とカーネル/ユーザー遷移は1つだけであり、これは非常に高速です。ファイル操作が別のプロセスによって実行される場合、プロセス間にコンテキストスイッチが必要です。これには、 [〜#〜] mmu [〜#〜] ではるかにコストのかかる操作が必要です。

速度パフォーマンスは、ほとんどのハードウェアアクセス時間に対して無視できますが、ハードウェアがボトルネックでない場合に観察できます。特に、メインプロセッサが他の処理を実行しているときに多くのハードウェア操作を非同期で実行できるため、コンテキストスイッチとデータコピープロセス間でCPUをビジー状態に保ちます。

非常に単純化:

アプリケーションがファイルを読み取りたい

アプリケーションはカーネルに要求し、カーネルアクセスファイルシステム(カーネル空間内)はアクセス許可をチェックし、アプリケーションへのファイル記述子を処理します。

ユーザースペースファイルシステムを使用すると、カーネルからユーザースペースへの切り替えが比較的遅くなります。

アプリケーションはカーネルにファイルを開くように要求し、カーネルはユーザースペースファイルシステムを呼び出し、ユーザースペースfsはディスクアクセスのためにカーネルを呼び出し、ユーザースペースfsはカーネルにデータを送信し、カーネルはユーザースペースアプリケーションにデータを渡します。

ユーザースペースファイルシステムを使用すると、より多くのコンテキストスイッチがあります。

1
Uwe Burger