v6quiz (2)

昨晩エントリについてまごろくさんが見事な回答を tweet されてます。

カーネルは実行可能なプロセスが無くなるとidleとなり、事象の発生を待つ。割り込みがこの状態から遷移する唯一の契機となる。契機には時間の経過待ち又はIOの完了待ちがあり、前者はsleep(3)、後者はread(2)が典型として例示できる。

https://twitter.com/magoroku15/status/227408842340827137 より引用
そうか IO 完了な割り込みでも、なのか。

というか

実装として以下なんですが

2218    if(p == NULL) {
2219            p = rp;
2220            idle();
2221            goto loop;
2222    }

あ、idle 手続きの実装が以下です。

1283 .globl     _idle
1284 _idle:
1285    mov     PS,-(sp)
1286    bic     $340,PS
1287    wait
1288    mov     (sp)+,PS
1289    rts     PC

で、wait という命令は適当な時間待って戻るのだろう、と思ってたんですがダウトだった模様。Lions' 本によれば以下とのこと。

ハードウェア割り込みが起こるまで、プロセッサをアイドルにし、ユニバスを解放する。

(Lions' Commentary on UNIX より引用)
こうして見るに確かに回答は最強かも。