
AIの初心者
「セマフォ」は、複数の仕事が共有の道具を使うときに、同時に何人まで使えるかを管理して、独り占めや混乱を防ぐ方法ですよね。ただ、実際にどう動いているのかが少しイメージしにくいです。

AI専門家
よい疑問です。たとえば、図書館に3台だけ共用パソコンがあると考えてみましょう。このパソコンが共有資源です。セマフォは、その空き状況を示す掲示板のような役割を持ちます。

AIの初心者
掲示板のように、空いている数を見ればよいということですか?

AI専門家
その通りです。3台空いていれば掲示板の数字は3です。誰かが1台使うと2になり、使い終わると3に戻ります。数字が0なら、次の人は空きが出るまで待ちます。このように、使える数を数で管理するのがセマフォの基本です。
セマフォは、複数のプログラムや処理が同じ共有資源を使うときに、アクセスできる数を管理する仕組みです。資源の取り合いを防ぎ、同時実行によるデータ破損や処理の混乱を避けるために使われます。

セマフォとは
コンピュータでは、複数の処理が同時に動くことがあります。ところが、同じプリンター、同じデータベース、同じメモリ領域などを同時に使うと、印刷結果が混ざったり、データが壊れたりする可能性があります。
このような問題を防ぐために、セマフォは共有資源の入口で交通整理を行います。イメージとしては、資源を使うための整理券や許可証を管理する仕組みです。整理券が残っていれば資源を使えますが、整理券がなければ空きが出るまで待ちます。
つまり、セマフォは共有資源を同時に使える処理の数を制御する仕組みです。これにより、プログラム同士の衝突を避けながら、限られた資源を安全に使えるようにします。
セマフォの種類
セマフォには、主に二値セマフォと計数セマフォの2種類があります。どちらも共有資源へのアクセスを管理しますが、扱う資源の数や目的が異なります。

| 種類 | 資源の状態 | 主な用途 | 例 |
|---|---|---|---|
| 二値セマフォ | 使用可能、または使用中 | 一度に1つの処理だけが使えるようにする排他制御 | プリンターへのアクセス制御 |
| 計数セマフォ | 利用可能な数を数字で管理 | 同時に使える処理数を制限する | データベース接続数、共有メモリ、ネットワーク接続数の制御 |
二値セマフォは、オンとオフのスイッチに近い仕組みです。資源が使われていなければ使用可能、誰かが使っていれば使用中になります。一度に1つの処理だけに使わせたい場面で役立ちます。
計数セマフォは、同時に使える資源が複数ある場合に使います。たとえば、データベース接続を最大10本までに制限したい場合、セマフォの値を10として管理します。接続が使われるたびに値を減らし、解放されるたびに値を増やします。
セマフォの仕組み
セマフォの中心にあるのは、利用可能な資源数を表す「値」です。プログラムが資源を使いたいときは、まずこの値を確認します。
値が0より大きければ、資源に空きがあります。その場合、プログラムは値を1減らして資源を使います。値が0なら、資源は満員です。プログラムは値が増えるまで待機します。資源を使い終えたプログラムは、値を1増やして空きを戻します。

この「使う前に減らす」「使い終わったら増やす」という操作は、必ず順番に処理される必要があります。複数の処理が同時に値を書き換えてしまうと、セマフォ自体が正しく資源数を管理できなくなるからです。
セマフォは、こうした操作を通じて同時に資源へ入れる処理数を確実に制限します。結果として、複数のプログラムが同じ資源を安全に共有できるようになります。
セマフォの利用例
セマフォは、限られた共有資源を安全に使うためにさまざまな場面で利用されます。代表的な例として、プリンター、データベース、共有メモリがあります。

| 資源 | 起こりうる問題 | セマフォによる解決 |
|---|---|---|
| プリンター | 複数の印刷ジョブが同時に動き、出力内容が混ざる | 一度に1つのジョブだけがプリンターを使えるようにする |
| データベース | 複数の処理が同じデータを書き換え、整合性が崩れる | 書き込みできる処理数を制限し、データ破損を防ぐ |
| 共有メモリ | 同時アクセスによりデータが壊れたり、予期しない動作が起きたりする | アクセスできる処理を制御し、安定した実行を保つ |
特にデータの書き込みや状態変更を伴う処理では、同時アクセスが大きな問題になります。セマフォを使うことで、処理の効率を保ちながら、データの整合性やシステムの安定性を守ることができます。
セマフォの問題点
セマフォは便利な仕組みですが、使い方を誤ると問題を引き起こします。代表的なものがデッドロックと優先順位の逆転です。

デッドロックとは、複数の処理が互いに相手の持つ資源を待ち続け、処理が永久に進まなくなる状態です。たとえば、処理Aが資源Xを持ったまま資源Yを待ち、処理Bが資源Yを持ったまま資源Xを待つと、どちらも先に進めません。
優先順位の逆転は、優先度の低い処理がセマフォを保持しているために、優先度の高い処理が待たされる現象です。重要な処理をすぐに動かしたい場面では、システム全体の応答性に影響することがあります。
これらを避けるには、資源を取得する順序を統一する、セマフォを保持する時間を短くする、タイムアウトを設定するなどの設計が重要です。セマフォは単に使えばよいものではなく、どの資源を、どの順序で、どれだけの時間保持するかまで考えて設計する必要があります。
まとめ
セマフォは、複数の処理が共有資源を安全に使うためのアクセス制御の仕組みです。利用可能な資源数を値として管理し、使う前に値を減らし、使い終わったら値を増やします。
一度に1つだけ使わせたい場合は二値セマフォ、複数個の資源数を管理したい場合は計数セマフォが使われます。プリンター、データベース、共有メモリなど、同時アクセスが問題になりやすい場面で役立ちます。
一方で、デッドロックや優先順位の逆転といった注意点もあります。セマフォを正しく使うには、仕組みだけでなく、資源の取得順序や保持時間まで含めた設計が大切です。
更新履歴
2025年2月2日 初版公開
