信号量
- 一个特殊变量
- 用于进程间传递信息的一个整数值
定义如下:
struct semaphore { int count; quenue Type quenue; }
- 信号量说明:semaphore s;
- 对信号量可以实施的操作:初始化、P和V(P、V分别是荷兰语的test(proberen)和increment(verhogen))
P、V操作定义
P(s)
{ s.count --; //信号量值减一 if(s.count<0) { 该进程状态置为阻塞态; 将该进程插入相应的等待队列s.quenue末尾; 重新调度 } }
down
,semwait
:也代表P操作
V(s)
{ s.ount++; if(s.count<=0) { 唤醒相应等待队列s.queue中等待的一个进程; 改变其状态为就绪态,并将其插入就绪队列; } }
up
,semsignal
:也代表V操作
相关说明
- P,V操作为原语操作
- 在信号量上定义了三个操作
初始化(非负数)、P操作、V操作- 最初提出的是二元信号量(解决互斥)
之后,推广到一般信号量(多值)或技术信号量(解决同步)
用PV操作解决进程间互斥问题
- 分析并发进程的关键活动,划定临界区
- 设置信号量mutux,初值为1
- 在临界区前实施P(mutux)
- 在临界区之后实施V(mutux)
相关解释:
临界区
: 我们把并发进程中与共享变量有关的程序段称为临界区。信号量
: 信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。进程的互斥
:是指当有若干个进程都要使用某一共享资源时,任何时刻最多只允许一个进程去使用该资源,其他要使用它的进程必须等待,直到该资源的占用着释放了该资源。进程的同步
:是指在并发进程之间存在这一种制约关系,一个进程依赖另一个进程的消息,当一个进程没有得到另一个进程的消息时应等待,直到消息到达才被唤醒。pv操作又称wait,signal原语。
主要是操作进程中对进程控制的信息量的加减控制。
注意:
在霍尔管程中,wait操作
和signal操作
用于被设计为两个可以中断的过程,而非原语。
在管程中,引入一种数据结构—条件变量(仅在管程中可以被访问)。
条件变量的两种操作:
- wait()操作[阻塞调用进程]
- signal()操作[释放/唤醒在条件变量上阻塞的进程]
- wait用法:
wait(num),num是目标参数,wait的作用是使其(信息量)减一。
如果信息量>=0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
signal用法:
signal(num),num是目标参数,signal的作用是使其(信息量)加一。
如果信息量>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。