フォーマット | wait()/ P操作 |
signal()/ V操作 | ||
---|---|---|---|---|
整数 | int S = 1; | while(s <= 0); S = S-1; |
S = S + 1; | 待つのに忙しいかもしれません |
レコードタイプ | タイプstruct { int値; 構造体プロセス* L; } S |
S.value--; if(S.value <0) //プロセスをセマフォの待機キューにハングアップします //そしてブロックプリミティブを使用してそれ自体をブロックします //プロセッサを積極的に放棄します ブロック(SL); |
S.valus ++; if(S.value <= 0) //リソースが解放された後、セマフォが0以下の場合 //つまり、リソースを待機し、ウェイクアップを介してウェイクアップするプロセスがまだあります wakeup(SL); |
待っているのに忙しくない プロセッサを使用する権利を自発的に放棄します |
セマフォは実際にはリソースを表し、その値はリソースの残りの量を表します
P操作:リソースを要求し、要求されていない場合はブロックします
V操作:リソースを解放し、リソースを待機しているプロセスがある場合はウェイクアップします
セマフォを使用して、プロセスの相互排除を実現します
记录性型号量 mutex = 1;
p1(){
P(mutex);
//临界区代码
V(mutex);
}
P2(){
P(mutex);
//临界区代码
V(mutex);
}
注意!!!さまざまなリソースを表すために、さまざまなセマフォを設定する必要があります
P操作とV操作はペアで表現する必要があります
セマフォメカニズムを使用して、プロセスの同期を実現します
セマフォの初期値を0に設定します
记录型信号量 S = 0;
P1(){
代码1;
代码2;
V(S);
代码3;
}
P2(){
P(S);
代码4;
代码5;
}
コード4の実行がコード2の後にあることを確認するために使用されます
各「事前操作」の後にV操作を実行して、実行を続行できることを別のプロセスに通知します
各「事後操作」の前にP操作を実行して、実行された操作の後に別のプロセスが実行されるのを待ちます