信号量,是可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将acquiresemaphorevi以及releasesemaphorevi分别放置在每个关键代码段的首末端。确认这些信号量vi引用的是初始创建的信号量。
信号量的分类:
整型信号量(integersemaphore):信号量是整数
记录型信号量(recordsemaphore):每个信号量s除一个整数值s.value(计数)外,还有一个进程等待队列s.l,其中是阻塞在该信号量的各个进程的标识
二进制信号量(binarysemaphore):只允许信号量取0或1值
每个信号量至少须记录两个信息:信号量的值和等待该信号量的进程队列。它的类型定义如下:(用类pascal语言表述)
semaphore=record
value:integer;
queue:^pcb;
end;
其中pcb是进程控制块,是操作系统为每个进程建立的数据结构。
s.value>=0时,s.queue为空;
s.value<0时,s.value的绝对值为s.queue中等待进程的个数;