wait、signal原语和记录型信号结构
- 记录型信号量的结构
struct semaphore { int value; // 系统剩余资源 struct process* L; // 等待队列 }
- wait 原语
void wait(semaphore S) { S.value--; if(S.value < 0) { // 将进程加入等待队列 add process to S.L; // 当前进程申请不到资源,放弃处理机 // 让权等待 block(S.L); } }
- signal 原语
void signal(semaphore S) { S.value++; if(S.value <= 0) { // 将等待队列中的进程移出(一般是队头的进程) remove a process P from S.L; // 唤醒进程 P,该进程在执行 wait 原语时,必然执行了 block(S.L) wakeup(P); } }
signal 判断信号量的值是小于等于0?
S.value
S.value >= 0
时,可以理解为系统中该资源的剩余量S.value < 0
时,可以理解为请求该资源的进程数量
- 那么
signal
原语为什么是判断S.value <= 0
- 按照前面的描述,应该是判断
S.value < 0
才对 - 这是由于
signal
原语中,先执行S.value++
,那么if
条件中,S.value = 0
的情况下,在执行signal
原语之前,S.value = -1
,即有一个等待的进程,而S.value++
执行后,才导致了S.value = 0
- 按照前面的描述,应该是判断