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 の呼び出し元に戻る、ということになるのか。もう少しきちんと検証しないとアレですが今日はちょい限界。