これは、実行するアプリケーションのタイプに大きく依存します。非常にトリガーに適したWRT syscallであるアプリケーションがある場合、大量のコンテキストスイッチングが予想されます。ほとんどのアプリケーションがアイドル状態であり、ソケットで何かが発生したときにのみウェイクアップする場合、低いコンテキストスイッチレートが期待できます。
システムコール
システムコールは、それ自体の性質によりコンテキストスイッチを引き起こします。プロセスがシステムコールを実行すると、基本的にはカーネルに現在の時点とメモリから処理を引き継ぐように指示し、プロセスが実行する権限のない処理を行い、処理が完了したら同じ場所に戻ります。
Linuxのwrite(2)システムコールの定義を見ると、これは非常に明確になります。
名
書き込み-ファイル記述子への書き込み
あらすじ
#含める
ssize_t write(int fd、const void * buf、size_t count);
説明
write()は、bufが指すバッファーからファイルにcountバイトまで書き込みます
ファイル記述子fdによって参照されます。[..]
戻り値
成功すると、書き込まれたバイト数が返されます(ゼロは
何も書かれていなかった)。エラーの場合、-1が返され、errnoが設定されます
適切に。
[..]
これは基本的に、カーネルにプロセスから操作を引き継ぎ、現在のプロセスのファイル記述子count
によって示されるメモリアドレスから開始してバイトまで移動し、プロセスに戻り、どのように処理したかを伝えます。*buf
fd
これを示す良い例は、Valve Sourceベースのゲーム専用ゲームサーバーhldsです。http://nopaste.narf.at/f1b22dbc9は、プレイヤーがいないゲームサーバーの単一インスタンスによって実行される1秒のシステムコールを示しています。このプロセスは、Xeon X3220(2.4Ghz)で約3%のCPU時間を必要としますが、これがどれほど高価なのかを感じてもらうためです。
マルチタスク
コンテキストスイッチングのもう1つのソースは、syscallを実行しないが、他のプロセスのためのスペースを確保するために特定のCPUから移動する必要があるプロセスです。
これを視覚化する良い方法はcpuburnです。cpuburnはシステムコール自体を実行せず、自身のメモリを反復処理するだけなので、コンテキストの切り替えは発生しません。
アイドルマシンを取得し、vmstatを起動してから、システムに搭載されているすべてのCPUコアに対してburnMMX(またはcpuburnパッケージとは異なるテスト)を実行します。それまでにシステムを完全に使用する必要がありますが、コンテキスト切り替えはほとんどありません。その後、さらにいくつかのプロセスを開始してみてください。プロセスがCPUコアを巡って競合し始めると、コンテキストスイッチング率が増加することがわかります。切り替えの量は、プロセス/コア比とカーネルのマルチタスク解像度によって異なります。
参考文献
linfo.orgには、コンテキストスイッチとシステムコールについての優れた記事があります。ウィキペディアには、一般的な情報と、システムコールに関する素晴らしいリンク集があります。