web-dev-qa-db-ja.com

Linuxカーネルは複数の並列syscall()リクエストをどのように処理しますか?

たとえば8コアなどのマルチコアシステムがあるとどうなるのだろうか。コアで実行されている各タスクは、同時にカーネルにsyscall()リクエストを送信します。私の質問は、カーネルが複数の並列syscall()要求を並列または順次、あるいはその他の波状に処理する方法です。

1
Monk

以前は、カーネルへの呼び出しは Big Kernel Lock を使用してシリアル化されていました。しかし、それはかなり前に削除され、その前でさえ、かなりの数のカーネルパスがBKLを使用しなくなったため、特にシステムコールは長い間並行して実行されてきました。カーネル自体にプリエンプションが導入されているため、システムコールは相互に割り込むことさえできます(詳細については、 古いLinuxカーネルのプリエンプションがない理由は何ですか? を参照してください)。

したがって、あなたの質問に対する簡単な答えは、カーネルが複数の並列システムコールを並列に処理するということです。

システムコールの実行にロックの取得が含まれる場合があります。これにより、競合するシステムコールがシリアル化されますが、時間が経つにつれて、既存のロックが削除されるか、よりきめ細かいロックに置き換えられるため、その頻度は低くなります(パフォーマンスの問題が発生する場合)。 。

2
Stephen Kitt