セマフォ
Semaphore
有限の資源を確保・解放する仕組み
プロセスは必要なだけセマフォから数を減らそうとする。
確保しようとした資源数に対して不足している場合は待ちに入る。
資源が足りるようになったら待ちが解放される。
プロセスは資源が不要になったら確保した数を解放する。
厄介な問題
単純キューイング方式にすると、多く確保するプロセスが居ると、少ない確保で十分なプロセスが待たされてしまう。
少ない確保で十分なプロセスを優先し続けると、多く確保するプロセスがいつまでも待たされてしまう。
取得順序によってはデッドロックする可能性がある。
同じプロセスが2回取得しようとする事が考えられる。この時セマフォが足りなくなるとデッドロックしてしまう。
code:pseudo
Semaphore createSemaphore(int n) {
Semaphore sem = new Semaphore();
sem.maxCount = n;
return sem;
}
deleteSemaphore() {
}
boolean getSemaphore(Semaphore sem, int n, boolean noWait) {
if (sem.currentCount < n) {
if (noWait) {
return false;
}
sem.addWaitQueue(n, process);
process.changeExecStateToWait();
}
sem.currentCount -= n;
SemaphoreUser semUser = new SemaphoreUser(sem, n);
sem.addUser(process); // 残しておきたい
process.addResources(semUser);
return true;
}
SemaphoreUser {
Semaphore sem;
int n;
release() {
sem.release(n);
}
}