引入:P(S)与V(S)
在表述用信号量机制实现进程的同步与互斥之前,引出PV操作.
- P(S)-- 申请一个资源S,如果资源不够就阻塞等待.
- V(S)-- 释放一个资源S,如果有进程在等待该资源,则唤醒一个进程.
- S代表一个资源,一个整型信号量.
通过PV操作来实现进程的同步,能满足4个同步原则
信号量机制实现进程互斥
一.在什么地方,需要进程的互斥?
在不同的临界区的前后我们需要进行互斥的操作,以实现,这一段时间内,只允许某一个个临界资源被某一个进程所使用.
临界区
:是指包含访问共享资源的代码块。为了避免多个进程同时进入临界区,需要使用互斥机制。
二.怎么实现进程的互斥?
- 设置初始的互斥信号量mutex=1.
- 在临界区前,P操作,令mutex值-1,此时mutex=0,继续往下访问,P操作是申请资源,资源数不为0的情况下,申请一个资源,现有资源-1,如果本身没有资源可以申请,则进入等待队列.
- 在临界区后,V操作,释放一个资源,mutex+1
三.进程互斥的过程思考
进程互斥发生在需要互斥访问的临界区的前后.
上述p1进程和p2的过程,首先p1进程开始,mutex值当前为1,P操作 ,mutex-1,进入p1进程的临界区,此时,p2进程开始,P操作,发现mutex值-1后,小于0,所以此时p2进程进入等待队列,等待p1进程,执行完临界区后,执行V操作,释放资源.然后将p2进程从等待队列中释放出来.
信号量机制实现进程同步
一.为什么要实现进程的同步?
- 比如,P1、P2并发执行,由于存在异步性,因此二者交替推进的次序是不确定的。
- 若P2的“代码4”要基于P1的“代码1”和“代码2”的运行结果才能执行,那么我们就必须保证“代码4”一定是在“代码2”之后才会执行。
- 这就是进程同步问题,让本来异步并发的进程互相配合,有序推进。
二.在什么地方需要进程的同步?
举例来说,两个进程的某些代码段,存在着次序关系,某一个代码段需要发生在某一个代码段的前面或者后面.
实例,司机需要先停车,然后售票员才能打开车门.此时的司机和售票员就是两个进程,他们各自的动作就是要执行的代码段.
三.怎样利用PV操作实现进程的同步?
在前操作之后,执行V操作. 在后操作之前,执行P操作
,S就是关联二者的信号.
如何理解这一过程?
让代码4在代码2之后执行,初始信号量S=0
先让P2开始执行,此时S=S-1 S=-1 进入等待队列,所以P1开始执行,执行代码1,代码2,直到执行了V操作 S=S+1,进程从等待队列中唤醒,执行代码4,无论此时整个程序是先执行P1的代码3还是P2的代码4,我们都保证了代码4在代码2之后执行.
信号量机制实现进程的互斥和同步的关键记忆点
进程互斥是先P后V
.
进程同步是先V后P
.