S初始为1Wait(s) :{while s<=0 do no-op; s--;}Signal(s):s++;
15 结构体定义:
typedef struct _RuleListNode{ ListHead *RuleList; /* The rule list associated with this node */ int mode; /* the rule mode */ int rval; /* 0 == no detection, 1 == detection event */ char *name; /* name of this rule list (for debugging) */ struct _RuleListNode *next; /* the next RuleListNode */} RuleListNode;RuleListNode Node1;等价于:struct _RuleListNode{ ListHead *RuleList; /* The rule list associated with this node */ int mode; /* the rule mode */ int rval; /* 0 == no detection, 1 == detection event */ char *name; /* name of this rule list (for debugging) */ struct _RuleListNode *next; /* the next RuleListNode */} ;struct _RuleListNode Node1;
16 记录型信号量:
Struct semaphore{ Int value; Struct ProcessList L;}Wait(S){ Struct semaphore S;S.value--;If(S.value<0) Block(S,L);}Signal(S){Struct semaphore S;S.value++;If(S.value<=0)Wakeup(S,L);}现在我们假设我的电脑有两台打印机,所以S.value的初值为2,表示系统打印机的数目,称为资源信号量。进程B请求打印,那么系统对它执行一次wait操作,执行S.value:=S.value-1语句后S.value减1,S.value的值变为1,表示有一个资源空闲。执行if语句,S.value不小于0,结束。然后又来了一个进程B请求打印,系统对它又执行一次wait操作,执行S.value:=S.value-1语句后S.value减1,S.value的值变为0,表示没有空闲的资源。执行if语句,S.value不小于0,结束。又来一个进程C请求打印,系统对它又执行一次wait操作,执行S.value:=S.value-1语句后S.value减1,S.value的值变为-1,表示有一个进程没有得到打印机资源。执行if语句,S.value小于0,执行block(S,L),进行自我阻塞,放弃处理机,并插入到信号量链表S.L中。此时S.value的绝对值表示了在该信号量链表中已阻塞进程的数目。所以这个时候阻塞的进程为一个,即是进程C。 系统运行了一段时间后,A进程结束,在结束前执行了signal操作,当执行到S.value:=S.value+1语句时,S.value加1,即S.value变为0.然后执行 if 语句,S.value小于等于0,执行wakeup(S,L),从S.L链表中唤醒C进程。过了一会,B进程结束,同样执行signal操作,S.value变为1,表示有一个资源空闲,执行if语句,S.value不小于等于0,直接结束。接着C进程执行wait操作,S.value变为0。然后A进程结束,S.value变为1。紧接着C进程也结束了,S.value变为2。S.value最终等于初值,等待其他的进程进行资源请求。