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

相关文章

来自专栏微信公众号:Java团长

即将发布的 JDK 10 有 109 项新特性,你喜欢哪些?

按计划,JDK 10 将于 3 月 20 日正式发布。据前 Oracle 员工 Simon Ritter 的统计,JDK 10 总共包含 109 项新特性。当然...

622
来自专栏机器人网

一文教你从PLC编程菜鸟变成高手

PLC编程软件由系统程序和用户程序两部分组成。系统程序包括监控程序、编译程序、诊断程序等,主要用于管理全机、将程序语言翻译成机器语言,诊断机器故障。PLC编程软...

4805
来自专栏恰同学骚年

操作系统核心原理-4.线程原理(下):死锁基础原理

我们都见过交通阻塞,一大堆汽车因为争夺行路权,互不相让而造成阻塞,又或者因为车辆发生故障抛锚或两辆车相撞而造成道路阻塞。在这种情况下,所有的车都停下来,谁也无...

1032
来自专栏Java3y

【SSH测试整合Demo】企业人事管理系统

前言 前面我们已经学习了怎么整合SSH框架了。是时候拿一个小项目来练练手了….我们现在要设计一个企业人事管理系统… 需求: **要求对员工信息进行维护; ** ...

40213
来自专栏有趣的django

一个完整的Django入门指南(三)

第五部分  Introduction Welcome to the 5th part of the tutorial series! In this tutor...

4837
来自专栏小樱的经验随笔

自己手动复现一个熊猫烧香病毒

最近逛了一下 bilibili ,偶然的一次机会,我在 bilibili 上看到了某个 up 主分享了一个他自己仿照熊猫病毒的原型制作的一个病毒的演示视频,虽然...

4772
来自专栏圣杰的专栏

ABP入门系列(10)——扩展AbpSession

源码路径:Github-LearningMpaAbp 一、AbpSession是Session吗? 1、首先来看看它们分别对应的类型是什么? 查看源码发现Ses...

3256
来自专栏XAI

企业支付宝账号开发接口教程--JAVA-UTF-8(实际操作------SpringMVC+JSP)

关于即时到账的开发。审核通过。简单测试如下。 希望看的可以收藏或者赞一下哦。 1:拥有自己的支付宝企业账号。去产品商店选择适合自己的方案。并签约合同。 ? 2:...

1.3K9
来自专栏圆方圆学院精选

【许晓笛】 EOS 智能合约案例解析(2)

之前的文章介绍了 eosio.token 智能合约的 hpp 文件,这次向大家介绍 eosio.token.cpp 文件,cpp 文件即 C++ 代码文件,智能...

1325
来自专栏coolblog.xyz技术专栏

Spring IOC 容器源码分析系列文章导读

Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本。经过十几年的迭代,现在的 Spring 框架已...

28310

扫码关注云+社区