セマフォ

Linuxでは資源待ち合わせのための汎用関数として カウントセマフォが用意されている。待ち合わせが必要な資源内に semaphore型メンバを定義し,このメンバに対し、down関数 up関数を用いて資源獲得と解放を行うことができる。down関数で資源獲得に失敗した場合、up関数による資源解放が行われるまで、WAIT状態に移行する。

以下にdown関数とup関数の大まかな流れを示す。(実際にはSMP対応で面倒なアセンブラコードも入っている)up側では複雑な処理を行わず全てのプロセスを起こしてしまい、起き上がったプロセスどうしが早いもの勝ちでセマフォを取り(down)に行く。

Linuxの機能としては、シグナルで起床が可能なセマフォ関数も用意されている。

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
2000年06月11日 (日) 22時29分57秒 JST
1