[[PageNavi(internal22-navi)]]
{{{ comment
h2w-title:セマフォ
}}}
= セマフォ = #SECTION02160000000000000000
Linuxでは資源待ち合わせのための汎用関数として カウントセマフォが用意されている。待ち合わせが必要な資源内に semaphore型メンバを定義し,このメンバに対し、down関数 up関数を用いて資源獲得と解放を行うことができる。down関数で資源獲得に失敗した場合、up関数による資源解放が行われるまで、WAIT状態に移行する。
以下にdown関数とup関数の大まかな流れを示す。(実際にはSMP対応で面倒なアセンブラコードも入っている)up側では複雑な処理を行わず全てのプロセスを起こしてしまい、起き上がったプロセスどうしが早いもの勝ちでセマフォを取り(down)に行く。
Linuxの機能としては、シグナルで起床が可能なセマフォ関数も用意されている。
[[Embed(internal22-images:img7.gif)]]
{{{
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 [[BR]]2000年06月11日 (日) 22時29分57秒 JST''1
[[PageNavi(internal22-navi)]]