sem_overview - POSIX セマフォの概要
POSIX
セマフォを使用すると、プロセスやスレッド間でその動作を
同期させることができる。
セマフォは整数であり、その値は決して
0
未満になることは許されない。
セマフォに対してできる操作は
2 つである:
セマフォ値を 1 増やす (
sem_post(3)); セマフォ値を 1
減らす (
sem_wait(3))。
セマフォの値がすでに
0
の場合、セマフォ値が
0 より大きくなるまで
sem_wait(3) 操作は停止 (block)
する。
POSIX
セマフォには、名前付きセマフォ
(named semaphore) と
名前なしセマフォ (unnamed
semaphore) の 2つの形がある。
- 名前付きセマフォ
- 名前付きセマフォは
/somename
という形式の名前で識別される。
その名前は、最大で
NAME_MAX-4 (すなわち 251)
文字のヌル終端された文字列で、
スラッシュで始まり、スラッシュ以外の文字が
1
文字以上続く形式である。
sem_open(3)
に同じ名前を渡すことにより、2
つのプロセス間で同じ名前のセマフォ
に対し操作を行うことができる。
-
sem_open(3)
関数は、新しい名前付きセマフォを作成するか、既に存在する名前付き
セマフォをオープンする。
セマフォをオープンした後は、
sem_post(3) と sem_wait(3)
を使ってセマフォを操作できる。
プロセスがセマフォの使用を終えた際は、
sem_close(3)
を使ってセマフォをクローズできる。
あるセマフォをどのプロセスも使用しなくなると、
sem_unlink(3)
を使ってそのセマフォをシステムから削除することができる。
- 名前なしセマフォ
(メモリーベースセマフォ)
- 名前なしセマフォは名前を持たない。その代わり、セマフォは、
複数スレッド間で共有されるメモリー領域、もしくは複数プロセス間で
共有されたメモリー領域に置かれる
(前者を
スレッド共有セマフォ
(thread-shared semaphore)、 後者を
プロセス共有セマフォ
(process-shared semaphore)
と呼ぶ)。スレッド共有セマフォは、同じプロセス内のスレッド間で共有される
メモリー領域、例えば大域変数
(global variable) に配置される。
プロセス共有セマフォは、共有メモリー領域
(例えば、 shmget(2)
を使って作成できる
System V
共有メモリーセグメントや
shm_open(3)
を使って作成できる
POSIX
共有メモリーオブジェクト)
内に配置しなければならない。
- 名前なしセマフォは、使用する前に
sem_init(3)
を使って初期化しなければならない。
セマフォは sem_post(3) と
sem_wait(3)
を使って操作できる。
セマフォがもはや必要なくなったときや、
セマフォが置かれているメモリーを解放する前には、
sem_destroy(3)
を使ってセマフォを破棄すべきである。
この節の残りでは、POSIX
セマフォの Linux
の実装の詳細
について説明する。
バージョン 2.6
より前のカーネルでは、Linux
は
名前なしのスレッド共有セマフォのみをサポートしていた。
Linux 2.6 と NPTL
スレッド実装を提供している
glibc が入った
システムでは、POSIX
セマフォの完全な実装が提供される。
POSIX
名前付きセマフォはカーネル内で保持される。
sem_unlink(3)
で削除されなければ、セマフォは
システムがシャットダウンされるまで存在し続ける。
POSIX セマフォ API
を使用したプログラムは
cc -pthread
でコンパイルし、リアルタイムライブラリ
librt
とリンクしなければならない。
Linux
では、名前付きセマフォは仮想ファイルシステム
(virtual file system) 内に
sem.somename
という形の名前で作成される。仮想ファイルシステムは通常
/dev/shm
以下にマウントされる。
(これが、セマフォの名前の文字数の上限が
NAME_MAX ではなく
NAME_MAX-4
となっている理由である。)
Linux 2.6.19
以降では、このディレクトリ配下のファイルに対して
ACL を
設定でき、オブジェクトへの許可をユーザー単位、グループ単位で制御することが
できる。
System V セマフォ (
semget(2),
semop(2)
など) は古いセマフォ API
である。 POSIX
セマフォは System V よりも
簡単で、うまく設計されたインターフェースを提供している。
一方で、POSIX セマフォは
System V
セマフォと比べると
利用できるシステムが少ない
(特に、古いシステムでは少ない)。
各種の POSIX
セマフォ関数を使用した例が
sem_wait(3)
に記載されている。
sem_close(3),
sem_destroy(3),
sem_getvalue(3),
sem_init(3),
sem_open(3),
sem_post(3),
sem_unlink(3),
sem_wait(3),
pthreads(7),
shm_overview(7)
この man ページは Linux
man-pages
プロジェクトのリリース
5.10
の一部である。プロジェクトの説明とバグ報告に関する情報は
https://www.kernel.org/doc/man-pages/
に書かれている。