« セマフォとミューテックス(1) | トップページ

2018年7月21日 (土)

セマフォとミューテックス(2)

「自前セマフォは案外たいへん」で示したコードの改造の続きです。

次はセマフォの改造です。セマフォにはセマフォの所有者という概念は無いので、ミューテックスのように que->first が所有者を指すことは出来ません。そこで、セマフォの場合は、 que->first は次に順番を得るプロセスを指すことにします。

ミューテックスの mtx_unlock() に相当するものを、セマフォでは sem_up() としましょう。パラメータは queue_t* だけでOKです。


int sem_up(queue_t *que){
    ・・・
    if (que->count < que->max){            /* (2-1) */
        id_next = que->id[que->first];
        if (id_next){
            que->id[que->first] = 0;        /* (2-2) */
            if (++(que->first) == que->size)        /* (2-3) */
                que->first = 0;
            _os_send(id_next, que->signal);         /* (2-4) */
        } else {
            que->count++;                /* (2-5) */
        }
    } else {
        ・・・
    }
    ・・・
}

que->count はセマフォを特徴付ける数です(セマフォの値と言うらしい)。 que->maxque->count の最大値です(2-1)。2進セマフォの場合は que->max は1です。 que->id[que->first] は次に順番を得るプロセスなので、それが0でなければ、そのプロセスにシグナルを送ります(2-4)。ただし、その前に que-id[que->first] を0にしてから(2-2) que->first を更新しておきます(2-3)。 que->id[que->first] が0であったならば待っているプロセスは無いということなので que->count を増加させるだけです(2-5)。この増加が sem_up() の意味になっています(セマフォは数である)。

ミューテックスの mtx_lock() に相当するものは、セマフォでは sem_down() とします。


int sem_down(queue_t *que, process_id id){
    ・・・
    if (que->count > 0){
        que->count--;                /* (3-1) */
        spinunlock(&(que->lock));
    } else {
        err = sem_append(que, id);        /* (3-2) */
        ・・・
        _os9_sleep(&tick);
        ・・・
    }
    ・・・
}

que->count が正なら、それを減少させるだけです(3-1)。正でないならば、待ち行列に入ります(3-2)。 sem_append()mtx_append() と同じです。

以上がミューテックス化、セマフォ化の改造です。この改造を通して、ミューテックスとセマフォの違いは次のようになっていることが解りました。

  • ミューテックスは、解放時にプロセス ID を確認する。
  • セマフォは、セマフォ値を有する。

特に、セマフォ値に関しては、2進セマフォにも当てはまります。2進セマフォは0・1の区別しか無いのだから、セマフォ値は無くても良いだろうと考えそうです。しかし、セマフォ値を持つことによって、(ミューテックスで言うところの)獲得・解放を異なるプロセスで実行しても良いことが保証されるのです(セマフォ値が排他処理を助けている)。別の言い方をすると、ミューテックスは、獲得・解放が同一プロセスに限定されることによって、セマフォ値のようなものが無くても動作の整合性が保てるのです。

« セマフォとミューテックス(1) | トップページ

プログラミング」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/584699/66963083

この記事へのトラックバック一覧です: セマフォとミューテックス(2):

« セマフォとミューテックス(1) | トップページ