清华大学《操作系统》(二十):死锁和进程通信

一、死锁

死锁:一组阻塞的进程(两个或多个),持有一种资源,等待获取另一个进程所占有的资源,而导致谁都无法执行。 

可重复使用的资源:

  • 在一个时间只能一个进程使用,且不能被删除。
  • OS避免杀死拥有资源的进程;进程使用资源后要释放,其他进程可重用;
  • 有物理资源(cpu, I/O通道,主和副存储器),也有抽象的资源(设备和数据结构,如文件,数据库和信号量);
  • 如果每个进程拥有一个资源并请求其他资源,可能导致死锁

资源分配图

死锁的必要条件

  • 互斥:任何时刻只能有一个进程使用一个资源实例
  • 持有并等待:进程保持至少一个资源,并正在等待获取其他进程持有的资源
  • 无抢占,一个资源只能被进程自愿释放
  • 循环等待,形成闭环

二、死锁处理方法

1、死锁预防(dead-lock prevention )

打破死锁出现的条件 ,确保系统永远不会进入死锁状态

  • 互斥:互斥的共享资源封装成可同时访问。占用非共享资源 会增加不确定性 不推荐
  • 占用并等待:保证当一个进程请求资源时,不持有任何其他的资源;all or nothing 需要进程请求并分配其所有资源。资源利用率低,可能饥饿
  • 无抢占:允许抢占占有某些资源的进程。如进程请求不能立即分配的资源,则释放已占有资源,只在能够同时获得所有需要资源时,才执行分配操作
  • 循环等待:对所有资源类型进行排序,并要求每个进程按照资源的顺序进行申请,会出现资源利用不够

2、死锁避免( deadlock avoidance )

当进程运行过程中,根据申请资源的情况判断会不会死锁,如果会就不给资源。

最简单有效就是要求每个进程声明它需要的每个类型资源的最大数目,资源在分配中根据最大数目限定提供与分配的资源数目,死锁避免算法要动态检查资源的分配状态来避免环形等待。

环形等待不一定会死锁。分为安全状态,不安全状态

3、死锁检测和恢复(Deadlock Detection & Recovery)

在检测到运行系统进入死锁状态后,进行恢复

4、由应用程序处理死锁

通常操作系统忽略死锁,大多数操作系统(包括UNIX)的做法

三、银行家算法

1、有多个资源实例 ;每个进程必须能最大限度地利用资源 ;找到理想执行时序,找到就认为是安全的

类比:银行家——操作系统;资金——资源;客户——申请资源的线程

2、银行家算法:数据结构

  • n=线程数量 m=资源类型数量(一个线程可能需要多种资源)
  • Max 总需求量:n*m矩阵 max[i, j]=k 进程Pi最多需要资源类型Rj的k个实例
  • Available 剩余空闲量:长度为m的向量,如果available[j]=k 则有k个类型Rj的资源实例可用
  • Allocation 已分配量:n*m矩阵 allocation[I, j]=k 进程Pi已经分配了资源类型Rj的k个实例
  • Need 未来需要量: n*m矩阵 need[i, j]=k 进程Pi可能需要资源类型Rj的k个实例
  • Max[i, j]=need[I,j]+allocation[i,j]

3、安全状态判断


四、进程通信概念

1、进程通信( IPC: inter process communication)

  • 进程通信:是进程进行通信和同步的机制
  • IPC facility 提供2个操作: send(message)、receive (message)
  • 进程P和Q想通信,需要: 在它们之间建立通信链路 ,通过send/receive交换消息
  • 通信链路的实现: 物理(例如,共享内存,硬件总线)、 逻辑(如逻辑属性)

2、直接通信

为了实现直接通信,要有发送和接收的ID ;进程必须正确地命名对方 ;

  • send( P, message) - 发送信息到进程P ;receive( P, message) - 接收进程P的信息
  • 通信链路的属性 :自动建立链路 ;一条链路对应一对通信进程 ;每对进程之间只有一个链接存在 ;链接可以是单向的,但通常为双向的

2、间接通信

为了实现间接通信,要发送到共享区,发送方和接收方都不关注具体的另一方是谁

每个消息队列都有一个唯一的ID;只有共享了相同消息队列的进程,进程才能通信

  • 通信链路的属性:只有共享了相同消息队列的进程,才建立链路;链接可以与许多进程相关联;链接可以是单向或双向
  • 通信流程: Ⅰ、建立一个新的消息队列 ;Ⅱ、通过消息队列发送和接收消息 ;Ⅲ、销毁消息队列 
  • 基本通信操作: send(A, message) – 发送消息到队列A ;receive(A, message) - 从队列A接受消息

3、阻塞与非阻塞通信

进程通信可划分为阻塞(同步)和非阻塞(异步)

  • 阻塞通信:阻塞发送、阻塞接收
  • 非阻塞通信:非阻塞发送、非阻塞接收

4、通信链路缓冲

队列的消息被附加到链路的3种方式 

  • 0容量—0 messages 发送方必须等待接收方 
  • 有限容量—n messages 的有限长度,发送方在队列满的时候要等待 
  • 无限容量—理想状况,不用等

六、信号和管道

1、信号(Signal)

定义:信号是进程间的软件中断通知和处理机制,如:SIGKILL,SIGSTOP等

信号的接收处理

  1. 捕获 catch : 指定信号处理函数被调用
  2. 忽略 ignore: 依靠操作系统的默认操作 , 如进程终止、进程挂起
  3. 屏蔽 mask:禁止进程接收和处理信号(可能是暂时的,当处理同样类型的信号)

不足:不能传输要交换的任何数据

优点:效率很高,异步。一般处理完后会回到被打断的进程。

2、管道

管道是进程间基于内存文件的通信机制。子进程从父进程继承包括文件描述符等的资源。进程不知道另一端:可能从键盘、文件、程序读取;可能写入终端、文件、程序。

缺省文件描述符:0 stdin, 1 stdout, 2 stderr

与管道相关的系统调用:

  • 读管道:read(fd,buffer,nbytes) 如scanf()是基于它实现的
  • 写管道:write(fd,buffer,nbytes) 如printf()是基于它实现的
  • 创建管道:pipe(rgfd) rgfd是2个文件描述符组成的数组。rgfd[0]是读文件描述符;rgfd[1]是写文件描述符

管道示例

UNIX想灵活组合小程序,一个的输出是另一个的输入,用竖线|来表示把ls的输出stdout重定向,通过一个类似buffer的管道作为stdin传输给more。More以为是从i/o给它的,实际是ls给它的。进程不关心。 

七、消息队列和共享内存

1、消息队列

管道必须有父进程,数据是字节流,没有数据结构。消息队列可以多个不相干的进程来传递数据,而且message作为一个字节序列存储,message quenues是消息数组。是一个有意义的结构化。 按FIFO/FILO管理 

消息队列是由操作系统维护的以字节序列为基本单位的间接通信机制。每个消息是一个字节序列;相同标识的消息组成按先进先出顺序组成一个消息队列。

消息队列的系统调用

  • msgget(key,flags)获取消息队列标识
  • msgsnd(QID,buf,size,flags)发送消息
  • msgrcv(QID,buf,size,type,flags)接收消息
  • msgctl(...)消息队列控制

2、共享内存

共享内存是把同一个物理内存区域同时映射到多个进程的内存地址空间的通信机制。

每个进程都有私有内存地址空间;每个进程的内存地址空间需明确设置共享内存段;

同一进程中的线程总是共享相同的内存地址空间

优点:快速、方便地共享数据;

缺点:必须用额外的同步机制来协调数据访问

共享内存是最快的方法,一个进程写另一个进程立即可见,没有系统调用干预,没有数据复制。

共享内存系统调用

  • shmget(key,size,flags)创建共享段
  • shmat(shmid,*shmaddr,flags)把共享段映射到进程地址空间
  • shmdt(*shmaddr)取消共享段到进程地址空间的映射
  • shmctl(...)共享段控制

需要信号量等机制协调共享内存的访问冲突。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python操作redis实例_Java,php,Python连接并操作redis实例

1、Java连接并操作redis在Eclipse里新建一个java project,导入jedis-*.jar包。示例代码,其他对应的操作类型见:http://my.oschina.net/u/2391658/blog/705069import redis.clients.jedis.Jedis;//示例代码public class RedisTest {public sta…

java: cannot execute binary file 如果遇到这个错,一般是操作系统位数出问题了。

[roottestserver usr]# java/jdk1.6.0_12/bin/java-bash: java/jdk1.6.0_12/bin/java: cannot execute binary file后来检验,检查了一段时间,没有问题,最后有高人提示经验证,是64位版本移到32位上。本文转自 jxwpx 51CTO博客&…

div 自适应高度

自适应高度 ,设置最小高度;通常情况下,没有设置高度,div默认自适应高度且无最低高度 1 div{ 2 _height:200px; /* css 注解: 仅IE6设别此属性,假定最低高度是200px ,设置高度200px&#xff0c…

GCC使用详情

1.前言 GCC编译器的手册(GCC MANUAL)的英文版已经非常全面,并且结构也非常完善了,只是一直都没有中文的版本,我这次阅读了GCC编译器的主要内容,对手册的内容进行了结构性的了解,认为有必要对这次阅读的内容进行整理&am…

清华大学《操作系统》(二十二):文件系统

文件系统和文件: 文件系统是操作系统中管理持久性数据的子系统,提供数据存储和访问功能,组织、检索、读写访问数据。文件是具有符号名,由字节序列构成的数据项集合,是文件系统的基本数据单位,文件名是文件…

卡巴绿杀6 By Moshow魔手

卡巴绿杀6 By Moshow魔手 Kaspersky Anti-Virus Move-edition 6 (-_-b汗Move Edition...)【这是卡巴斯基绿色移动版本推荐用于u盘】By Moshow魔手 [url]Http://Hi.baidu.com/MoshowGame[/url]祝o(∩_∩)o...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…

python将字符串写入csv_用Python将字符串值写入CSV文件

我有一个很大的数据集,在第二列有句子和他们的情绪状态。我开发了代码来将它们读作numpy数组。我需要的是,如果一个句子的情感是中性的,那么返回为真,否则返回假。if-else条件返回的每个结果都应写入CSV文件。但是这里它只在CSV文…

加载静态文件,父模板的继承和扩展

用url_for加载静态文件<script src"{{ url_for(static,filenamejs/login.js) }}"></script>flask 从static文件夹开始寻找可用于加载css, js, image文件继承和扩展把一些公共的代码放在父模板中&#xff0c;避免每个模板写同样的内容。base.html子模板继…

清华大学《操作系统》(二十三):I/O子系统

常见设备接口类型&#xff1a; 1、字符设备&#xff1a;键盘鼠标、串口 a.以字节为单位顺序访问 b.I/O命令通常使用文件访问接口和语义 2、块设备&#xff1a;磁盘、磁带、光驱 a.均匀的数据块访问 b.I/O命令通常使用文件系统接口&#xff0c;也可以使用内存映射访问 3、网络…

百度地图 Android SDK - 个性化地图

什么是百度个性化地图Android SDK&#xff1f; 百度个性化地图Android SDK是一套基于Android 2.2及以上版本号设备的应用程序接口&#xff0c;您能够通过该套接口实现主要的地图功能&#xff0c;而且能够定制地图样式&#xff0c;实现个性化地图。 该接口提供下面功能&#xff…

mysql读写分离_MySQL基于amoeba读写分离实验

主从复制只是一个同步数据的方式读写分离&#xff1a;只在主的上面写&#xff0c;只在从的上面读读写分离方案&#xff1a;【1】基于程序代码内部 (生产环境中应用最广泛&#xff0c;性能最好&#xff0c;需要开发人员来实现)【2】基于中间代理层的实现amoeda 是阿里巴巴使用的…

Django models模型

Django models模型 一. 所谓Django models模型&#xff0c;是指的对数据库的抽象模型&#xff0c;models在英文中的意思是模型&#xff0c;模板的意思&#xff0c;在这里的意思是通过models&#xff0c;将数据库的借口抽象成python自己的一个类。然后在python Django框架其他代…

Page.FindControl方法找不到指定控件的原因

在ASP.NET 2.0中&#xff0c;引入了MasterPage的机制&#xff0c;在当前页使用MasterPage的情况下&#xff0c;放在 ContentPlaceholder1这样的内容页的控件无法用Page.FindControl来查找&#xff0c;原因何在&#xff1f;MSDN对FindControl的解释&#xff1a;在当前的命名容器…

ATT汇编语言与GCC内嵌汇编简介

AT&T汇编语言与GCC内嵌汇编简介 1 AT&T 与INTEL的汇编语言语法的区别 1.1大小写 1.2操作数赋值方向 1.3前缀 1.4间接寻址语法 1.5后缀 1.6指令 2 GCC内嵌汇编 2.1简介 2.2内嵌汇编举例 2.3语法 2.3.1汇编语句模板 2.3.2输出部分 2.3.3输入部分 2.3.4限制字符 2.3.5破…

Python内存管理以及垃圾回收机制

垃圾回收&#xff1a;用通俗点的语言解释就是内存管理和垃圾回收的过程. 大管家refchain 在Python的C源码中有一个名为refchain的环状双向链表&#xff0c;这个链表就比较厉害了&#xff0c;因为Python程序中一旦创建对象都会把这个对象添加到refchain这个链表中。也就是说他…

pythonfillcolor_openpyxl 填充颜色(单元格)

如果需要填充某个单元格的颜色需要3步&#xff1a;# 1-加载库文件from openpyxl import Workbookfrom openpyxl.styles import PatternFill#2-新建一个工作簿wb Workbook()ws wb.active#随便赋个值d4 ws[D4]d4 43d4.value#3-设置样式&#xff0c;并且加载到对应单元格fill …

Mint-ui中loadmore(上拉加载下拉刷新)组件在ios中滑动会触发点击事件的解决方法...

bug说明&#xff1a; Mint-ui中loadmore(上拉加载下拉刷新)组件 在 使用fastclick的情况下 &#xff0c;在ios设备中滑动会触发点击事件&#xff1b; 解决方法&#xff1a; 我是按需引入&#xff0c;去项目中找到loadmore下的index.js&#xff0c;全部引入的要找mint下面mint-u…

【Ext.Net学习笔记】01:在ASP.NET WebForm中使用Ext.Net

Ext.NET是基于跨浏览器的ExtJS库和.NET Framework的一套支持ASP.NET AJAX的开源Web控件&#xff0c;包含有丰富的Ajax运用&#xff0c;其前身是Coolite。 下载地址&#xff1a;http://www.ext.net/download/ 示例地址&#xff1a;http://examples.ext.net/ 1.首先下载Ext.Net,地…

面试之操作系统

基本特征 1. 并发 并发是指宏观上在一段时间内能同时运行多个程序&#xff0c;而并行则指同一时刻能运行多个指令。并行需要硬件支持&#xff0c;如多流水线、多核处理器或者分布式计算系统。操作系统通过引入进程和线程&#xff0c;使得程序能够并发运行。 2. 共享 共享是指…

mysql新增列并同时增加数据_图解MySQL | [原理解析] MySQL 为表添加列 是怎么quot;立刻quot;完成的...

在上一期图解 图解MySQL | MySQL DDL为什么成本高&#xff1f;中&#xff0c;我们介绍了&#xff1a;传统情况下&#xff0c;为表添加列需要对表进行重建腾讯团队为 MySQL 引入了 Instant Add Column 的方案(以下称为 "立刻加列" 功能)可以快速完成 为表添加列 的任务…