Edited at

セマフォを調べてみた(Linuxカーネル勉強会第二回[2017年11月])

More than 1 year has passed since last update.


[説明]

●セマフォって?

コンピュータには共有の資源(CPU、メモリ、ディスクなど)があり、それらの資源を複数のプログラムが同時に利用する時に、順番に使用させることがセマフォの役割(排他制御)

セマフォは整数で、その値は決して0未満になることは許されません。


[セマフォの種類について]

2進セマフォとカウント用セマフォの2種類)


  • 2進セマフォ(バイナリセマフォ)は「0」「1」のどちらかの値をとらない。

  • カウント用セマフォは負以外の任意の値をとることができます。


[セマフォの操作と動きについて]


  • セマフォ値を 1 増やす (sem_post)

  • セマフォ値を 1 減らす (sem_wait)

  • セマフォの値がすでに0の場合、セマフォ値が0より大きくなるまで操作は停止する。


[セマフォの動き]


  1. セマフォのフラグは初期化によって最初1はセットされる。 → 値は1

  2. プロセスが処理を開始時にsemwaitを呼ぶ(−1)。→ 値は0

  3. その後、処理の終了と共にsempostを呼ぶ(+1)。→ 値は1


[バイナリセマフォでは...]

0か1しかない為、他のプロセスが同時に処理しようとすると、フラグが0になっているためにデクリメントに失敗して処理がブロックされる。


[カウンティングセマフォ]

一つのセマフォの中に、複数個分のの実行許可を持つもの。

 例) 10個の鍵付きの空き室が有るとし、その鍵は玄関に設置されている。

空室を使うときには、玄関にある鍵を取り使い終わったらすぐに返すというルールになっています。

空室を使いたい人は多いのですが、鍵をとれなかった人は鍵が返されるまで待つということになります。

この鍵置き場と鍵がカウンティングセマフォに相当。

利用できる資源が一つではないが一定数以下しかない場合に、鍵置き場と鍵(カウンティングセマフォ)を利用して、資源を利用できる者を管理するという仕組み。


[ではSourceを確認]


/include/linux/semaphore.h

// セマフォの構造体

/* Please don't access any members of this structure directly */
struct semaphore {
raw_spinlock_t lock;
unsigned int count;
struct list_head wait_list;
};


/kernel/locking/semaphore.c

// セマフォデクリメント

void down(struct semaphore *sem)
{
unsigned long flags;

raw_spin_lock_irqsave(&sem->lock, flags);
if (likely(sem->count > 0))
sem->count--;
else
__down(sem);
raw_spin_unlock_irqrestore(&sem->lock, flags);
}

// セマフォインクリメント
void up(struct semaphore *sem)
{
unsigned long flags;

raw_spin_lock_irqsave(&sem->lock, flags);
if (likely(list_empty(&sem->wait_list)))
sem->count++;
else
__up(sem);
raw_spin_unlock_irqrestore(&sem->lock, flags);
}