Next: 実装詳細
Up: Timer
Previous: Timer
基本的な方式を以下で述べる。
- KLICで独自に、タイマを必要とする処理群のリスト(timer_wait_root)を持つ。
このリストは処理すべき時間の順に時刻と処理すべき内容(関数ポインタ)より成る。
ちなみに、このリストはフリーリスト管理しており、通常のヒープの管理とは
独立している。
- KLICは上記のリストの先頭を参照し、次にアラームを受けるべき時刻を
知り、現在の時刻と比較してその時刻にSIGALRMを受けるよう、
タイマにセットをする(このために、UNIXのsetitimer() を利用している)。
- SIGALRMを受けたら、その直後に
再度リストを参照し指定された処理を行い、
「タイマ要求リスト」の先頭を参照し、前段に戻る。
なお、実際には、リストの先頭以降が要求する時刻を
すでに過ぎていたり、同時刻に複数の処理が指定されている
可能性があるため、現在の時刻と比較し、「未来のもの」以外は
みな処理されるようにしている。
KL1レベルのタイマの実装もほぼ同様の方式であるが、
時刻が来たことの検出は、直接UNIXレベルに依頼するのではなく、
上記のタイマ管理の一環として行っている。また、KL1レベルのタイマでは、
上記のタイマが「SIGALRMを受けた直後」に動作するのに対して、
他の例外処理同様、「SIGALRMを受けた直後」のリダクションの切れ目で実際には
行われる。
Sekita Daigo
1998-05-18