转载自http://media.openedu.com.cn/media_file/courseware/czxt/dx/dx.html
1.什么是信号量?信号量一般是由两个成员组成的数据结构,其中一个成员是整型变量,表示该信号量的值,另一个是指向PCB的指针。当多个进程都等待同一信号量时,它们就排成一个队列,由信号量的指针项指出该队列的头,而PCB队列是通过PCB本身所包含的指针项进行链接的。最后一个PCB(即队尾)的链接指针为0。下图表示信号量的一般结构以及信号量上PCB队列的情况,因为采用了记录型数据结构,这种信号量也称作记录型信号量。
信号量的值是与相应资源的使用情况有关的。
当它的值大于0时,则表示当前可用资源的数量;
当它的值小于0时,则其绝对值表示等待使用该资源的进程个数,即在该信号量队列上排队的PCB的个数。
2.信号量的限制
对信号量的操作有如下严格限制:
① 信号量可以赋初值,且初值为非负数。信号量的初值可由系统根据资源情况和使用需要来确定。在初始条件下,信号量的指针项可以置为0,表示队列为空。
② 在使用过程中,信号量的值可以修改,但只能由P、V操作来访问,不允许通过其他方式来查看或操纵信号量。
3.P操作和V操作
P操作:设信号量为S,对S的P操作为申请资源,记为P(S)。现一般称为down操作。
P(S):顺序执行下述两个动作:
①信号量的值减1,即S=S-1;
②如果S≥0,则该进程继续执行;
如果S<0,则把该进程的状态置为阻塞态,把相应的PCB链入该信号量队列的末尾,并放弃处理机,进行等待(直至其它进程在S上执行V操作,把它释放出来为止)。
V操作:设信号量为S,对S的V操作为释放资源,记为V(S)。现一般称为up操作。
V(S):顺序执行下述两个动作:
①S值加1,即S=S+1;
②如果S>0,则该进程继续运行;
如果S≤0,则释放信号量队列上的第一个PCB(即信号量指针项所指向的PCB)所对应的进程(把阻塞态改为就绪态),执行V操作的进程继续运行。
4.用信号量解决生产者消费者问题
http://media.openedu.com.cn/media_file/courseware/czxt/sf/asf/1.swf