并发程序设计(下 )

一、进程通信

1.进程通信概念
交往进程通过信号量操作实现进程互斥和同步,这是一种低级通信方式
进程有时还需要交换更多的信息(如把数据传送给另一个进程),可以引进高级通信方式——进程通信机制,实现进程间用信件来交换信息
进程通信扩充了并发进程的数据共享

2.进程直接通信
发送或接收信件的进程指出信件发给谁,或从谁那里接收信件
send(P,信件):把信件发送给进程P
receive(Q,信件):从进程Q接收信件

3.进程间接通信
发生或者接收信件通过一个信箱来进行,该信箱有唯一标识符
多个进程共享一个信箱
send(A,信件):把信件传送到信箱A
receive(A,信件):从信箱A接收信件

间接通信的信箱
{
信箱是存放信件的存储区域,每个信箱可以分成信箱特征和信箱体两部分
信箱特征指出信箱容量、信件格式、指针等
信箱体用来存放信件,信箱体分成若干个区,每个区可容纳一封信
}

二、高级进程通信机制

1.基于字节流的通信规约
基于流的进程通信
多个进程可以使用一个共享的消息缓冲区(可称为管道、多路转接器、套接字)
一些进程往消息缓冲区写入字符流
一些进程从消息缓冲区读出字符流

2.基于RPC的高级通信规约
采用客户/服务器计算模式
服务器进程提供一系列过程/服务,供客户进程调用
客户进程通过调用服务器进程提供的过程/服务获得服务
考虑到客户计算机和服务器计算机的硬件异构型,(如32位与64位机语言不同)
外部数据表示XDR 被引入转换每台计算机的特殊数据格式为标准数据格式
即把每台计算机的数据翻译成XDR,到服务器中再把XDR翻译成服务器用格式,然后处理完成在变成XDR然后在翻译回每台客户机的专用数据
在这里插入图片描述

三、死锁的产生

1.死锁的概念

允许多个进程并发执行共享系统资源时,系统必须提供同步机制和进程通信机制
然而,对这种机制使用不当的话,可能会出现进程永远被阻塞的现象,例如,两个进程分别等待对方占有的一个资源,于是两者都不能执行而处于永远等待,这种现像称为“死锁”

死锁的定义:一组进程处于死锁状态是指:每一个进程都在等待被另一个进程所占有的、不能抢占的资源。

2.死锁解决的三种方法
死锁防止
死锁避免
死锁检测和恢复

四、死锁的防止

1.死锁产生的必要条件
死锁产生的四个必要条件
{
1.互斥条件:进程互斥使用资源,任一时刻一个资源仅为一个进程独占
2.占有和等待条件:一个进程请求资源得不到满足而等待时,不释放已占有的资源
3.不剥夺条件:任一进程不能从另一进程那里抢夺资源
4.循环等待条件:存在一个循环等待链,每一个进程分别等待它前一个进程所持有的资源
}
2.死锁的防止方法
破坏四个必要条件直以,死锁就可防止
破坏第一个条件,把独占型资源改造成共享性资源,使资源可同时访问而不是互斥使用。但很多资源往往做不到
采用剥夺调度方法可以破坏第三个条件,但剥夺方式调度方法母亲只适用于对主存资源和处理器资源的分配,而不适用于所有资源

扫描二维码关注公众号,回复: 10302843 查看本文章

静待分配(预分配)
所谓静态分配是指一个进程必须在执行前就申请它所要的犬奴资源,并且直到它所要的资源都得到满足之后才开始执行
所有并发执行的进程要求的资源综合不超过系统拥有的资源数
采用静态分配后,进程在执行中不再申请资源,因而不会出现占有了某些资源再等待另一些资源的情况,即破坏了第二个条件

层次分配
这种分配策略将阻止第四个条件的出现
在层次分配策略下,资源被分成多层次
一个进程得到某一层的一个资源后,它只能再申请在较高层的资源
当一个进程要释放某一层资源时,必须先释放所占用的较高层的资源
当一个进程获得了某一层的一个资源后,它在想申请该层中的另一个资源,那么,必须先释放该层中的已占资源

五、死锁避免

当不能防止死锁的产生时,如果能掌握并发进程中与每个进程有关的资源申请情况,仍然可以避免死锁的发生
只需在为申请者分配资源前先测试系统状态,若把资源分配给申请者会产生死锁的话,则拒绝分配,否则接收申请,为它分配资源。

银行家算法
借钱给有偿还能力的客户
系统首先检查申请者对资源的最大需求量,如果现存的资源可以满足它的最大需求量时,就满足当前的申请

六、死锁检测

解决死锁问题的另一条途径是死锁检测方法
这种方法对资源的分配不加限制,但系统定时运行一个“死锁检测”程序,判断系统内是否已出现死锁,若检测到死锁则设法加以解除。
检测的一种方法:可设置两张表格来记录进程使用资源的情况
等待资源表记录每个被阻塞进程等待的资源
占用资源表记录每个进程占有的资源
进程申请资源时,先查该资源是否为其它进程所占用;若资源空闲,则把该资源分配给申请者且登入占用资源表;否则登入进程等待资源表

死锁检测的算法:可用Warshall的传递闭包算法检测

死锁检测后的解决方法
可采用重新启动进程执行的办法,恢复 工作应包含重启动一个或全部进程,以及从哪一点开始重启动
全部卷入死锁从头开始启动,但这样的代价相当大
在进程执行过程中定时设置校验点,从校验点开始重新执行
中止一个卷入死锁的进程,以后重执行

发布了33 篇原创文章 · 获赞 4 · 访问量 2626

猜你喜欢

转载自blog.csdn.net/CNMNMSL1/article/details/104055101