プログラミングの基本セマフォとは?その役割と活用法

ざっくりと

  • 共有リソースへのアクセス制御
  • プログラムの同期をサポート
  • 使用できるリソースを示す値

セマフォとは、リソースのアクセスを制御し、プログラムを同期する仕組みです。

概要説明

セマフォとは、プログラムやファイルなどの共有リソースへのアクセスを制限する仕組みだ。なぜならば、一度に全員がアクセスするとリソースが枯渇する可能性があるからだ。

例えば、データベースの読み書きを同時に行うと、データが壊れる可能性がある。そして、その防止のためにセマフォを使用する。

つまり、セマフォはリソースを適切に管理し、データの安全を保つ役割を果たしている。だから、プログラムの安全性を確保するためには、セマフォの理解が必要だ。

職業職種

  1. ソフトウェアエンジニア
    ソフトウェアエンジニアは、プログラムの作成時にセマフォを使う。なぜなら、複数のプロセスが共有リソースに同時アクセスする際に、データの競合を防ぐためだ。例えば、マルチスレッドプログラミングではセマフォが頻繁に使用される。
  2. システムアドミニストレータ
    システムアドミニストレータも、サーバーのリソース管理にセマフォを使用する。なぜなら、リソースの利用を適切にコントロールするためだ。例えば、データベースサーバーの同時接続数を制限する際にセマフォが活用される。
  3. データベースエンジニア
    データベースエンジニアは、データベースのアクセス制御にセマフォを使う。なぜなら、同時に多くのクエリが来た時にデータの整合性を保つためだ。例えば、トランザクション処理の際にセマフォを使用する。

セマフォの名前の由来は、ギリシャ語の’sēma’(サイン)と’pherein’(運ぶ)からきています。つまり、「サインを運ぶ」ことを意味し、プログラムの中でリソースの利用状況を管理するサインの機能です。

代表例

  • Linux
    Linuxは、オープンソースのオペレーティングシステムである。なぜなら、Linuxカーネルで動作するプログラムはセマフォを活用するからだ。例えば、プロセス同士の同期や排他制御
  • Java
    Javaは、世界中で使われているプログラミング言語である。なぜなら、マルチスレッドプログラミングをサポートしていて、セマフォを使うことができるからだ。例えば、”java.util.concurrent.Semaphore”クラス。
  • Edsger W. Dijkstra
    Edsger W. Dijkstraは、計算機科学のパイオニアである。なぜなら、彼がセマフォの概念を初めて導入したからだ。例えば、彼の著作「Cooperating Sequential Processes」にその初期の概念が述べられている。

手順例

セマフォを使ってプログラムの同期を取る手順です。
  1. セマフォの宣言
    最初にセマフォを宣言する。なぜなら、プログラムで使うセマフォは最初に定義する必要があるからだ。例えば、Javaだと、Semaphore sem = new Semaphore(1);と宣言する。
  2. セマフォの使用開始
    次にセマフォの使用を開始する。なぜなら、排他制御を行う部分の直前でセマフォを取得する必要があるからだ。例えば、sem.acquire();でセマフォを取得する。
  3. 排他制御
    排他制御を行う部分を記述する。なぜなら、この部分で一度に一つのプロセスだけがアクセスできるようにするからだ。例えば、共有資源へのアクセス処理を記述する。
  4. セマフォの解放
    最後にセマフォを解放する。なぜなら、他のプロセスがアクセスできるようにするためだ。例えば、sem.release();でセマフォを解放する。

類似語

  • ミューテックス (Mutex)
    ミューテックスは、セマフォの一種である。なぜなら、ミューテックスも排他制御を行うためのツールだからだ。例えば、セマフォが1つだけのリソースを管理するとき、それはミューテックスと呼ばれる。
  • モニタ (Monitor)
    モニタは、並行処理を制御する一種の同期機構である。なぜなら、モニタも複数のプロセスやスレッド間で共有資源へのアクセスを制御するからだ。例えば、Javaのsynchronizedブロック。
  • ロック (Lock)
    ロックは、データベースでよく使われる排他制御の一形態である。なぜなら、ロックも複数のプロセスやスレッドが同時にデータにアクセスするのを防ぐからだ。例えば、行ロックやテーブルロック。

反対語

セマフォの反対語といえば、「無制限」や「全員アクセス」がある。なぜなら、セマフォがアクセスを制限する一方、これらの言葉は制限がない状態を表すからだ。

会話例

  1.  学校での友達との会話
    Q.「昨日のプログラミングの宿題、セマフォの部分が難しかったよね?」
    A.「本当にそうだよ。あれは同時にアクセスできる人数を制限するんだってさ。」
  2.  パソコンショップでの会話
    Q.「このPCで大規模なプログラムを動かすなら、セマフォは重要なの?」
    A.「うん、それは重要だよ。特に共有リソースにアクセスするときにはね。」
  3.  両親との会話
    Q.「最近学校で習ったセマフォって何?」
    A.「それはプログラムが一度にアクセスできるリソースの数を制限するものだよ。」

注意点

セマフォを使用する時の注意点は、その値の管理である。なぜならば、セマフォが0になった場合、新たにアクセスしようとするプログラムは待つ必要があるからだ。

例えば、複数のプログラムが同じファイルに書き込みをしようとしたとき、セマフォが0になったら、他のプログラムは待つしかない。だから、セマフォの値を適切に管理することが重要なのだ。

セマフォとミューテックスのは、間違えやすいので注意しましょう。

セマフォはアクセスできるリソースの数を制限するものです。

一方、ミューテックスは一度に一つのリソースにしかアクセスできないという制約があります。

記事を書いてる人

ガラケー時代からWEB開発やってる自宅SE です。

「○○を知りたい!!」「○○が分からない!!」などありましたら、Twitterでもブログでもコメントいただければ、ご期待に添えるように頑張ります!

ネット事件簿チャンネルを運営しているので、YouTubeもぜひ覗いてみてください!!

雨おやじのSNSを覗く!!
IT用語辞典
雨おやじのSNSを覗く!!
ITkagyo

コメント