进程间的制约关系
进程间的制约关系
一、进程同步
多个相互合作的进程在一些关键点上可能需要互相等待或互相交换消息。一个进程运行到某一点时,除非合作进程已经完成了某种操作或发来了消息,否则就必须暂时等待那些操作的完成或信息的到来,进程间的这种关系称为同步。
暂停等待已取得同步的那一点,称为同步点;需要等待的由其他进程完成的操作或发送的信息,称为同步条件。
同步关系是一种直接制约关系。
同步关系有如下特点:(1)进程之间要在某些点上协调工作,到达的先后顺序是有要求的。(2)进程之间互相了解对方的工作,任何一方单独运行会出现差错。(3)一方或双方的运行会直接地依赖于对方所产生的信息或发出的消息。
二、进程互斥
当一个进程正在使用某独占型资源时,其他希望使用该资源的进程必须等待,当该进程用完资源并释放后,才允许其他进程去访问此资源,进程之间的这种相互制约关系称为互斥。
互斥关系时一种间接制约关系。
临界资源: 一次仅允许一个进程使用的资源。(打印机、扫描仪、绘图机)
临界区: 进程中访问临界资源的程序段。
使用临界资源的进程必须遵守一种约定: 进入临界区之前必须先发出请求,准许后才能进入; 退出临界区时必须声明,以便让其他进程进入。
对于临界区的操作要遵循以下准则: 空闲让进、忙则等待、有限等待、让权等待。
信号量机制
一、信号量机制简介
信号量由两个成员构成:(1)非负初值的整型变量;(2)初始状态为空的队列。
在一个信号量S上,只能做规定的两种操作:P操作 V操作。
P操作: 信号量S上的P操作记为 P(S)。 信号量S的值用 Vs 表示。
(1)Vs = Vs -1,即把当前信号量 S 的值减1.
(2)若 Vs >= 0,则调用进程继续运行;若 Vs < 0 ,则调用进程由运行状态变为阻塞状态,到该信号量的等待队列 Vq 上排队等待。
V 操作:信号量 S 上的 V 操作记为 V(S)。
(1)Vs = Vs + 1,即把当前信号量 S 的值加1.
(2)若 Vs > 0,则调用进程继续运行;若 Vs <= 0 ,则先从该信号量的等待队列 Vq 上摘下一个等待进程,让它从阻塞状态变为就绪状态,到就绪队列里排队,然后调用进程继续运行。
二、进程制约关系的实现
用 P 、V操作实现同步
在共享变量处设置 P(S) V(S)。设置初值为 0 的信号量S。
用 P 、V操作实现互斥
把进入临界区的操作置于 P(S) 和 V(S)之间。设置初值为 1 的信号量S。 即可实现进程互斥。
互斥访问临界资源: 如果进程 P1 已经进入了临界区,那么进程 P2 就只能在临界区的进入点处等待,不能进入,只有等到进程 P1 退出了临界区,进程 P2 才能进入临界区。
信号量 S 的物理含义:
(1)信号量 S 的初值,表示某类资源的数目。
(2)信号量 S > 0 时,表示系统中该类资源的可分配数目。
(3)信号量 S = 0 时,表示系统中该类资源全部被占用,但没有进程在等待该类资源。
(4)信号量 S < 0 时,其绝对值表示等待该类资源的进程数目。
死锁
一、死锁的基本概念
死锁:就是指若干进程由于相互等待已被对方占用的资源而无法继续运行下去,陷于一种僵持状态。
用资源分配图表示系统资源的使用情况。 方框代表资源,圆圈代表进程。由资源到进程的有向边表示把该资源分配给了这个进程。由进程到资源的有向边表示该进程申请或等待这个资源。
死锁产生的两个原因:(1)竞争资源,系统资源有限,不能满足所有进程的需求。(2)进程的推进顺序不当。
死锁产生的四个必要条件:(1)资源互斥条件;(2)资源不剥夺条件;(3)资源部分分配条件;(4)循环等待条件。
解决死锁的方法:(1)预防死锁;(2)避免死锁;(系统中存在产生死锁的条件)(3)检测和解除死锁。
二、死锁的预防
(1)破坏“资源不剥夺条件”;一个已经占有某些资源的进程,再提出新的资源申请而不能立即得到满足时,必须释放它已经占有的所有资源,所以载重新申请。
(2)破坏“资源部分分配条件”;如果系统有足够的资源,会一次性地将所需要的全部资源分配给该进程。只有一个资源需求不满足时,系统将不分配给该进程任何资源。
(3)破坏“循环等待条件”;系统将所有的资源按照类型进行统一编号,所有进程申请资源时,必须严格按照资源序号由小到大的顺序进行。只有先申请并分配到序号小的资源,才能申请和分配序号大的资源。
三、死锁的避免
死锁的避免:(银行家算法)
在银行家算法中,把系统分为安全状态和不安全状态。
安全状态:指系统能够按照某种顺序为所有进程分配所需要的资源,直到满足所有进程的最大需求,使每个进程都能运行完毕。否则系统处于不安全状态。
不安全状态有可能会导致死锁,安全状态绝对不会发生死锁。
银行家算法主要是避免系统进入不安全状态。
在银行家算法中,对进程有如下要求:必须预先知道自己对资源的最大需求量;当获得所需全部资源后,能在有限的时间内运行完毕,并将所获得的资源归还给系统;各进程只能一次一个地申请所需要的资源。
四、死锁的检测与解除
利用简化资源分配图的方法来判断系统是否处于死锁状态。
(1)既非阻塞又非孤立的进程(资源请求能够得到满足且有边与其相连的进程)
在资源分配图中,找出一个既非阻塞又非孤立的进程节点,消去与该节点相连的所有边,使之成为孤立节点。
(2) 经过简化后,如果所有节点都能成为孤立节点,那么该图是可完全简化的。就不会出现死锁。
死锁定理:系统处于死锁状态的充分必要条件是:当且仅当系统的资源分配图是不可完全简化的。
死锁的解除:重新启动、撤销进程、剥夺资源、进程回退。
高级进程通信
进程通信是指 进程间的信息交换。
进程通信分类: (1)按通信量的大小, 低级通信 和 高级通信。 低级通信中,进程间只能传递状态和整数值;高级通信中,用户直接利用这些高级通信命令就能在进程间传递数据。
高级通信主要包括
a 共享存储器:
b 消息传递: (消息缓冲通信 信箱通信(私有信箱,公用信箱,共享信箱))
c 管道通信: (有名管道 无名管道)
(2)按通信过程中是否有第三方作为中转, 直接通信 和 间接通信。
(3)按通信的进程是否在同一台计算机上, 本地通信 和 远程通信。
windows中的进程通信
一、windows server 2008的通信技术
(1)使用 VM_COPYDATA 消息实现进程通信
(2)使用文件映射实现进程通信
(3)通过共享内存实现进程通信
(4)使用匿名管道实现进程通信
(5)使用命名管道实现进程通信
(6)使用邮件槽实现进程通信
(7)使用 windows server 2008 的剪贴板实现进程通信
(8)使用动态数据交换 (DDE)实现进程通信
(9)使用对象链接库(OLE)技术实现进程通信
(10)使用动态链接库(DLL)实现进程通信
(11)使用远程过程调用(RPC)实现进程通信
(12)使用 NetBios 函数实现进程通信
(13)使用套接字 sockets 实现进程通信
二、linux 中的进程通信
(1)使用信号量实现进程通信
(2)使用消息队列实现进程通信
(3)使用共享内存实现进程通信
(4)使用内存映射实现进程通信
(5)使用管道和命名管道实现进程通信
(6)使用套接口实现进程通信