
FUSEベースのファイルシステムはユーザー空間プログラムで実装されているため、非常に遅いと聞きました。ユーザースペースがカーネルより遅いのはなぜですか?
答え1
コードはカーネルモードでもユーザーモードでも同じ速度で実行されますが、カーネルコードが直接実行できるいくつかの点がありますが、ユーザーモードコードはいくつかの手順をスキップする必要があります。特に、カーネルコードはアプリケーションメモリを直接マッピングできるため、アプリケーションメモリとハードウェアからコピーされた内部バッファ間でファイルの内容を直接コピーできます。ユーザーコードは、パイプまたはソケットを介して追加のコピーを作成するか、より複雑なメモリ共有操作を実行する必要があります。
さらに、すべてのファイル操作はカーネルを通過する必要があります。プロセスがすべてと対話できる唯一の方法は、システムコールを介することです。ファイル操作が完全にカーネル内で行われる場合、ユーザー/カーネル変換とカーネル/ユーザー変換が1つずつのみ行われるため、非常に高速です。ファイル操作が別のプロセスによって実行される場合は、プロセス間でコンテキスト切り替えを実行する必要があります。メモリ管理ユニット。
ほとんどのハードウェアアクセス時間では、速度パフォーマンスは依然としてわずかですが、ハードウェアにボトルネックが発生しない場合、特にメインプロセッサが他のタスクを実行するときに観察できます。データコピープロセス間でCPUが使用されています。
答え2
非常に単純化されました:
アプリケーションがファイルを読み取ろうとしています。
アプリケーションはカーネルに要求し、カーネルはファイルシステム(カーネルスペース)にアクセスして権限を確認し、アプリケーションのファイル記述子を処理します。
ユーザー空間ファイルシステムの場合、カーネルからユーザー空間への移行は比較的遅くなります。
アプリケーションはカーネルにファイルを開くように要求し、カーネルはユーザー空間ファイルシステムを呼び出し、ユーザー空間fsはディスクアクセスのためにカーネルを呼び出し、ユーザー空間fsはデータをカーネルに送信し、カーネルはデータをユーザーに渡します。空間アプリケーション。
ユーザー空間ファイルシステムを使用すると、より多くのコンテキストスイッチがあります。