<操作系统>并发
相关术语
进程的交互:根据进程相互之间知道对方的程度分类为如下几个等级。
- 进程间的资源竞争。并发进程访问同一资源的时候,会发生冲突。当两个进程访问同一资源的时候,由于并不知道对方的存在,两者之间没有信息交流,所以一个进程的执行必定会影响到另外一个进程,例如,当资源被其中一个进程访问的时候,另外一个进程就必须处于等待状态。竞争进程之间需要控制三个问题,互斥,死锁和饥饿。互斥就是一个进程在临界区(访问临界资源的那一部分程序)访问资源,其它进程必须等待在临界区外,不能进入临界区。死锁就是一组进程中的每个进程都在等待某个事件,而只有在这种进程中的其他被阻塞的进程才可以触发该事件,这时就称这组进程发生死锁.饥饿就是一组进程中某个进程永远也访问不到资源。
- 进程通过共享的合作。进程在不知道对方的情况下进行交互。为了确保访问资源的正确性,必须进行合作。
- 进程通过通信的合作。由于在传递消息的过程中,进程间未共享任何对象,因而这类合作不需要互斥,但是仍然存在死锁和饥饿问题
互斥的要求:
- 必须强制实施互斥,即一次只确保一个进程处于临界区。
- 非临界区的进程不能干扰其他进程。
- 绝不允许出现需要访问临界区的进程被无限延迟的情况出现。
- 对相关进程的执行速度和处理器的数量没有要求和限制。
- 一个进程滞留在临界区的时间是有限的。
互斥的硬件支持:中断禁用;专用机器指令(比较和交换指令,交换指令)
互斥的软件支持:
- 信号量:一种在进程间传递消息的整数值,递减操作阻塞一个进程,递增操作接触一个进程的阻塞。
信号量看成一个值为整数的变量。主要有三个操作:
- 信号量可以初始化为非负数
- semWait操作使信号量减一,若值为负数,则阻塞执行semWait的进程,否则进程继续执行
- semSignal使信号量加1,若值小于等于0,则被semWait操作阻塞的进程恢复执行。
- 二元信号量:只取0和1的信号量
- 可以初始化为0或1
- semWaitB检查信号的值,若为0,则进行执行semWaitB就会受阻,若值为1,那么将其改为0,然后继续执行
- semSignalB检查是否有任何进程在该信号上受阻,若受阻,则通过semWaitB操作,受阻的进程将会被唤醒,若没有进程受阻,那么值设为1
- 互斥量:加锁和解锁必须为同一个进程.
- 条件变量:用于阻塞进程,直到条件为真
- 管程:一个或者多个过程,一个初始化序列或者局部数据组成的软件模块。
- 局部变量只能被管程的过程所访问。任何外部过程都不能访问
- 一个进程调用管程的过程进入管程
- 任何时候,只能有一个进程在管程中执行,调用管程过程的其他进程都会被阻塞,以等待管程可用。
管程使用条件变量提供同步支持,这些变量包含在管程中,并且只有在管程中才能被访问。条件变量有两个操作
- cwait(c):调用进程的执行在条件c上阻塞,管程现在可以被另外一个进程调用
- csignal(c):恢复执行在cwait之后的因某些条件被阻塞的进程。
管程优于信号量在于:(1)所有的同步机制都被限制在管程内,不仅有利于验证同步的正确性,并且易于检测错误。(2)若一个管道被正确编写,则所有进程对受保护的资源的访问都是正确的,而信号量得保证所有访问资源得进程被正确编写时,资源访问才是正确的。
- 信箱/消息:
进程交互的时候,必须满足同步和通信,需要同步去实施互斥,交换信息来实现合作。消息传递是实现进程交互的一种方式。具备两个基本操作,也是最小操作集。
- send(destination,message),进程以消息的形式向目标进程发送消息。
- receive(source,message),接受消息。
阻塞的可能性:
- send阻塞,receive阻塞,发送方和接收方都将阻塞,直到完成消息的传递。
- send无阻塞,receive阻塞,接收方被阻塞,直到收到消息
- send无阻塞,receive无阻塞。
无阻塞send会隐藏一个潜在的错误:错误会导致进程重复发送消息。这些消息可能消耗系统资源,进而损害其他进程。
消息传递过程中需要确定哪个进程接收消息:使用寻址操作,包括直接寻址和间接寻址。
- 直接寻址:(1)对于send,参数中包含目标进程的标识符.(2)对于receive,两种方式,一种是要求进程显示指定源进程,另外一种是不可能指定所期望的源进程(打印机服务)。不可能指定所希望的源进程时,通过source参数保存相应信息
- 间接寻址:消息不直接从源进程传递到目标进程,而是借助于信箱,它是一个共享数据结构,该结构由临时保存消息的队列构成。
读者/写者:有一个数据区被多个进程所共享,有些进程只用于从数据区中读取数据,有些进程只像数据区中写入数据。并满足如下几个条件:
- 读取数据的进程是没有数量限制的
- 一次只有一个写进程可以向数据区写入数据
- 若一个写进程正在写入数据,则禁止任何进程访问数据区。
生产者/消费者问题不能看成读者/写者问题,因为生产者不仅仅是产生数据,它还会读取队列指针,确定在哪里写入,以及确定缓存区是否已经写满,消费者不仅仅是从队列中读取数据,它还会调整队列指针,以保证自己移走了一个资源。
死锁:一组相互竞争系统资源或者进行通信的进程间的永久阻塞,当一组进程中的每一个进程都在等待某个事件(等待释放请求的资源),而且仅有这组进程中被阻塞的进程才能触发这个事件的时候。
资源分类:可重用资源和可消耗资源
- 可重用资源:一次仅供一个进程安全的使用且不因使用而耗尽的资源。
- 可消耗资源:可被创建和销毁的资源,通常对某种类型可消耗资源的数目没有限制,一个无阻塞的生产进程可以创建任意数目的这类资源
死锁条件:
- 三个必要条件
- 互斥:一次只有一个进程可以使用资源。其它进程不能访问已经分配给其他进程的资源。
- 占有且等待:当一个进程等待其它进程释放资源的时候,继续占有这个资源
- 不可抢占:不能强行占据其他进程的资源
- 上面三个条件的一个潜在结果
- 循环等待:存在一个闭合链,链中的进程至少占据链中下一个进程的所需的一个资源。
处理死锁的方式:预防,避免和检测
预防:
- 预防互斥:该条件不可能禁止
- 预防占有且等待:(1)让进程一次性请求所有需要的资源,并阻塞这个进程直到所有的资源均被访问到。该方法存在两个缺点:首先该进程可能被阻塞特别长的时间;另外分配给一个进程的资源,在很长的时间没有被用到;进程可能事先不知道它所请求的资源。
- 预防不可抢占:(1)占有某些资源的进程若进一步申请请求资源,那么拒绝,并且该进程必须释放所占有的资源。必要时可再次申请。(2)当一个进程请求被另外一个进程所占据的资源的时候,操作系统可以抢占这个占据资源的进程。要求释放资源。第二种方案只有在任意两个进程优先级不同的情况下,才有可能预防死锁。
- 预防循环等待:定义资源类型的线性访问顺序。即访问资源P后,下一个必须访问另一个资源Q
避免:通过判断当前的请求是否能导致死锁,来决定是否分配资源。
- 进程启动拒绝:若一个进程的请求会导致死锁,那么禁止
- 资源分配拒绝:若一个进程增加的资源请求会导致死锁,那么不允许这一资源分配。
优点:无需死锁预防中的抢占和回滚进程。且与死锁预防相比限制更少。
缺点:
- 必须事先声明每个进程请求的最大资源
- 进程执行顺序必须没有任何同步要求的限制
- 分配的资源数量必须是固定的
- 占有资源的时候,进程不能退出。
死锁检测:死锁检测不限制资源访问或约束进程行为。只要有可能,被请求的资源就被分配给进程。操作系统周期性地执行一个算法检测死锁条件4(循环等待)
恢复:死锁检测到之后,需要恢复,常见方法:
- 直接取消所有的死锁进程。
- 把死锁进程回滚到前面定义的某些检查点,并重新启动所有进程。
- 连续取消死锁直到不在产生死锁
- 连续抢占资源直到不再存在死锁。
总结:
<操作系统>并发的更多相关文章
- 2.2 追求并发的极致-线程概论 -《zobolの操作系统学习札记》
2.2 追求并发的极致-线程概论 为了追求程序运行之间的并发性,计算机科学家们发明了进程.为了进一步的追求进程内部的并发性,工程师们又提出了线程. 正是线程的出现,给予了程序员更多地操纵OS的自由,可 ...
- IPC----哲学家就餐问题(并发与互斥)
哲学家就餐问题描述: 5个哲学家,5个筷子.5个哲学家围坐在一张桌子上,筷子放在分别放在每个哲学家的两旁.如果所有哲学家在某个时刻同时拿起左边的筷子,那么右边的筷子就都被其他的哲学家拿了,造成大家都无 ...
- 15.python并发编程(线程--进程--协程)
一.进程:1.定义:进程最小的资源单位,本质就是一个程序在一个数据集上的一次动态执行(运行)的过程2.组成:进程一般由程序,数据集,进程控制三部分组成:(1)程序:用来描述进程要完成哪些功能以及如何完 ...
- MySQL InnoDB配置并发线程( innodb_thread_concurrency)
http://www.ywnds.com/?p=9821 一.thread_concurrency 首先,最重要的一点,这个参数已经在最新版本的MySQL中被移除了,官方最新5.7版本的doc上面对t ...
- [操作系统知识储备,进程相关概念,开启进程的两种方式、 进程Queue介绍]
[操作系统知识储备,进程相关概念,开启进程的两种方式.进程Queue介绍] 操作系统知识回顾 为什么要有操作系统. 程序员无法把所有的硬件操作细节都了解到,管理这些硬件并且加以优化使用是非常繁琐的工作 ...
- Linux的原子操作与同步机制
Linux的原子操作与同步机制 .进程1执行完“mov eax, [count]”后,寄存器eax内保存了count的值0.此时,进程2被调度执行,抢占了进程1的CPU的控制权.进程2执行“cou ...
- 在Centos上安装RabbitMQ流程(转)
在Centos上安装RabbitMQ流程------------------------ 1. 需求 由于项目中要用到消息队列,经过ActiveMQ与RabbitMQ的比较,最终选择了RabbbitM ...
- 【翻译二】java--并发之进程与线程
Processes and Threads In concurrent programming, there are two basic units of execution: processes a ...
- Efficient&Elegant:Java程序员入门Cpp
最近项目急需C++ 的知识结构,虽说我有过快速学习很多新语言的经验,但对于C++ 老特工我还需保持敬畏(内容太多),本文会从一个Java程序员的角度,制定高效学习路线快速入门C++ . Java是为了 ...
随机推荐
- [PHP] 算法-把数组排成最小的数的PHP实现
输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323. 解法1 1.数组排序, ...
- 两个inline-block消除间距和对齐(vertical-align)
一.神奇的两个inline-block 很初级的问题,无聊决定写一个故事. 故事的主人公很简单,两个inline-block元素.代码如下,为了看起来简单明了,写得很简陋.效果图如右.发现有两个问题. ...
- React中使用styled-components的基础使用
今天准备来给大家分享分享React中styled-components的基础使用,仅仅是我个人的一些理解,不一定全对,有错误还请大佬们指出,496838236这是我qq,有想指点我的大佬随时加我qq好 ...
- python自动化开发-6
python的常用模块(续) shutil模块:主要是做文件复制的.文件,文件夹,压缩包等的处理模块. 常用的方法: shutil.copyfileobj:将文件的内容拷贝到另一个文件中. 例子: # ...
- python进程间通信--信号Signal
信号signal 是python进程间通信多种机制中的其中一种机制.可以对操作系统进程的控制,当进程中发生某种原因而中断时,可以异步处理这个异常. 信号通过注册的方式‘挂’在一个进程中,并且不会阻塞该 ...
- multipart/form-data文件上传
form表单的enctype属性:规定了form表单数据在发送到服务器时候的编码方式 application/x-www-form-urlencoded:默认编码方式 multipart/form-d ...
- [Demo_01] MapReduce 实现密码 Top10 统计
0. 说明 通过 MapReduce 实现密码 Top10 统计 通过两次 MapReduce 实现 1. 流程图 2. 程序编写 密码 Top10 统计代码
- zabbix-Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Connection refused
监控zabbix服务端这台服务器,然后显示Get value from agent failed: cannot connect to [[127.0.0.1]:10050]: [111] Conne ...
- Pygame安装教程
1.python --version 查看安装的Python版本, pip --version 查看安装的pip版本, 升级pip命令: python -m pip install --upgra ...
- Bash On Windows上安装JDK
1. 引言 由于实习生转正,公司给配了一台新电脑,配置不用多说,16G内存,i7-7700的CPU,128SSD的系统盘,1T的机械硬盘,虽然只有一个破核显.对于我个人而言,最重要的是系统从Windo ...