预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共21页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

4.6进程同步的实现用P,V原语操作实现同步 用P,V原语操作实现进程同步的方法: 为各并发进程设置信号量 为信号量赋初值 利用P,V原语和信号量规定各进程的执行顺序。同步斥问题举例1 共享缓冲区的合作进程的同步的解法 计算进程cp和打印进程iop公用一个单缓冲,为了完成正确的计算与打印,试用信号灯的p、v操作实现这两个进程的同步。分析任务的同步关系 当cp进程把计算结果送入buf时,iop进程才能从buf中取出结果去打印,否则必须等待。 当iop进程把buf中的数据取出打印后,cp进程才能把下一个计算结果数据送入buf中,否则必须等待。信号灯设置同步描述 cp:iop: p(sa); 产生一个数据;从buf中取数据; p(sb);v(sb); 将数据放入buf打印; v(sa); 程序描述程序描述 main() { intsa=0;∕*表示buf中有无信息*∕ intsb=1;∕*表示buf中有无空位置*∕ cobegin cp();iop(); coend }需要两个信号量 s1:表示化验结果是否出来,初值为0. s2:表示医生是否开化验单,初值为0.程序描述 main() { ints1=0; ints2=1; cobegin doctor();test(); coend }对于医生的操作步骤: doctor() { 给病人看病… V(s2); P(s1); 继续诊病… }对于化验员的操作步骤: test() { P(s2); 化验… V(s1); }同步斥问题举例3 生产者——消费者问题 生产者——消费者问题的一般解答信号灯设置 两个同步信号灯—— sb:表示空缓冲区的数目,初值=n sa:表示满缓冲区(即信息)的数目,初值=0 一个互斥信号灯—— mutex:表示有界缓冲区是否被占用,初值=1同步描述 生产者:消费者: p(sa) p(sb);p(mutex); p(mutex);有界缓冲区中取数据; 将数据放入有界缓冲区;v(mutex); v(mutex);v(sb); v(sa);消费;程序描述 程序prod_cons main() { intsa=0;∕*满缓冲区的数目*∕ intsb=n;∕*空缓冲区的数目*∕ intmutex=1;∕*对有界缓冲区进行操作的互斥信号灯*∕ cobegin p1();p2();…pm(); c1();c2();…ck(); coend }pi()cj() {{ while(生产未完成)while(还要继续消费) {{ p(sa); 生产一个产品;p(mutex); p(sb);从有界缓冲区中取产品; p(mutex);v(empty); 送一个产品到有界缓冲v(sb); v(mutex);消费一个产品; v(sa); }} }}分析:P操作的顺序----很重要分析:当full=0,mutex=1时,执行顺序: Consumer.P(mutex);Consumer.P(full); //C阻塞,等待Producer发出的full信号 Producer.P(avail);Producer.P(mutex); //P阻塞,等待Consumer发出的avail信号 思考:还有其他的执行序列可以产生死锁吗?