Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
Linuxでは資源待ち合わせのための汎用関数として カウントセマフォが用意されている。待ち合わせが必要な資源内に semaphore型メンバを定義し,このメンバに対し、down関数 up関数を用いて資源獲得と解放を行うことができる。down関数で資源獲得に失敗した場合、up関数による資源解放が行われるまで、WAIT状態に移行する。
以下にdown関数とup関数の大まかな流れを示す。(実際にはSMP対応で面倒なアセンブラコードも入っている)up側では複雑な処理を行わず全てのプロセスを起こしてしまい、起き上がったプロセスどうしが早いもの勝ちでセマフォを取り(down)に行く。
Linuxの機能としては、シグナルで起床が可能なセマフォ関数も用意されている。
down(セマフォ) スタック上にwait_queueを用意 カレントプロセスの状態をTASK_UNINTERRUPTIBLEに変更 wait_queueにカレントタスクを登録。 セマフォにwait_queueをリンク(add_wait_queue関数) while(1) { if(セマフォ値が0である) { スケジューラを呼び出してCPUを放棄する(schedule関数) カレントプロセスの状態をTASK_UNINTERRUPTIBLEに変更 } else { セマフォ値を一つ減らす カレントプロセスの状態をTASK_RUNNINGに変更 セマフォからwait_queueを外す(remove_wait_queue関数) return } } up(セマフォ) セマフォ値を一つ増やす このセマフォで待っているプロセスを全て起こす(wake_up関数)
(NIS)HirokazuTakahashi
2000年06月11日 (日) 22時29分57秒 JST1
[PageInfo]
LastUpdate: 2008-08-27 14:46:48, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members