7

私は中間試験のために勉強していますが、これは練習問題の 1 つでした: セマフォのカウント (つまり、任意の値を保持できるセマフォ) が、バイナリ セマフォと通常の機械語命令のみを使用してどのように実装できるかを示してください。

どこから始めればいいのかわからない。これはオンラインで見つけました。

P(s) { Pb(mutex_s); s = s-1; if(s < 0) {Vb(mutex_s); Pb(delay_s);} Vb(mutex_s); }
V(s) { Pb(mutex_s); s = s+1; if(s <= 0) Vb(delay_s); else Vb(mutex_s); }

残念ながら、私は答えが私に言っていることを本当に理解していません。誰かが私にこの答えを説明したり、疑似コードで答える方法を教えてもらえますか?

4

5 に答える 5

3
CSem(K) cs { // counting semaphore initialized to K
    int val ← K; // the value of csem
    BSem gate(min(1,val)); // 1 if val > 0; 0 if val = 0
    BSem mutex(1); // protects val

    Pc(cs) {
        P(gate)
        a1: P(mutex);
        val ← val − 1;
        if val > 0
        V(gate);
        V(mutex);
    }

    Vc(cs) {
        P(mutex);
        val ← val + 1;
        if val = 1
        V(gate);
        V(mutex);
    }
}

ソース: http://www.cs.umd.edu/~shankar/412-Notes/10x-countingSemUsingBinarySem.pdf

于 2015-01-11T22:16:31.243 に答える
0

理解した:

int s = N;
semaphore mutex_s = 1;
semaphore delay_s = 0;

p(s) = down
  down(mutex_x);
  s--;

  if (s< n)
    up(mutex_s)
    down(delay_s)
  up(mutex_s)

V(s) = up
  down(mutex_s)
  s++
  if (s<=0)
    up(delay_s)
  up(mutex_s)
于 2013-02-28T00:53:25.650 に答える