コンテキストスイッチの処理時間
名前付きパイプをJNIWrapperを使って、Javaから読み書きするテストアプリを作りました。
ついでに、2つのプロセス間を、名前付きパイプでつなぎ、1バイトをお互いに読み書きしあうのに、何秒かかるのかはかってみました。プロセスAが書いたら、それをプロセスBが読み、そして、プロセスBが書き込み、それをプロセスAが読み込むというので一サイクルです。
100万回読み書きを行い、1回あたりの読み書きの平均は90μ秒です。マシンは、Pentium4の3.2GHzです。ハイパースレッディングは有効なので、論理CPUは2個です。OSはWindows XPです。処理時間の大半は、ユーザーモードとカーネルモードの切り替え時間ではないかと想像されます。
同一のテストを PentiumM 1.2GHzで行ってみました。こちらは論理CPUは1個です。OSはこちらもWindows XPです。ユーザーモードとカーネルモードのコンテキストスイッチの時間に加えて、2つのプロセス(スレッド)の間の切り替えの1往復分の時間が追加されます。結果は、1回あたりの読み書きの平均は110μ秒でした。
クロック周波数がこんなに違うのに、結果の差はほとんどありません。
うーん、この処理時間は何が要因で決まっているのでしょうか?