萌えハッカーニュースリーダー

2025/09/16 22:03 What Makes System Calls Expensive: A Linux Internals Deep Dive

出典: https://blog.codingconfessions.com/p/what-makes-system-calls-expensive
hakase
博士

やっほー、ロボ子!今日はシステムコールのオーバーヘッドについて話すのじゃ。

roboko
ロボ子

博士、こんにちは。システムコールのオーバーヘッド、興味深いテーマですね。ユーザープログラムがOSと通信する際のコストについてですね。

hakase
博士

そうそう!システムコールって、ファイル操作とか時間取得とか、色々できるけど、実は結構コストがかかるんだぞ。ユーザー空間からカーネル空間への切り替えがネックなのじゃ。

roboko
ロボ子

記事によると、x86-64アーキテクチャでは`syscall`命令を使って、ユーザー空間からカーネル空間へ移行するんですね。

hakase
博士

`syscall`命令を実行すると、プロセッサがカーネルモードに切り替わって、カーネル内のシステムコールハンドラーにジャンプするのじゃ。GSレジスタのスワップとか、ページテーブルの切り替えとか、色々やってるみたい。

roboko
ロボ子

GSレジスタのスワップは、ユーザー空間のTLSとカーネル空間のCPUごとの変数を区別するために必要なのですね。セキュリティのためにも、ユーザー空間のレジスタ値を保存したり、サニタイズしたりするんですね。

hakase
博士

そう!それに、最近は投機的実行攻撃を防ぐために、IBRSを有効にしたり、ブランチ履歴バッファをクリアしたりする処理も入ってるんだぞ。これがまたオーバーヘッドになるのじゃ。

roboko
ロボ子

システムコールのオーバーヘッドには、直接的なものと間接的なものがあるんですね。直接的なオーバーヘッドはエントリーとリターンの際に実行されるコードによるもの、間接的なオーバーヘッドはマイクロアーキテクチャの副作用によるもの、と。

hakase
博士

その通り!`clock_gettime`システムコールを例にすると、vDSOを使う方がシステムコールを使うよりずっと速いのじゃ。これは、システムコールのエントリー/エグジットパスのコストが高いことを示しているのじゃ。

roboko
ロボ子

命令パイプラインやブランチ予測にも影響があるんですね。システムコールが発生すると、CPUは保留中のユーザー命令が完了するまで待機する必要があり、システムコールから戻ると命令パイプラインがほぼ空になる、と。

hakase
博士

ブランチ履歴バッファ(BHB)のクリアや、リターンスタックバッファ(RSB)のアントレーニングも、ユーザー空間のパフォーマンスに影響を与えるのじゃ。特にBHBのクリアは、分岐予測ミスを増やしてしまう可能性があるのじゃ。

roboko
ロボ子

システムコールを削減するための方法もいくつか紹介されていますね。vDSOの使用、安価な値のキャッシュ、I/Oシステムコールの最適化、操作のバッチ処理、カーネルへの処理のプッシュなど。

hakase
博士

そう!システムコールのコストを理解して、できるだけ減らすことが、高速なソフトウェアを作るための鍵なのじゃ!

roboko
ロボ子

勉強になります、博士。システムコールのコストは、カーネルで実行される命令数だけでなく、CPUの最適化を中断させることにもあるんですね。

hakase
博士

そういうこと!最後に一つ、システムコールを減らすための究極の方法を教えるのじゃ!

roboko
ロボ子

ぜひ、教えてください!

hakase
博士

プログラムを書かないことじゃ!

roboko
ロボ子

それ、システムコール以前の問題ですね!

⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。

Search