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

一、死锁

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

可重复使用的资源:

  • 在一个时间只能一个进程使用,且不能被删除。
  • 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,一经查实,立即删除!

相关文章

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

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

卡巴绿杀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...天下无毒)拥有全球最全的病毒库)拥有最快的全球剿毒反应速度) 基于稳定…

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

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

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

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

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

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

Django models模型

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

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

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

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

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

面试之操作系统

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

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

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

GCC for Win32开发环境介绍

GCC for Win32开发环境介绍(1) 第一章 在视窗操作系统下的GCC 第一节GCC家族概览 GCC是一个原本用于Unix-like系统下编程的编译器。不过,现在GCC也有了许多Win32下的移植版本。所以,也许对于许多Windows开发者来说,GCC还是一个比较陌生的东西…

reg型变量怎么赋值_UiPath变量介绍和使用

1 变量变量主要用于存储数据,它在RPA中扮演重要的数据传递角色,是RPA编程不可或缺的一部分。它包括变量名称和变量的值,变量的值支持多种数据类型,包括从通用值,文本,数字,数据表,时…

深度学习之概述

深度学习的应用场景 1、图像应用: 1.1 大规模(大数据量)图片识别(聚类/分类),如人脸识别,车牌识别,OCR等。人脸识别算法:① faceID ② faceNet 1.2 以图搜图,图像分割 1.3 目标检测&#xff0…

如何根据对象获取到对应的表名_Excel VBA 常用对象二

下面继续讲解上一节中未讲完的内容:Excel VBA编程中常常使用的那些对象到底是什么,如何在代码中表示它们。Worksheet对象Worksheet对象代表工作表。工作簿中的每个工作表都是一个Worksheet对象,所有Worksheet对象构成了Worksheets集合。我们使…

深度学习之 BP 算法

神经网络的一种求解W的算法,分为信号“正向传播(FP)”求损失,“反向传播(BP)”回传误差;根据误差值修改每层的权重,继续迭代。 BP算法也叫做δ算法。以三层的感知器为例(假定现在隐层和输出层均存在相同类型的激活函数…

深度学习之 RBF神经网络

RBF神经网络通常只有三层,即输入层、中间层和输出层。其中中间层主要计算输入x和样本矢量c(记忆样本)之间的欧式距离的Radial Basis Function (RBF)的值,输出层对其做一个线性的组合。 径向基函数: RBF神经网络的训练…

redis 队列_Redis与Rabbitmq消息队列的区别

将redis发布订阅模式用做消息队列和rabbitmq的区别:可靠性 redis :没有相应的机制保证消息的可靠消费,如果发布者发布一条消息,而没有对应的订阅者的话,这条消息将丢失,不会存在内存中;rabbit…

EasyUI中那些不容易被发现的坑——EasyUI重复请求2次的问题

问题控件:datagrid、combobox、所有能设置url属性的控件 问题版本:1.4.4、1.4.5(之前的版本没测) 问题如图: 重复请求2次,错误代码如图: 错误问题分析:html加载的时候回请求url加载数…

ElasticSearch Java API

ElasticSearch-Java Client类型 ElasticSearch-TransportClient环境准备 ElasticSearch-TransportClient连接 ElasticSearch-Document APIs ElasticSearch-搜索-原理 ElasticSearch-搜索-问题 ElasticSearch-搜索-问题解决思路 ElasticSearch-搜索-SearchType-类型一 E…

深度学习之卷积神经网络(Convolutional Neural Networks, CNN)

前面, 介绍了DNN及其参数求解的方法(深度学习之 BP 算法),我们知道DNN仍然存在很多的问题,其中最主要的就是BP求解可能造成的梯度消失和梯度爆炸.那么,人们又是怎么解决这个问题的呢?本节的卷积神经网络(Convolutional Neural Networks, CNN)就是一种解决方法. 我们…