进程管理(十)-进程同步
进程管理(十)-进程同步
直接制约VS间接制约
制约 | 导致 | 原因 |
---|---|---|
直接制约 | 互斥 | 竞争公有资源 |
间接制约 | 同步 | 并发进程互相共享对方的私有资源 |
什么是同步
简单说,就是指系统中多个进程中发生的事件存在某种时序关系,需要相互合作,共同完成一项任务
异步环境下的一组并发进程,因直接制约而互相发送消息而进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步
具有同步关系的一组并发进程称为合作进程,合作进程间互相发送的信号称为消息或事件。
同步的例子
计算进程和打印进程共同使用同一缓冲区Buf。
计算进程反复地把每次计算结果放入 Buf中,而打印进程则把计算进程每次放入 Buf中的数据通过打印机打印输出。
如果不采取任何制约措施,这两个进程的执行起始时间和执行速度都是彼此独立的,其相应的控制段可以描述为:
计算进程每次把结果放到缓冲区,这是有条件的,必须缓冲区为空,才能把计算结果放进去,而打印进程继续的条件是缓冲区不为空,因为你缓冲区不为空,我才有的东西可打印
所以说,两个进程执行结果互为对方的执行条件,从而限制各进程执行速度的过程称为并发进程间的直接制约
同步的实现
互相发送信号
一种最为简单和直观的方法是直接制约的进程互相给对方进程发送执行条件已经具备的信号。
这样,被制约进程即可省去对执行条件的测试,只要收到了制约进程发来的信号便开始执行,而在未收到制约进程发来的信号时便进入等待状态
- wait(消息名),表示等待合作进程发来的消息;
- signal(消息名),表示向合作进程发送消息。
消息名Bufempty表示Buf空,
消息名Buffull表示Buf中装满了数据。
初始化Bufempty=true,Buffull=false。
私用信号量vs公有信号量
1.各进程之间发送的消息作为信号量看待
2.与进程互斥时不同的是,这里的信号量只与制约进程及被制约进程有关而与整组并发进程无关。因此,称为私用信号量(Private Semaphore)
3.一个进程Pi的私用信号量Semi是从制约进程发送来的进程Pi的执行条件所需要的消息。 与私用信号量相对应,称互斥时使用的信号量为公用信号量
用P, V原语操作实现同步
实现步骤
1.首先为各并发进程设置私用信号量
2.为私用信号量赋初值
3.最后利用P, V原语和私用信号量规定各进程的执行顺序
实现例子
设进程PA和PB通过缓冲区队列传递数据。
PA为发送进程,PB为接收进程。PA发送数据时调用发送过程deposit(data),PB接收数据时调用过程remove(data)。
数据发送和接收过程满足如下条件
1.在PA至少送一块数据入一个缓冲区之前,PB不可能从缓冲区中取出数据
2.PA往缓冲队列发送数据时,至少有一个缓冲区是空的;
3.由PA发送的数据块在缓冲队列中按先进先出(FIFO)方式排列。
过程
1.设Bufempty为进程PA的私用信号量,Buffull 为进程PB的私用信号量
2.令Bufempty的初始值为n(n 为缓冲队列的缓冲区个数),Buffull 的初始值为0
3.描述
PA: deposit(data):
begin local x;
P(Bufempty);
按FIFO方式选择一个空缓冲区Buf(x);
Buf(x)← data;
Buf(x)置满标记;
V(Buffull);
end
PB: remove(data):
Begin local x;
P(Buffull);
按FIFO方式选择一个装满数据的缓冲区Buf(x);
data ← Buf(x);
Buf(x)置空标记;
V(Bufempty);
end
生产者-消费者问题
生产者vs消费者
消费者:系统中使用某一类资源的进程称为该资源的消费者
生产者:释放同类资源的进程称为该资源的生产者
生产者-消费者问题
把一个长度为n的有界缓冲区(n>0)与一群生产者进程P1, P2, …, Pm和一群消费者进程C1, C2, …, Ck联系起来。
上述生产者-消费者问题是一个同步问题。由于有界缓冲区是临界资源,因此,各生产者进程和各消费者进程之间必须互斥执行。
生产者消费者问题解决
设公用信号量mutex保证生产者进程和消费者进程之间的互斥,设信号量avail为生产者进程的私用信号量,信号量full为消费者进程的私用信号量。
信号量avail表示有界缓冲区中的空单元数,初值为n;信号量full表示有界缓冲区中非空单元数,初值为0。信号量mutex表示可用有界缓冲区的个数,初值为 1。
设各生产者进程使用过程deposit(data),各消费者使用过程remove(data) 。