进程同步与互斥的实现

信号灯和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);
}
}
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值