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 章以降再読開始します。