UNIX v6クイズ合戦
クイズ。v6でプロセスがSIDL状態になるのはどこでしょう?また、SIDL状態になることの目的は何でしょう?
2012-07-20 13:12:36プロセスの複製を行うnewprocは、複製する子のメモリの獲得に失敗した場合、親の空間を共有した状態でswapoutを行い、子プロセスの空間をDISKに複製する。複製中に親のメモリが変化すると正しく複製されないため、複製中は親をスケジュールの対象から外す。この状態をSIDLと呼ぶ
2012-07-20 16:55:56この話、Bell研の技術誌がUNIXの特集をやったときの論文で紹介されてます。「DISK IO はDMAなのでCPUサイクルを使わない。このためforkではDISK IOを積極的に使った」←たしかこんな感じ。訳書も出ててた「UNIX原典」http://t.co/fSYKP1vd
2012-07-20 17:01:40@magoroku15 すみません、ツイート見落としてました。正解です!SSLEEP, SWAITだと実行対象からは外れるんですが、スワップアウトの対象にはなっちゃうんですよね。
2012-07-20 22:42:39@magoroku15 Sticky bitですね。テキストセグメントに対応するinodeに立ち得るフラグで、そのテキストセグメントを参照するプロセスがいなくなってもスワップ領域に残る。シェルなど再度実行される可能性が高いプログラムの再読み込みを省略できる。
2012-07-20 23:01:29あたりです @superhoge Sticky bitですね。テキストセグメントに対応するinodeに立ち得るフラグで、そのテキストセグメントを参照するプロセスがいなくなってもスワップ領域に残る。シェルなど再度実行される可能性が高いプログラムの再読み込みを省略できる。
2012-07-20 23:02:28具体的にはxfree( )でスワップ領域から"解放しない"処理が書かれている。text[ ]のエントリとスワップ領域のデータが残っているので、再実行したときはxalloc( )で単にprocからそのtext[ ]を指すだけで完了。
2012-07-20 23:05:24クイズ。v6でユーザプロセスは常に0番地から実行されるが、exec後の0番地には407/410/411の何れかがロードモジュールの形式を示すマジックナンバーが置かれている。何故0番地からの実行が可能なのか?
2012-07-20 23:09:56ヒント 4.xBSDでは真のマジックナンバとなり、代わりにa.outにentry pointが追加された。 http://t.co/ggB5sTdy
2012-07-20 23:31:20マジックナンバーがxx(伏字)命令で、飛ぶ先がxxxxx(伏字)の先頭になるということまでは理解しているのだけれど、全体像を少し見失っているので調べ中。
2012-07-20 23:35:19@magoroku15 04xxはbr(branch)命令 http://t.co/evKVFFdm
2012-07-20 23:42:57@magoroku15 例えば0407ならば2(PCのインクリメント)+14でPCは16(020)となる。020はプログラム(命令列)の開始ポイント。
2012-07-20 23:45:10…ん、execの後のユーザプロセスの0番地ってa.outの020番地(マジックナンバを含むヘッダの後。textの先頭)が来るような。あれ、なんか混乱してきた。
2012-07-20 23:55:28@magoroku15 execシステムコールの後、ユーザプロセスの0番地にはマジックナンバではなく、プログラム(text)の先頭が来ませんか?xalloc( )を見ると、a.outの先頭から020(ヘッダ分)オフセットを足して読み込んでいると思うのですが。
2012-07-21 00:14:23