标签:一段 简单 操作 不能 生产者 第一条 实体 lock 恢复
一、进程互斥
首先我们要知道,为了保证程序执行最终结果的正确性,必须对并发执行的各进程进行制约,以控制它们的执行速度和对资源的竞争。需要回到一个问题,需要对程序哪些部分进行制约才能保证其执行结果的正确性?如:进程PA 和PB共享内存 MS,进程PA 和PB 各执行两条语句时,可能按以下顺序执行:当进程PA执行完第一条语句,开始执行进程PB,再接着执行进程PA 的第二条语句。这样会导致错误。如何保证正确性了?我们可以将各自的两条语句抽象为两个各以一个动作完成的顺序执行单位,这样执行结果的正确性就可以得到保证。这也引出了一个概念。
临界区(critical region):把不允许多个并发进程交叉执行的一段程度称为临界区。临界区是有属于不同并发进程的程序段共享公用数据或公用数据变量二引起的。
把这种由于共享某一公有资源而引起的在临界区内不允许并发进程交叉执行的现象,称为由共享公有资源而造成的对并发进程执行速度的间接制约,简称间接制约。
1、什么是互斥?
一组并发进程中的一个或多个程序段,因共享某一公有资源而导致它们必须以一个不允许交叉执行的单位执行。也就是说,不允许两个以上的共享该资源的并发进程同时进入临界区称为互斥。
一组并发进程互斥执行时必须满足如下准则:
i)不能假设各并发进程的相对执行速度。即各并发进程享有平等地、独立地竞争公有资源的权利。
ii)并发进程中的某个进程不在临界区时,它不阻止其他进程进入临界区;
iii)并发进程中的若干个进程申请进入临界区时,只能允许一个进程进入;
iv)并发进程中的某个进程从申请进入临界区时开始,应在有限时间内得以进入临界区。
准则iv)是并发进程不发生死锁的重要保证。
2、互斥的加锁实现
是否只需把临界区中的各个过程按不同的时间排列调用就好?事实上不可能。因为用户程序的执行开始的随机性是不可知的。
一种可能的办法是对临界区加锁以实现互斥。当某个进程进入临界区之后,它将锁上临界区,直到它退出临界区为止。并发进程在申请进入临界区时,首先测试该临界区是否是上锁的。如果该临界区已被锁住,则该进程要等待该临界区开锁之后才有可能获得临界区。
3、信号量和P、V原语
3.1 使用加锁实现进程之间互斥存在的问题:
i)如果一组并发进程的进程数较多,且由于每个进程在申请进入临界区时都得对锁定位进行测试,这样开销是很大的。
ii)另外使用加锁实现进程间互斥时,还将导致在某些情况下出现不公平现象,如:对进程PA 和PB ,进程PA 执行完并解锁以后,紧接一条转向语句调用进程PA ,由于转向调度语句瞬间就执行,使得进程PA 将处理机转让给进程PB 的可能性非常小。因此,进程PB将处于永久饥饿状态。
针对ii)为什么产生这样的问题呢?因为在用加锁法解决进程互斥的问题时,一个进程能否进入临界区是依靠进程自己的调用lock过程去测试相应的锁定位,也就是说,每个进程能否进入临界区是靠自己测试判断的,这样,没有执行机会的进程当然无法判断,从而出现不公平现象。
我们可以用信号量管理相应临界区的公有资源,它代表可用资源实体。信号量的数值仅能有P、V原语操作改变,sem是信号量,一次P原语操作使得信号量sem减1,一次V原语操作将使信号量sem加1.
注:当某个进程正在临界区内执行时,其他进程如果执行了P原语操作,则该进程并不想调动lock时那样因进不了临界区而返回lock起点,等待以后重新执行测试,而是在等待队列中等待有其他进程做V元素操作释放资源后,进入临界区,这时,P原语的执行才算真正结束。
3.2 P原语操作的主要动作如下:
a)sem减1;
b)若sem减1后仍大于或等于0,则P原语返回,该进程继续执行;
c)若sem减1后小于0,则该进程被阻塞进入相应的队列中,然后转进程调度。
V原语的操作主要动作如下:
a)sem 加1;
b)若相加结果大于0,V原语停止执行,该进程返回调用处,继续执行;
c)若相加结果小于或等于0,则从该信号的等待队列中唤醒一个等待进程,然后返回原进程继续执行或转进程调度。
3.3为什么P、V过程要以原语实现?
如果不,则多个进程同时调用P操作或V操作的话,则有可能在P操作刚执行完sem-1而未把对应进程送入等待队列时,V操作开始执行,从而,V操作将无法发现等待进程而返回。所以P、V操作都必须以原语实现,且在P、V原语执行期间不允许中断发生。
4、用P、V原语实现进程互斥
设信号sem是用于互斥的信号量,且其初始值为1表示没有并发程序使用该临界区。当一个进程想要进入临界区时,它必须先执行P原语操作以将信号量sem减1。在一个进程完成对临界区的操作之后,它必须执行V原语操作以释放它所占用的临界区。
由于信号量初始值为1,所以,任一进程在执行P原语操作之后将sem的值变为0,表示该进程可以进入临界区。在改进程未执行V原语操作之前如有另一进程想进入临界区的话,它也应该先执行P原语操作,从而使sem的值变为-1,因此,第二个进程将被阻塞。直到第一个进程执行V原语操作之后,sem的值变为0,从而可唤醒第二个进程进入就绪队列,经调度后再进入临界区。在第二个进程执行完V原语操作之后,若没有其他进程申请进入临界区的话,则sem又恢复到初始值。
二、进程同步
1、进程同步
一组在异步环境下的并发进程,各自的执行结果互为对方的执行条件,从而限制各进程的执行速度的过程称为并发进程间的直接制约。这里的异步环境主要指各并发进程的执行起始时间的随机性和执行速度的独立性。
一种最为简单和直观的方法是直接制约的进程相互给对方进程发送执行条件已具备的信号。
把异步环境下的一组并发进程因直接制约而相互发送消息而进行相互合作、相互等待,使得各进程按一定的速度执行的过程称为进程间的同步。
2、私用信号量
与进程互斥不同的是,这里的信号量只与制约进程及被制约进程有关二不是与整租并发进程有关。
3、生产者-消费者问题
把并发进程的同步和互斥问题一般化,得到一个抽象的一般模型,即生产者-消费者问题。
把系统中使用某一类资源的进程称为消费者,而把释放同类资源的进程称为该资源的生产者。
标签:一段 简单 操作 不能 生产者 第一条 实体 lock 恢复
原文地址:http://www.cnblogs.com/love-yh/p/7260849.html