システムコールとカーネルモジュールについていくつかの質問があります。
2つのアプリケーション(AとB)があり、各アプリケーションが異なるコアで実行されているとします。 (A-CPU 0, B-CPU 1) 両方のアプリケーションが同じシステムコールを並列に呼び出すと、並列に実行されますか?それでは、システムコールはどのCPUコアで実行されますか?システムコールは呼び出し元のCPUコアで実行されますか?
カーネルモジュールがあり、両方のアプリケーション(AとB)がioctlを介して(並列に)カーネルモジュールの同じ機能を呼び出すとします。並列に実行されますか?それでは、カーネルモジュール機能を提供するCPUコアは何ですか?そうでなければ、複数のアプリケーションに並列カーネルモジュール機能を提供する最も効率的な方法は何ですか?
ベストアンサー1
SMPサポートがLinuxに初めて追加されたとき、「ジャイアントロック」または「BKL」(大きなカーネルロック)、これはまだ存在します数年前まで。これは効果的にカーネルをシングルスレッドにするので(私が考えているハードウェア割り込みサービスを除く)、1つのシステムコールしかアクティブにできず、さまざまな種類のワークロードのパフォーマンスを制限します。
時間が経つにつれて、BKLはきめ細かいロックに置き換えられ、一部のシステムコールは完全に同時に実行できましたが、他の呼び出しはそうではありませんでした。簡単な例を考えてみましょう。PIDの割り当てとプロセスの作成Linuxカーネルから。 PIDが渡されました。ビットマップ、PID番号の割り当てと解放は、ロックなしのアトミック操作で完了できます。ただし、プロセステーブルのメンテナンスは、関連するデータ構造の整合性を確保するために「ワークリスト」ロックを介して行われます(pid_hash
)。
次の質問に答えてください。
両方のアプリケーションが同じシステムコールを並列に呼び出すと、並列に実行されますか?
現代のカーネルを仮定するとそうです。ただし、システムコールによっては、特定のジョブを回転、譲渡、または延期することができます。ミューテックスまたはロックを使用すると、同時呼び出しは同じデータ構造を更新したり、同じハードウェアに同時にアクセスしたりできません。
それでは、システムコールはどのCPUコアで実行されますか?システムコールは呼び出し元のCPUコアで実行されますか?
呼び出しCPUから起動します。可能厳密な好みを設定しない限り、システムコールとシステムの他の場所で発生する状況に基づいて別のCPUに再スケジュールします。しばらく考えてみるとgetCPU()syscallはより明確でなければなりません(事実を無視してください)。x86では、実際のシステムコールではない可能性があります。)。
カーネルモジュールがあり、両方のアプリケーション(AとB)がioctlを介して(並列に)カーネルモジュールの同じ機能を呼び出すとします。並列に実行されますか?
はい、モジュールは必要に応じてきめ細かいロックやその他の同期基本要素を使用すると予想されます。
それでは、カーネルモジュール機能を提供するCPUコアは何ですか?
上記と同様に、呼び出しCPUから開始されます。
そうでなければ、複数のアプリケーションに並列カーネルモジュール機能を提供する最も効率的な方法は何ですか?
モジュール(およびハードウェア)によって、効率は正しいロック(スピンロック防止、メモリコピーの削減など)を慎重に最小限にし、プロセッサの好みを正しく使用することによって異なります。システムコールを同時に処理できない、または同時に処理できない部分について尋ねると、良い答えを出すのは難しいです。これは、ドライバの特定の部分をマルチスレッドのユーザー空間デーモンに委任することで可能です(アクセラレータ自体は一度に1つのタスクしか実行できず、いくつかの小さなタスクはCPUであるいくつかの暗号アクセラレータでこれを観察しました)。
無料PDFブックLinuxデバイスドライバ(第3版)このタイプの作業、特に第5章では非常に重要です。並行性と競争条件。