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 条评论
登录 后参与评论

相关文章

来自专栏一个会写诗的程序员的博客

Spring Reactor 项目核心库Reactor Core

Non-Blocking Reactive Streams Foundation for the JVM both implementing a Reactiv...

2802
来自专栏一个爱瞎折腾的程序猿

sqlserver使用存储过程跟踪SQL

USE [master] GO /****** Object: StoredProcedure [dbo].[sp_perfworkload_trace_s...

2870
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8678
来自专栏C#

DotNet加密方式解析--非对称加密

    新年新气象,也希望新年可以挣大钱。不管今年年底会不会跟去年一样,满怀抱负却又壮志未酬。(不过没事,我已为各位卜上一卦,卦象显示各位都能挣钱...)...

5968
来自专栏pangguoming

Spring Boot集成JasperReports生成PDF文档

由于工作需要,要实现后端根据模板动态填充数据生成PDF文档,通过技术选型,使用Ireport5.6来设计模板,结合JasperReports5.6工具库来调用渲...

1.4K7
来自专栏我和未来有约会

Silverlight第三方控件专题

这里我收集整理了目前网上silverlight第三方控件的专题,若果有所遗漏请告知我一下。 名称 简介 截图 telerik 商 RadC...

4395
来自专栏Golang语言社区

【Golang语言社区】GO1.9 map并发安全测试

var m sync.Map //全局 func maintest() { // 第一个 YongHuomap := make(map[st...

5458
来自专栏大内老A

The .NET of Tomorrow

Ed Charbeneau(http://developer.telerik.com/featured/the-net-of-tomorrow/) Exciti...

38610
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

3015
来自专栏张善友的专栏

Silverlight + Model-View-ViewModel (MVVM)

     早在2005年,John Gossman写了一篇关于Model-View-ViewModel模式的博文,这种模式被他所在的微软的项目组用来创建Expr...

3278

扫码关注云+社区