ハイパースレッドの問題

Pocket

ハイパースレッドで聞いたことをまとめておくと、QEMUは、一定時間ごとに割り込みなどを処理することでエミュレーションします。Windowsホストでは、10msごとにマルチメディアタイマーを使ってコールバックルーチンを呼ぶことで処理します。マルチメディアタイマーのライブラリの内部では、スレッドを使っているようです。そのため、タイマーからコールバックルーチンが呼ばれたとき、QEMU内でのもともとの処理とコールバックルーチンの処理が並列動作となります。そのときのデータの扱いが問題となってプログラムが動作しないようです。
スレッドが並列動作となることが問題になるため、システムがハイパースレッドだったり、マルチコアなどのマルチプロセッサの時に問題となります。
Linuxはシグナルを使って、関数を呼んでいるため、プロセスは一時停止になるみたいで、動作がLinuxとWindowsで異なるようです。
これを直すには、プログラム内のどこがマルチスレッドセーフでないのかを探し出して、直すしかないです。今のSMPのサポートは、1つのプロセッサごとに時間的に順番に処理を行うことでエミュレーションしています。将来的にスレッドを使ってやろうとすると、マルチスレッドがLinux上でも問題になると思います。また、ディスクアクセスをノンブロッキングでやるパッチも出ていますが、これも問題になりそうです。
マルチスレッドのバグは見つけるのが難しいそうですけど、どうやってやるんですかね。

Pocket

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください