设某台机挂有两个I/O通道:分别挂一台输入机和一台打印机。卡片机上有一叠数据卡片,现在要把这些数据逐一输入到缓冲区B1,然后再复制到缓冲区B2,并在打印机上打印出来。
问:系统可设哪些进程来完成这个任务?用P-V原语写这些进程的同步算法。解:由上图可见,系统可设3个进程:输入进程、复制进程、打印进程;分别用进程R、进程C、进程P来表示。
这些进程之间的相互制约关系:
R受C的约束;C受R、P的约束;P受C的约束。
设4个信号量:S1=1,S2=0,S3=1,S4=0
同步算法如下:
========================================================
P.V操作讨论
1) 信号量的物理含义:
S>0表示有S个资源可用
S=0表示无资源可用
S<0则| S |表示S等待队列中的进程个数
P(S):表示申请一个资源
V(S)表示释放一个资源。信号量的初值应该大于等于0
2) P.V操作必须成对出现,有一个P操作就一定有一个V操作
当为互斥操作时,它们同处于同一进程
当为同步操作时,则不在同一进程中出现
如果P(S1)和P(S2)两个操作在一起,那么P操作的顺序至关重要,一个同步P操作与一个互斥P操作在一起时同步P操作在互斥P操作前
而两个V操作无关紧要
====================================
%E5%9B%BE%E7%89%874.png?imgmax=400
经典的生产者─消费者问题
同步问题:
P进程不能往“满”的缓冲区中放产品,设置信号量为S1
Q进程不能从“空”的缓冲区中取产品,设置信号量S2
|
P: Q:
while (true) { while (true) {
生产一个产品; P(s2);
P(s1) ; 从缓冲区取产品;
送产品到缓冲区; V(s1);
V(s2); 消费产品;
}; };
S1初值为1,S2初值为0
==========================
生产者-消费者问题
生产者-消费者(Producer-Consumer)问题是著名的进程同步问题。它描述一组生产者向一组消费者提供消息,它们共享一个有界缓冲池,生产者向其中投放消息,消费者从中取得消息。以下用信号量解决生产者-消费者问题。
假设缓冲池中有n个缓冲区,每个缓冲区存放一个消息,可利用互斥信号量mutex使诸进程对缓冲池实现互斥访问;利用empty和full计数信号量分别表示空缓冲及满缓冲的数量。又假定这些生产者和消费者互相等效,只要缓冲池未满,生产者可将消息送入缓冲池;只要缓冲池未空,消费者可从缓冲池取走一个消息。
其中,mutex,empty,full的初始值分别为1,n,0;
阅读(1699) | 评论(0) | 转发(0) |