Lions' 本読み (36)

朝練メモ。なんとなく俯瞰できてるカンジがしてる中でもっかい runin とか runout あたりの xref を見ながら中身を確認してみるなど。

runin

sched 手続きで非ゼロになって sleep してます。優先度も非ゼロ (というか負)。

1953 sloop:
1954    runin++;
1955    sleep(&runin, PSWP);

で、sleep で値チェックして wakeup してます。

2080            if(runin != 0) {
2081                    runin = 0;
2082                    wakeup(&runin);
2083            }

ちなみに上記は優先度が 0 以上の場合なブロックの中になってます。そしてもう一つは clock 手続きの以下の部分になります。

3820            if(runin!=0) {
3821                    runin = 0;
3822                    wakeup(&runin);
3823            }

で、この runin というのは契機として sleep 乃至 clock 割り込みで sched (proc#0) が起こされるんですが、sched の中で runin な状況 (372p に説明あり) であれば再び sleep するしそうでなければ、という事なんですね。

runout

実行状態でスワップアウトな状態のプロセスが無い場合、sched 手続きで以下な処理が適用される。

1966    if(n == -1) {
1967            runout++;
1968            sleep(&runout, PSWP);
1969            goto loop;
1970    }

次に出てくるのは setrun 手続き。setrun で実行状態にされたプロセスがスワップアウトな状態であれば runout で wakeup してますね。

2140    rp->p_stat = SRUN;
(中略
2143    if(runout != 0 && (rp->p_flag&SLOAD) == 0) {
2144            runout = 0;
2145            wakeup(&runout);
2146    }

で、runout を云々しているのは 372p の記述にある通り、xswap 手続きの以下の部分。

4387    if(runout) {
4388            runout = 0;
4389            wakeup(&runout);
4390    }

xswap はスワップアウトな処理になるので proc#0 を起こして sched で云々してね、という事になるのか。成程。

runrun

調子に乗って runrun も確認。setrun では実行状態にするプロセスが curpri よりも優先度が高いのであれば runrun++ してます。

2141    if(rp->p_pri < curpri)
2142            runrun++;

あるいは setpri 手続きでも設定した優先度より、って

2165    if(p > curpri)
2166            runrun++;

ええと、例の参考書でも_バグっぽい?_という記述があるんでスルーします。ちなみに swtch 手続きの中で初期化されてます。

2195 loop:
2196    runrun = 0;

あとは clock 割り込みで 4 秒に一回なナニが以下の記述。

3806            if((time[1]&03) == 0) {
3807                    runrun++;
3808                    wakeup(&lbolt);
3809            }

で、この runrun 値でどのような作用が生じるかというとアセンブラで記述されている call 手続きで以下。

0785    jsr      pc,*(r0)+
0786 2:
0787    bis      $340,PS
0788    tstb     _runrun
0789    beq      2f
0790    bic      $340,PS
0791    jsr      pc,_swtch
0792    br       2b

割り込みから戻って runrun のチェックをしてこれが非ゼロなら swtch を呼び出してます。上記でチェックしたら優先度の高いプロセスが居るので swtch でプロセスを切り替える、という理解で良いのかな。
runrun での切り替わりは proc#0 以外のプロセスに直接切り替わり、という事なのか。