Lions' 本読み (51)
なんとなく newproc の以下の部分が気になったので再確認。
1904 rpp->p_addr = a1; 1905 savu(u.u_ssav); 1906 xswap(rpp, 0, 0); 1907 rpp->p_flag =| SSWAP;
ええと、a1 に格納されているのは rip->p_addr ですね。親プロセスのユーザ構造体のアドレスになります。
1894 a1 = rip->p_addr;
325p では
rpp->p_addr = *ka6;
という記述になっています。そして 1905 で_環境ポインタとスタックポインタの現在地を u.u_ssav に保存_ (Lions' Commentary on UNIX より引用) して xswap を呼び出しています。第二引数が 0 なのでコアは解放されません。
成程。生成された子プロセスが SWAP された状態で、親プロセスはそのまま動く必要があるので、こんな形になっているのか。ふむふむ。
で、1907 で子プロセスがスワップアウトされた状態、というステイタスにされて終わり、なのか。
もう少し
まだ腑に落ちていないのが二点。
- 1891 で u.u_procp に子プロセスのプロセス構造体オブジェクトが設定されて 1917 で元に戻されているのは何故か
- 1889 で u.u_rsav に savu している件
ええと最初のソレですがこれもスワップアウト対策なのか。
- 1891 で u.u_procp が子プロセスの proc 配列の要素を指す形になり
- 1982 では rip が親プロセスの proc 配列の要素を指す方いになり
- malloc 失敗した場合、xswap で u.u_procp が子プロセスを指した状態でディスクに swapout されて (ここがポイントなのかどうか
という事が根拠というか目的なのか。
あと、u.u_rsav に savu してるのは呼び出し側のナニを保存する、という意味で普通の処理でした。u.u_ssav が swapout 云々なアレでした。
次回以降
1 から 5 までをざくっと読んで 6 章以降再読開始します。