MENU

ざっくりわかる「セマフォ」

ハマトン

セマフォって聞いたことある?

組み込み機器のソフト開発をしていると、ときどき出てくる「セマフォ」という言葉。
「なんか難しそう」「OSの話?通信の話?」と感じた人も多いのではないでしょうか。

実はこの「セマフォ」、

  • 組み込みソフトのタスク管理の場面でも、
  • 通信(RS232Cなど)のハンドシェイク信号の場面でも、

どちらでも登場する言葉なんです。

「え?同じ言葉で違う意味なの?」
「それとも、実はつながってる?」

今回の記事では、そのモヤモヤをスッキリさせるために、
**セマフォが何をしている仕組みなのか、ソフトと通信でどう違うのか?**を整理していきます。

セマフォって、ソフトでも通信でも同じなの?

ハマトン
ハマトン

ざっくり言うと:やってることはほとんど同じです!

「セマフォ」という言葉は、

  • 組み込みソフトのタスク制御の話でも、
  • 通信プロトコルのハンドシェイク信号の話でも

どちらにも登場します。

それぞれ使い方は違って見えますが、
本質的にやっていることはどちらも同じ。

🧠 共通していること

✅ “順番を守らせて、ぶつからないようにする”仕組みです。

❗ じゃあ何が違うの?

比較ソフトのセマフォ通信のセマフォ
調整する相手同じ機器内のタスクや割り込み外部の通信相手(別の機器)
調整の方法変数やOSの仕組み(内部処理)信号線を使ったやりとり(外部通信)

つまり、

目的は同じ。違うのは「場所」と「やり方」だけ。

なんです。

📝 ざっくりこう思ってもらえればOKです

セマフォは「いま使っていいか?」を確認するための“旗”や“合図”。
ソフトではプログラム内で、通信では機器同士でその旗を振り合ってるだけ。

それぞれどう使われているか、違いをもっと詳しく知りたい方へ

ここからは、

  • ソフトウェアの中でどうやって「順番待ち」が行われるのか
  • 通信ではどんなふうに信号を使ってやりとりしているのか

具体的に分けて紹介していきます!

ソフトウェアにおけるセマフォ:リソースの「順番待ち」係

組み込みソフトの中では、複数の処理(タスクや割り込み)が
同じ場所(リソース)を同時に使おうとして、バグが起きることがあります。

たとえば:

  • 通信処理とログ処理が、同じ送信バッファにデータを書き込もうとしたら?
  • センサー処理と表示処理が、同じ変数を同時に更新しようとしたら?

👉 結果:データが壊れたり、処理が飛んだりして不具合発生!


🛑 そこでセマフォの出番

セマフォは、**「今このリソースは誰かが使ってます!他の処理は待ってて!」**という旗のような役割をします。

処理の流れはこんな感じ👇
  1. タスクA「セマフォ空いてる?」
  2. 空いていれば「セマフォ取得」→ リソース使用開始
  3. タスクA「使い終わったからセマフォ返す」
  4. 待っていたタスクBがセマフォを取得して、処理に入る

🎯 セマフォを使うことで…

  • リソースの同時アクセスを防げる
  • 順番がきちんと管理される
  • マルチタスク環境でも処理が安全に進む

組み込みソフトでは、RTOSの機能として使うことが多く、
セマフォの仕組みを知らずに「なんか使ってる」状態になってる人も多いけど、
実はすごくシンプルな**「順番待ちの旗」**なんです。

通信におけるセマフォ:「送っていい?」を確認する信号たち

ここでは、RS-232Cのようなシリアル通信で登場する「セマフォ」を見ていきます。
ソフトと違って、相手は外部の機器です。

🤝 通信では“旗”を信号線でやりとりする

たとえば、機器Aと機器Bでデータを送る場合、いきなり送ると

「まだ受ける準備できてないよ!」
「重なってデータが壊れた…」

という問題が起こることがあります。

それを防ぐのが、RTS(Ready To Send)やCTS(Clear To Send)といった
「セマフォ信号」と呼ばれるハンドシェイク信号
です。

🔄 通信セマフォのやりとりの流れ

  1. 機器Aが「RTS」をON(=送る準備できた)
  2. 機器Bが「CTS」をON(=受ける準備できた)
  3. 機器Aがデータを送信!

このやりとりによって、通信の衝突やデータ破損を防いでいるんです。

🎯 ポイント

  • やってることはソフトと同じ(衝突防止)
  • ただし、やりとりは信号線を使って外部の相手と行う

busy信号との違いは?

セマフォ信号とよく似た存在として、「busy信号」という言葉もあります。
こちらも通信機器の制御に使われる信号ですが、実はセマフォ信号とは性格がちょっと違います。


🚦 busy信号は「いま使えません!」という一方的な通知

  • 機器が自分の状態を相手に知らせるための信号
  • たとえば「まだ前の処理が終わってない」「バッファが空いてない」など
  • 相手はその信号を見て、送信を控えるか判断する

つまり、「今ムリ!送らないで!」という一方通行の合図です。

🤝 セマフォ信号は「お互いに確認する」やりとり

  • 「送っていい?」(RTS)→「いいよ!」(CTS)という双方向のやりとりがある
  • お互いに状態を確認してから通信を開始する
  • 衝突を未然に防ぐための“確認付き”の仕組み

🔄 ざっくり比較するとこう!

項目busy信号セマフォ信号(通信)
主な意味今は処理中/使用不可通信可能かどうかの事前確認
やりとりの方向一方通行(状態通知のみ)双方向(ハンドシェイク)
制御の流れ相手が勝手に判断して待つ双方で合意を取ってから通信開始

📝 イメージで言えば…

  • busy信号 → 「赤信号」:とにかく止まって!
  • セマフォ信号 → 「アイコンタクト」:渡っていい?→OK!→今行くね!

✅ それぞれの“強み”を整理してみよう!

それぞれのメリットを比較してみると以下のようになります。

比較ポイントbusy信号の利点セマフォ信号の利点
シンプルさ一方的に伝えるだけなので仕組みが単純状態をやりとりするため安全性が高い
実装の容易さハンドシェイクが不要でハード構成が簡単双方向制御で通信のタイミング調整がしやすい
処理の軽さ信号のON/OFFだけで済むので処理が軽い一度の送信ミスが少なく、再送が減る=トータルで効率的
応用のしやすさ単純なステータス表示として他用途にも応用しやすいプロトコルに組み込むことで高信頼通信が可能
💡つまり:

busy信号は「シンプルでお手軽」な方法

セマフォ信号は「手間はかかるけど安心・安全」な方法。

目的や環境に応じて、適切な方式が選ばれているんです。

まとめ:「セマフォ」って、場所が違うだけでやってることは同じ

「セマフォって結局なんなの?」という疑問に対して、
ここまで見てきたように、**通信でもソフトでも“順番を守らせるための仕組み”**であるということがわかりました。

✅ 最後にざっくり整理!

用語どんな仕組み?イメージ
ソフトのセマフォタスク同士でリソースを取り合わないようにする内部の「順番待ち制御」リソース前に並ぶ順番待ちの旗
通信のセマフォ信号機器同士で「送っていい?」「OK!」と確認し合う信号(ハンドシェイク)手を挙げて合図しながら渡る横断歩道
busy信号機器が「今ムリ!」と一方的に伝える信号。相手は見て判断するだけ赤信号のような一方的な通知

🧠 視点を変えればどれも

「ぶつからないようにするための合図」

違うのは、

  • 内部でやってるか(ソフト)
  • 外部とやりとりしてるか(通信)
    • 確認付きか(セマフォ)一方通行か(busy)

この違いだけなんです。


💬 セマフォという言葉を見かけたら、
まずは「この文脈では誰と順番調整してるのかな?」と考えてみましょう。
それだけで、意味の違いに戸惑わなくなるはずです!

    ABOUT ME
    ハマトン
    ハマトン
    組み込みエンジニア
    ものづくり企業の組み込みエンジニア
    大学では電気関係の勉強をしていたが会社ではソフト開発をしている
    もちろん何もわからない
    しかし学ぶしかない
    後輩にこんな思いをさせるわけにはいかない
    そんなブログ。
    記事URLをコピーしました