信号灯和P、V操作:
信号灯是一个确定的二元组 (s,q),s是一个具有非负初值的整型变量,q是一个初始状态为空的队列。操作系统利用信号灯的状态对并发进程和共享资源进行控制和管理。
信号灯是整型变量。变量值 > 0 时,表示绿灯,进程执行;
变量值 <= 0 时,表示红灯,进程停止执行。
注意:创建信号灯时,应准确说明信号灯 s 的意义和初值(这个初值绝不能为负值)。
P 操作的定义 :
对信号灯s的 p操作记为 p(s)。p(s)是一个不可分割的原语操作,即取信号灯值减1,若相减结果为负,则调用p(s)的进程被阻,并插入到该信号灯的等待队列中,否则可以继续执行。
V 操作的定义:
对信号灯s的 v操作记为 v(s)。v(s)是一个不可分割的原语操作,即取信号灯值加1,若相加结果大于零,进程继续执行,否则,要帮助唤醒在信号灯等待队列上的一个进程。
进程互斥问题:
划定临界区;设置互斥信号量;在临界区前执行P操作;在临界区后执行V操作。
注:不同的临界区,设置不同的互斥信号
例:x代表某航班机座号,pa和pb两个售票进程,售票工作是对变量x加1。试用信号灯的P、V操作实现这两个进程的互斥。
设:mutex为互斥信号灯,初值为1。
pa( ) pb( )
{ {
p(mutex); p(mutex);
x:=x+1 ; x:=x+1 ;
v(mutex); v(mutex);
} }
进程同步问题(并发进程的有序推进)
分析什么地方实现同步,保证“一前一后”;设置信号量s,初始化为0;在“前操作”后执行V,在“后操作”后执行P。
例:pa、pb、pc为一组合作进程,其进程流图如图所示,试用信号灯的p、v操作实现这三个进程的同步。
任务启动后 pa先执行,当它结束后,pb、pc可以 开始执行, pb、pc 都执行完毕后,任务终止。
设两个同步信号灯sb、sc分别表示进程pb和pc能否开始执行,其初值均为0。
共享缓冲区的合作进程的同步的解法
例:计算进程 cp和打印进程 iop公用一个单缓冲,为了完成正确的计算与打印,试用信号灯的p、v操作实现这两个进程的同步。
解法:
分析两个进程的任务:计算进程cp经过计算,将计算结果送入buf;打印进程iop把buf中的数据取出打印。
分析任务的同步关系:当cp进程把计算结果送入buf时,iop进程才能从buf中取出结 果去打印,否则必须等待。当iop进程把buf中的数据取出打印后,cp进程才能把下一个计算结果数据送入buf中,否则必须等待。
信号灯设置: sa:表示缓冲区中是否有可供打印的计算结果,其初值为0。sb:表示缓冲区有无空位置存放新的信息,其初值为1。
生产者消费者问题(同步互斥综合)
生产者-消费者公用一个大小为n的缓冲区;
只有缓冲区没满时,生产者才能放数据否则必须等待;
只有缓冲区不空时,消费者才能取数据否则等待;
缓冲区为临界资源,各进程互斥访问。
具体实现
main(){
semophore mutex=1;//缓冲区互斥信号
semophore empty=n;//空闲缓冲区个数
semophore full=0;//非空缓冲区个数
cobegin
producer();
consumer();
coend;
}
producer(){
while(1){
产生数据;
p(empty);
p(mutex);
放入缓冲区;
v(mutex);
V(full);
}
}
consumer(){
while(1){
读取数据;
p(full);
p(mutex);
从缓冲区取走数据;
v(mutex);
v(empty);
}
}