kazubits のすべての投稿

パフォーマンスチェック

***本記事にはプロモーションが含まれています。***

速くなったかも、という声があったので、OSの起動時間を比較してみました。
kqemuはなしです。

OS 0.7.2 0.8.0
Linux 4 sec 4 sec
Redhat7.2 29 sec 28 sec
Win98 53 sec 16 sec
Win2k 起動不能(以前は52sec) 47 sec

全体にほんの少し速くなっているみたい。Win98は、特に起動が速くなっています。PCIバスのコントローラーが変更になったことによると思います。また、その影響で、一度0.8.0で起動するとそのハードディスクイメージは0.7.2では使えなくなりました。

ハイパースレッドの問題

***本記事にはプロモーションが含まれています。***

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

0.8.0のバイナリ

***本記事にはプロモーションが含まれています。***

バージョン0.8.0のバイナリを作りました。ネットワークとサウンドのオプションが変わっているので注意してください。
SPARCとARMのLinuxも動くことが確認できましたので、加えることにしました。
とりあえずこんなとこかな。

CVSのリポジトリ

***本記事にはプロモーションが含まれています。***

QEMUのCVSのリポジトリの位置が変わったようです。次のようにするといいみたい。
export CVS_RSH="ssh"
cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/souces/qemu co qemu
一度、ダウンロードしてしまえば、qemuのディレクトリの中で、
cvs update
することで、アップデートできます。
パッチを作る場合は、
cvs diff -u > ../qemu-xxx.patch
とすると、パッチができます。

Ruby on Rails

***本記事にはプロモーションが含まれています。***

なんだか、Ruby on Railsが妙に気になる。言葉の響きがいいなとか感じたり。
プロトタイプに適した開発環境だそうですけど、どうなんでしょう。
プロトタイプという言葉にも反応してしまうのは、アニメの影響なんだろうけど。

selectについて調べてみた

***本記事にはプロモーションが含まれています。***

selectについてのメモ。
走り書きなので自分しかわからないかも。
サーバーではacceptで待つ。接続がくると新しいソケットが作られる。そのソケットに書き込んだり読んだりすることでデータがやりとりされる。
selectを使う順番は、
socket
bind
listen
select <--ここ accept recv/send ということらしい。 続きを読む selectについて調べてみた

全部入りのバイナリ

***本記事にはプロモーションが含まれています。***

QEMUにパッチをすべて当てたバイナリを作ってみました。Windowsがゲストのときはインストールしなおさないといけないですけど。
ディスクアクセスは少し速くなるみたいです。

VLANのaccept

***本記事にはプロモーションが含まれています。***

acceptは、使えるようにはできた。pollをselectで代用しようとしたけど、selectの使い方をよく知らないのでした。