フリーキーズ | 独学プログラミング

セマフォとは

最終更新日

セマフォとは、プログラミングで使われる概念で、プロセスの同時実行(並列処理)を管理するのに役立つ仕組みです。
ソフトウェアが複数のプロセスを同時に処理するために使用するシグナル伝達メカニズムであり、コマンドの衝突を避けるのに有効です。

セマフォの例え

いくつかの部屋がある大きなホールで盛大なイベントが開催されることを想像してください。
混乱を防ぎ、全員が整然と施設を利用できるようにするために、主催者は限られた数のトークン(カードキーなど)を配布します。トークンを持っている人だけがトイレを使えるようにし、用が済んだらトークンを返し、そのトークンは次の列に並んでいる人に渡されます。

ここではトークンがセマフォの役割を果たし、限られた資源(トイレ)へのアクセスをコントロールすることで過密状態を防ぎ、秩序を保っています。
もしトークン(あるいはセマフォ)がなかったら、トイレに人々が殺到して長蛇の列ができ、不快な思いをする可能性があります。

コンピューターでは、「トイレ」はメモリ空間やプリンターのようなリソースであり、「人々」はプログラムで実行されるプロセスやスレッドです。
セマフォは、アクセスを制御するための変数または抽象データ型のことで、利用可能なリソースの数を保持しています。すべてのリソースが使用されている(すべてのトークンが引き渡されている)間にプロセスがコードの重要なセクションに入ろうとすると、リソースが使用可能になるまで待たなければなりません。

プログラミングにおけるセマフォの仕組み

  1. 初期化: リソース(トークン)の数が設定される
  2. 待機: 重要なセクションに入る前に、プロセスはセマフォをチェックし、リソースが利用可能かどうかを確認
  3. シグナル: 重要なセクションを抜けた後、プロセスはセマフォにシグナルを送り、リソースが1つ解放されたことを伝達

セマフォを利用することで、プログラマーはプロセスのスムーズで衝突のない動作を保証することができ、デッドロックや競合などの問題を防ぐのに役立ち、より堅牢で信頼性の高いソフトウェアを作成可能になります。

一言で表すと、セマフォはイベントコーディネーターのようなもので、各プロセスが騒動を起こすことなく順番を確保し、計算空間におけるオペレーションにおいて調和のとれた流れを促進しています。