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

相关文章

来自专栏子勰随笔

iMac使用过程中的简单故障解决

24410
来自专栏数据之美

修改 mysql/oracle/bash/vimrc/cmd 提示符格式与颜色

(1)修改mysql提示符: MySQL 客户端的默认提示符是 "mysql>",基本上没什么实际作用。其实可以修改这个提示符,让它显示一些有用的信息,例如当前...

281100
来自专栏有趣的django

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

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

51170
来自专栏恰童鞋骚年

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

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

14820
来自专栏desperate633

深入理解Spring框架的作用(Spring in action 学习笔记)激发POJO的潜能依赖注入应用切面使用模板消除样板式代码

纵览Spring , 读者会发现Spring 可以做非常多的事情。 但归根结底, 支撑Spring的仅仅是少许的基本理念, 所有的理念都可以追溯到Spring最...

28130
来自专栏老码农专栏

原 荐 一场版本升级引发的性能血案 - 之数

24330
来自专栏前端

使用jOrgChart插件实现组织架构图的展示

(3)使用jOrgChart插件,根据返回的数据将其子节点加入到相应的<li></li>中。

1K50
来自专栏一个番茄说

Swift中防止ptrace依附

在移动开发中,安全是一个很重要的话题,当然安全是没有绝对的,只能说尽可能的提高安全性。在iOS的开发中,为了防止别人窥视我们的App,我们得采用一些手段来进行防...

13830
来自专栏XAI

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

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

1.4K90
来自专栏机器人网

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

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

67950

扫码关注云+社区

领取腾讯云代金券