NetBSD 1.6/MIPSのプロセススケジューリング

hardclock()はtick毎に呼び出され、その中でroundrobin()はrrticks毎に呼び出される。

roundrobin()はneed_resched()を呼び出し、need_resched()はaston()を呼び出す。
これにより、proc構造体のmd_astpendingフラグが有効になる。

UserIntr,UserGenException,SystemCallの例外ハンドラはmd_astpendingフラグをチェックし、1ならast()を呼び出す。

ast()はpreempt()を呼び出し、preempt()は現在のプロセス(ユーザプロセス)のプライオリティ、ステータスを変更してランキューに戻し、mi_switch()を実行して他のプロセスへのコンテキストスイッチを行う。

ast()でのコンテキスト切り替えがユーザランドからの例外を起点にしているので、厳密に何ms周期でプロセスが切り替わる訳ではないようにみえる(ノンプリエンプティブ?)。