Lions' 本読み (34)

8 章再読。331p で expand 手続きの解説があるのですが、これって何らかの意図があるのだろうな。expand は savu および retu、swtch のそれぞのの手続きを呼び出してます。逆に expand はどこから呼び出されているのだろうか。

  • main
  • exec
  • sbreak
  • grow
  • xalloc

あたりらしい。詳細は別途で。

swtch 手続き

確認してみます。2180 で定義されている p というポインタ。

2180    static struct proc *p;

最初だけ以下な初期設定。

2184    if(p == NULL)
2185            p = &proc[0];

あとは 2197 でこうされて

2197    rp = p;

最も優先度の高い実行可能プロセスをサーチする、というナニで以下。

2203    i = NPROC;
2204    do {
2205            rp++;
2206            if(rp >= &proc[NPROC])
2207                    rp = &proc[0];
2208            if(rp->p_stat==SRUN && (rp->p_flag&SLOAD) != 0) {
2209                    if(rp->p_pri < n) {
2210                            p = rp;
2211                            n = rp->p_pri;
2212                    }
2213            }
2214    } while(--i);

ここで決定される優先度が一番高い要素なポインタから次の探索が始まる模様。

ええと

ちょっとメモを。
332p にある_問題は、「2284 行で u.u_rsav に格納された値が 2281 行で u.u_ssav に格納された値と同じならば、それらはどのようにして違いがでてくるのか」(Lions' Commentary on UNIX より引用)_という部分ですがコードを見るに

2281    savu(u.u_rsav);
2282    a2 = malloc(coremap, newsize);
2283    if(a2 == NULL) {
2284            savu(u.u_ssav);
2285            xswap(p, 1, n);
2286            p->p_flag =| SSWAP;
2287            swtch();
2288            /* リ タ ー ン し な い */

ということで誤植なのかどうなのか。実際には_問題は、「2284 行で u.u_ssav に格納された値が 2281 行で u.u_rsav に格納された値と同じならば、それらはどのようにして違いがでてくるのか」_ということになるはず。
そして 2285 行のソレが 381p にある以下な記述に対応するものと思われる。

u.u_ssav に設定したあと (2284)、
expand は xswap を呼び出し (2285)、
xswap は swap を呼び出し (4380)、
swap は sleep を呼び出し (5215)、
sleep は swtch を呼び出し (2084)、
swtch が u.u_rsav を再設定する (2189)。

Lions' Commentary on UNIX より引用
上記は_コアイメージが、たとえば、expand によってスワップアウトされたならば、(Lions' Commentary on UNIX より引用)_という部分に対応する記述ですね。
あー、それで 331p で expand の解説があるのか。
このあたりを見てると以下なコメントの意図が理解できるのかどうなのか。

2231     * 新しいプロセスがスワップアウトされていて
2232     * 停止していたならば、スタックレベルを最近の savu(u_ssav) の
2233     * 呼び出しに設定する。これは、aretu の呼び出しの
2234     * 直後に実行されるリターンが

これは swtch のリターンですな。

2235     * savu を実行した最後のルーチンから実際にリターンする
2236     * ということを意味している。

ということで expand の呼び出し元に戻る、ということになるのか。もう少しきちんと検証しないとアレですが今日はちょい限界。