linux网络编程之进程间通信基础(二):死锁、信号量与PV原语简介

一、死锁

(1) 死锁是指多个进程之间相互等待对方的资源,而在得到对方资源之前又不释放自己的资源,这样,造成循环等待的一种现象。如果所有进程都在等待一个不可能发生的事,则进程就死锁了。

(2)死锁产生的必要条件:

互斥条件

进程对资源进行排它性使用,即在一段时间内某资源仅为一个进程所占用。 

请求和保持条件

当进程因请求资源而阻塞时,对已获得的资源保持不放。 

不可剥夺条件

进程已获得的资源在未使用完之前,不能被剥夺,只能在使用完时由自己释放。 

环路等待条件

各个进程组成封闭的环形链,每个进程都等待下一个进程所占用的资源

(3)防止死锁的办法

资源一次性分配:(破坏请求和保持条件) 可剥夺资源:(破坏不可剥夺条件) 资源有序分配法:(破坏循环等待条件)

(4)死锁避免

预防死锁的几种策略,会严重地损害系统性能。因此在避免死锁时,要施加较弱的限制,从而获得较满意的系统性能。 由于在避免死锁的策略中,允许进程动态地申请资源。因而,系统在进行资源分配之前预先计算资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,进程等待。其中最具有代表性的避免死锁算法是银行家算法。

(5)银行家算法

为保证资金的安全,银行家规定:  *  当一个顾客对资金的最大需求量不超过银行家现有的资金时就可接纳该顾客;  *  顾客可以分期贷款,但贷款的总数不能超过最大需求量 * 当银行家现有的资金不能满足顾客尚需的贷款数额时,对顾客的贷款可推迟支付,但总能使顾客在有限的时间里得到贷款 * 当顾客得到所需的全部资金后,一定能在有限的时间里归还所有的资金. 

(6)哲学家就餐问题

五个哲学家围在一个圆桌就餐,每个人都必须拿起两根筷子才能用餐,当每个人都先拿起左筷子,等待右筷子的时候就会造成死锁。

哲学家就餐问题解法

服务生解法 最多4个哲学家 仅当一个哲学家两边筷子都可用时才允许他拿筷子 给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之

二、信号量与PV原语

(1)信号量

信号量和P、V原语由Dijkstra(迪杰斯特拉)提出

struct semaphore {

int value;

pointer_PCB queue;

};

信号量

互斥:P、V在同一个进程中 同步:P、V在不同进程中

信号量值含义

S>0:S表示可用资源的个数 S=0:表示无可用资源,无等待进程 S<0:|S|表示等待队列中进程个数

(2)P原语伪代码

P(s) {

 s.value--;

if (s.value < 0) { 该进程状态置为等待状状态 将该进程的PCB指针插入相应的等待队列s.queue末尾 }

}

注意,PV 操作都是原子性操作,要么全部执行要么全部不执行,在阻塞后返回也算是完成一个流程,但如果设置了IPC_NOWAIT选项,当资源暂且不可用时直接返回错误,此时对信号量的操作都没有执行。

(3)V原语伪代码

V(s) {

 s.value++; if (s.value < =0) { 唤醒相应等待队列s.queue中等待的一个进程 改变其状态为就绪态 并将其插入就绪队列 }

}

(4)用PV原语解决司机与售票员问题

(5)用PV原语解决民航售票问题

每个客户端都在执行PV这样的操作流程

(6)用PV原语解决汽车租赁问题

有一汽车租赁公司有两部敞篷车可以出租,假定同时来了四个顾客都要租敞篷车,那么肯定会有两个人租不到。

每个顾客都在执行PV这样的操作流程。

参考:

《操作系统概念》

《TCP/IP详解 卷一》

《UNP》

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏余林丰

0.Java并发包系列开篇

  在我们想要谈论Java并发包(java.util.concurrent)的时候,这是一个头疼的问题,却又是每个Java工程师不得不掌握的一项技能。一直以来都...

1895
来自专栏数据和云

经典故障分析 - ASSM引发的索引争用与 enq HW -contention 等待事件

作者介绍: 孙加鹏 云和恩墨技术顾问 六年Oracle技术顾问经验,所服务的行业包括电信运营商、金融业、制造业等。 擅长Oracle的故障诊断、高可用架构、升级...

2844
来自专栏Golang语言社区

Goroutine是如何工作的

在golangweekly的第36期Go Newsletter中我发现一篇短文"How Goroutines Work" ,其作者在参考了诸多资料后,简短概要地...

2745
来自专栏腾讯技术工程官方号的专栏

支撑起腾讯公司计费业务的TDSQL(附PPT)

作者介绍:bluesea,腾讯金融云专家工程师,从事分布式数据库TDSQL研发工作。出版著作:《数据库查询优化器的艺术 原理解析与SQL性能优化》、《数据库事...

4648
来自专栏杨建荣的学习笔记

关于纠结的recycle pool的设置(r3笔记第5天)

现在生产环境中目前有一个很大的中继表,作为多个流程的数据流动所用,数据量很大。里面有clob字段,加上庞大的数据量,表就显得很臃肿了。 目前在做大批量的数据处理...

3317
来自专栏Golang语言社区

【Go 语言社区】Goroutine是如何工作的

在golangweekly的第36期Go Newsletter中我发现一篇短文"How Goroutines Work" ,其作者在参考了诸多资料后,简短概要地...

2304
来自专栏lonelydawn的前端猿区

MySQL应用优化

一、基本语句优化原则 (1).尽量避免在索引列上进行运算或函数操作,这样会导致索引失效 如: select * from t where Year(d)>=20...

1665
来自专栏老九学堂

进程与线程的区别?

进程是什么? 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是...

33511
来自专栏企鹅号快讯

超多干货!支撑起腾讯公司计费业务的TDSQL

深度技术文章,第一时间送达! 作者介绍: bluesea,腾讯金融云专家工程师,从事分布式数据库TDSQL研发工作。出版著作:《数据库查询优化器的艺术 原理解析...

2057
来自专栏java一日一条

以生活例子说明单线程与多线程

在我看来单从程序的角度来看,一个好的程序的目标应该是性能与用户体验的平衡。当然一个程序是否能够满足用户的需求暂且不谈,这是业务层面的问题,我们仅仅讨论程序本身。...

452

扫码关注云+社区