野田@rogiken.orgです。

turss が実はマルチプロセッサ環境で子プロセスを追えないのでは?という
疑問があったので皆様のお知恵かりたくメールしました。
当方、マルチプロセッサなマシンを持っていないので実験できてないので
実験して下さる方がいると幸いです。


使用環境はFreeBSD 6.2です。

推定される現象:
マルチプロセッサ環境で複数のスレッドから高頻度にシステムコールを
発生させ、そのうちの一つのスレッドでforkを行うようなプログラムを
truss -fでトレースする。
すると、偶にtrussが追いかけられない子プロセスができる



ソースを読んでいて疑問に思った点は以下です:

usr.bin/truss/main.cによるとforkされた場合の挙動は以下の通りです。
1.システムコールを呼び出す前のフックでシステムコールがforkならin_forkフ
ラグを立てる
2.システムコールを呼び出した後のフックでin_forkフラグが立っていれば
 返値を見て子プロセスをtruss自信もforkして子プロセスをアタッチする。

複数のシステムコールが同時に呼び出される事がないシングルプロセッサ
環境ではうまくいきますが、システムコールが複数同時に呼ばれる
システムではforkの呼び出しの次にforkの終了が補足できるとは
限らないのでこけるのでは?という疑問があります。

実際に sys/ibcs2/ibcs2_sysent.cを見るとforkはMPSAFEとして定義されています。


対策として、in_forkフラグを使うのではなく、
ioctl(Procfd,PIOCWAIT,&pfs)で得られるpfs.valueを以下の条件で調べればよい
とは思うのですが。。。
pfs.value==SYS_fork ||pfs.value==SYS_rfork ||pfs.value==SYS_vfork


メールによる返信