程之间互相竞争某一个资源,这种关系就称为进程的互斥,也就是说对于某个系统资源,如果一个进程正在使用,其他的进程就必须等待其用完,不能同时使用。
并发进程使用共享资源时,除了竞争之外有协作,要利用互通消息的办法来控制执行速度,使相互协作的进程正确工作。进程之间的相互合作来完成某一任务,把这种关系称为进程的同步.
操作系统中将一次只允许一个进程访问的资源称为临界资源。一个含有访问某一临界资源的循环进程可描述如下:
while(TRUE)
{
entry section
critical section
exit section
remainder section
}
对进程的互斥和同步,操作系统必须采取某种控制手段,以保证进程的安全可靠执行。对互斥,要保证在临界区内不能交替执行,而谁先进入临界区都是可以的。对 同步,则要保证合作进程必须相互配合共同推进,并严格按照一定的先后顺序。用什么来保证进程的同步和互斥呢,这就是信号量机制。
1.记录型信号量
struct semaphore
{
int value;
PCB *L;
}S;
2.P、V原语操作
P原语操作的主要动作是:
V原语操作的主要动作是:
进程互斥和同步的实现:
1. 用PV原语实现进程的互斥
对于互斥的信号量S与所有的并发进程有关,所以称之为公有信号量。只要把临界区置于P(S) 和V(S)之间,即可实现进程间的互斥。(这样,每个想访问临界资源的进程,在进入临界区之前,要先对信号量S执行P操作,若该资源未被访问,则本次P操 作成功,该进程便可以进入自己的临界区,这时若再有其他的进程想进入自己的临界区,在对信号量S执行P操作后必然会失败而阻塞,从而保证了临界资源被互斥的访问。当访问临界资源的进程退出临界区后,应该再对mutex执行V操作,释放该临界资源。)
注意: 判断进程间是否互斥,关键是看进程间是否共享某一公有资源,一个公有资源与一个信号量相对应。在实现互斥时应注意:
(1)P(mutex)和v(mutex)必须成对出现,缺少一个都不行。缺少P(mutex)将会引起系统混乱,不能保证对临界资源的互斥访问;缺少v(mutex)将会使该临界资源永久不被释放,从而因等待该资源而阻塞的进程不再被唤醒。
(2)P(S)和V(S)的调用一定紧挨着临界区的前、后。
2. 用PV原语实现进程的同步
与进程互斥不同,进程同步时的信号量只与制约进程及被制约进程有关而不是与整组并发进程有关,所以称该信号量为私有信号量。利用PV原语实现进程同步的方法是:首先判断进程间的关系为同步的,且为各并发进程设置私有信号量,然后为私有信号量赋初值,最后利用PV原语和私有信号量规定各进程的执行顺序。
同步和互斥这两种制约关系的区别:
进程的互斥是进程间竞争共享资源的使用权,这种竞争没有固定的必然关系;而进程同步时,涉及到共享资源的并发进程之间有一种必然的依赖关系。用 PV操作解决进程同步问题时首先应确定问题是属于进程互斥还是进程同步,或是互斥与同步的混合问题。然后根据共享资源的数量以及使用共享资源的规则正确的 定义信号量及其初值。然后决定在不同信号量上应实施的P操作和V操作,用这些P操作和V操作保证并发进程正确地使用共享资源。