オペレーティングシステム

セマフォ

セマフォは使用可能な資源数を管理します。wait()で取得し、signal()で返します。0なら資源が戻るまで待ちます。

3台分の駐車場シミュレータ

Sで3台分の空きを管理

S =3空き台数

到着を繰り返して満車にし、駐車中の車を押して退出させてください。

wait()とsignal()

S>0なら減らして進み、0なら待ちます。signal()は資源を返して待機者を起こします。起きた車が直ちに使う場合、Sは0のままです。

5枠の生産者・消費者バッファ

emptyとfullで5枠を管理

生産者
empty 5full 0
消費者

生産が速いと満杯になって生産者が停止し、消費が速いと消費者が待機します。

生産者・消費者問題

投入には空き、取出しにはデータが必要です。emptyとfullで条件を守り、バッファ自体の同時操作はミューテックスで保護します。

生産者:wait(empty)→lock(m)→投入→unlock(m)→signal(full)。消費者:wait(full)→lock(m)→取出し→unlock(m)→signal(empty)。

ミューテックスとの違い

セマフォには所有者がなく、別スレッドからsignal()できます。資源数だけでなくイベント通知にも使います。FreeRTOSの割込みから xSemaphoreGiveFromISR()でタスクを起こすのが一例です。