进程间通信、死锁、信号量、PV原语
文章目录
- 进程间通信(Inter-Process Communication, IPC)
- 顺序程序与并发程序的特征
- 进程互斥、临界资源、临界区
- 同步的细分
- 进程间通信目的
- 进程间通信发展
- 进程间通信分类
- 进程间共享信息的三种方式
- 死锁及死锁产生条件
- 哲学家就餐问题
- 信号量(Semaphore)及PV原语
- 信号量
- 信号量值含义
- 信号量实现的数据结构
- P原语和V原语
- PV原语解决实际问题
进程间通信(Inter-Process Communication, IPC)
顺序程序与并发程序的特征
- 顺序程序:顺序性;封闭性(运行环境的封闭性);确定性;可再现性;
- 并发程序:共享性;并发性;随机性;
进程互斥、临界资源、临界区
⑴ 进程的互斥:由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥;
⑵ 临界资源:系统中某些资源一次只允许一个进程使用,称这样的资源为 临界资源 或 互斥资源;
⑶ 临界区:在进程中涉及到互斥资源的程序段叫 临界区;
同步的细分
⑴ 同步,协作。相互通知,两个进程共同完成一个功能或业务;
⑵ 互斥,矛盾。两个进程对一个共享资源的有序访问,不可同时访问同一个共享资源;多个进程排他性的使用同一个资源;且⑴(在不同进程间使用)⑵(在同一进程中使用)都可以使用信号量的PV操作来实现。
进程间通信目的
⑴ 数据传输:一个进程需要将它的数据发送给另一个进程;
⑵ 资源共享:多个进程之间共享同样的资源;
⑶ 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程);
⑷ 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
进程间通信发展
⑴ 管道:匿名管道,父子有血缘关系的进程间通信;命名管道,可以实现无血缘关系的进程间通信;
⑵ System V进程间通信;
⑶ POSIX进程间通信(Portable Operating System Interface,缩写为POSIX);
进程间通信分类
⑴ 文件:作为两个通信进程的数据中转,来实现进程间通信;
⑵ 文件锁:如读写锁;
⑶ 管道(pipe)和命名管道(FIFO);
⑷ 信号(signal):一个进程通过信号向另一个进程发送通知事件,可实现进程控制的目的;
⑸ 消息队列:用于数据传递;
⑹ 共享内存:进程间共享数据;
⑺ 信号量(semaphore):实现进程间对数据的同步访问和互斥访问,可实现互斥量;
⑻ 互斥量:
⑼ 条件变量:
⑽ 读写锁:
⑾ 套接字:域内通信,domain;其中⑸⑹⑺在 SystemV和 POSIX 当中具有相应的实现,而⑻⑼⑽ 是 POSIX 独有,
若是 SystemV 想用则需使用已有的进行实现。
进程间共享信息的三种方式
- 随进程持续:一直存在直到打开的最后一个进程结束。(如pipe和FIFO);
- 随内核持续:一直存在直到内核自举(机器重启)或显式删除。(如System V消息队列、共享内存、信号量);
- 随文件系统持续:一直存在直到显式删除,即使内核自举还存在。(POSIX消息队列、共享内存、信号量如果是使用映射文件来实现);
死锁及死锁产生条件
死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。
死锁产生的四个必要条件:
- 互斥条件:进程对资源进行排他性使用,即在一段时间内某资源仅为一个进程所占用;
- 请求和保持条件:当进程因请求资源而阻塞时,对已获得的资源保持不放;
- 不可剥夺条件:进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完时由自己释放;
- 环路等待条件:各个进程组成封闭的环形链,每个进程都等待下一个进程所占用的资源释放;
防止死锁的三个办法:
- 资源一次性分配:破坏请求和保持条件,一个进程占有资源有且仅有在所有所需资源都可获得的情况下才给予分配;
- 可剥夺资源:破坏不可剥夺条件,可剥夺一个进程已经占有的资源;
- 资源有序分配法:破坏循环/环路等待条件;
预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。
由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法时银行家算法。
哲学家就餐问题
五个哲学家围在一个圆桌就餐,每个人都必须拿起两把叉子才能就餐。每个哲学家的行为伪代码如下:
while(1) {思考if(饿){拿左叉子拿右叉子用餐放下左叉子放下右叉子}
}
当五个哲学家同时拿起了其左边的叉子,导致满足了死锁的四个条件,造成死锁。解决死锁思路:
- 服务生解法:服务生作为统一管理者,负责叉子的分配;
- 最多四个哲学家:抽屉原则,资源多于哲学家所需;
- 仅当一个哲学家两边筷子都可用时才允许拿叉子:一次性分配资源;
- 给所有哲学家编号,奇数号哲学家必须先拿左边的叉子,偶数号的必须先拿右边的:打破环路等待条件;
信号量(Semaphore)及PV原语
信号量和PV原语由Dijkstra提出,Dijkstra的贡献:
- 程序设计:结构化程序设计之父,提出goto语句是有害的
- 操作系统:信号量,PV原语;
- 计算机网络:单源最短路算法,进行路由表维护;
信号量
- 互斥:P、V在同一个进程中;
- 同步:P、V在不同进程中;
信号量值含义
- S > 0 S > 0 S>0: S S S表示可用资源个数;
- S = 0 S = 0 S=0:表示无可用资源,无等待进程;
- S < 0 S < 0 S<0: ∣ S ∣ |S| ∣S∣表示等待队列中进程个数;
信号量实现的数据结构
struct semaphore {int value; //表示剩余资源个数pointer_PCB queue; //表示等待资源的队列,指向PCB,表示有哪些进程在等待资源
}
P原语和V原语
PV原语均是原子性的,不可被打断,可禁用打断即关闭中断的方式来实现原子性。
/************************************************************************/
P(s) { s.value = s.value--;//若是s.value大于等于0,则说明资源可申请到,撇开if代码//若是s.value小于0,则说明在申请资源时已无可用资源,//当前进程应加入等待队列if(s.value < 0) {将该进程状态置为等待状态;将该进程的PCB插入相应的等待队列s.queue末尾}
}
/************************************************************************/
V(s) {s.value = s.value++;//若是s.value大于0,则说明之前并没有进程在等待资源,简单将资源增加即可//若是s.value小于等于0,则说明所归还资源是有进程在等待的,则唤醒等待队列中//最先等待的进程,分配资源,并将其插入就绪队列if(s.value <= 0) {唤醒相应等待队列s.queue当中等待的一个进程;改变其状态为就绪态;并将其插入就绪队列;}
}
/************************************************************************/
PV原语解决实际问题
- 解决司机与售票员问题,协助关系。同一个信号量存在于不同进程之间,解决同步问题。
- 解决民航售票问题,互斥关系。同一个信号量存在于一个进程当中,解决互斥问题。
- 解决汽车租赁问题,两部敞篷车四个顾客租。
解决司机与售票员问题 | 解决民航售票问题 | 解决汽车租赁问题 |
进程间通信、死锁、信号量、PV原语相关推荐
- linux的pv原语
信号量 PV原语 原语 免费编辑 添加义项名 原语 操作系统或计算机网络用语范畴.是由若干条指令组成的,用于完成一定功能的一个过程.primitive or atomic action 是由若干个机器 ...
- linux进程间通信快速入门【三】:信号量(XSI、POSIX以及PV原语)
文章目录 XSI semget semop.semtimedop semctl 基于共享内存demo修改 XSI信号量的限制 PV原语 PV控制并发进程数 POSIX信号量 使用posix命名信号量 ...
- 进程的同步、互斥以及PV原语
在处理进程间的同步与互斥问题时,我们离不开信号量和PV原语,使用这两个工具的目的在于打造一段不可分割不可中断的程序.应当注意的是,信号量和PV原语是解决进程间同步与互斥问题的一种机制,但并不是唯一的机 ...
- 【 Linux 】进程间通信之信号量
进程间通信方式---信号量 1.概念 为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域.临 ...
- java pv原语_PV操作原理概述
一.PV原语的含义 P操作和V操作是不可终端的程序段,成为原语,PV原语及信号量的概念都是由荷兰科学家E.W.Dijkstra提出的.信号量sem是一个整数.Sem大于等于零时代表可供并发进程使用的资 ...
- windows多线程(九) PV原语分析同步问题
一.PV原语介绍 PV原语通过操作信号量来处理进程间的同步与互斥的问题.其核心就是一段不可分割不可中断的程序. 信号量的概念1965年由著名的荷兰计算机科学家Dijkstra提出,其基本思路是用一种新 ...
- linux pv 信号量,Linux信号量PV操作
1://假设两个进程(父子进程)对一个文件进行写操作,但是这个文件同一时间只能有一个进程进行写操作. 2://利用信号量实现pv操作 3:#include 4:#include 5:#include ...
- linux互斥锁和PV原语
刚接触linux互斥锁的时候可能会比较抽象,所以本文想要用PV原语来更加具体的理解linux互斥锁.如若有误,烦请指出,不甚感激! 由于线程共享了进程的资源和地址空间,因此,任何线程对系统资源的操作都 ...
- 8 操作系统第二章 进程管理 信号量 PV操作 用信号量机制实现 进程互斥、同 步、前驱关系
文章目录 1 信号量机制 1.1 整形信号量 1.2 记录形信号量 1.3 信号量机制小结 2 用信号量机制实现进程互斥.同 步.前驱关系 2.1 信号量机制实现进程互斥 2.2 信号量机制实现进程同 ...
最新文章
- mysql 主从复制的1032错误
- 【干货】Duang!看好产品是如何增加情感化设计的?
- RabbitMQ Header模式
- 太快了,太变态了:什么会影响Java中的方法调用性能?
- Study Notes ASP.Net 之Theme Skin
- Oracle数据块损坏的恢复实例
- myeclipse查询mysql出来的汉字是乱码
- gophp解释器_go语言环境搭建、基本使用
- centos7 aarch64 环境编译安装MP4Box
- win10计算机打开之后隐藏3d对象视频,Win10系统隐藏/删除此电脑中的3D对象文件夹的方法...
- sugarnms如何快速实现网管软件定制开发?
- 斐波那契数列+pyton
- HADOOP学习详细教程
- 最全的厚黑学...教你怎样混社会(转...作者不是一般的城府,但这就是中国真实的社交关系,深的很)
- php 打开word显示无法打开文件,word无法打开文件,因为内容有误怎么办
- 迈向“超人认知”:脑机接口的未来
- thunder client轻量级api调用小记
- 1007: 【顺序结构】截钢管
- 布莱因瓶matlab,8字形 克莱因瓶 matlab
- 芝麻动态码-小程序动态二维码生成
热门文章
- java criteria and_Criteria 笔记
- 最好的文本框样式 最漂亮的文本框样式 textbox css样式
- Autojs Pro 9.3解除布局识别限制、解除打包后限制
- String 两种实例化对象的区别
- 怎样掌握在和客户沟通中的小技巧
- [Warning] incompatible implicit declaration of built-in function ‘memset‘
- 力扣851.喧闹和富有(DFS)
- SAP BASIS ADM100 中文版 Unit 1(1)
- 红外线遥控器原理及编程
- 《江城子》~ 程序员~