<操作系统>并发
相关术语
进程的交互:根据进程相互之间知道对方的程度分类为如下几个等级。
- 进程间的资源竞争。并发进程访问同一资源的时候,会发生冲突。当两个进程访问同一资源的时候,由于并不知道对方的存在,两者之间没有信息交流,所以一个进程的执行必定会影响到另外一个进程,例如,当资源被其中一个进程访问的时候,另外一个进程就必须处于等待状态。竞争进程之间需要控制三个问题,互斥,死锁和饥饿。互斥就是一个进程在临界区(访问临界资源的那一部分程序)访问资源,其它进程必须等待在临界区外,不能进入临界区。死锁就是一组进程中的每个进程都在等待某个事件,而只有在这种进程中的其他被阻塞的进程才可以触发该事件,这时就称这组进程发生死锁.饥饿就是一组进程中某个进程永远也访问不到资源。
- 进程通过共享的合作。进程在不知道对方的情况下进行交互。为了确保访问资源的正确性,必须进行合作。
- 进程通过通信的合作。由于在传递消息的过程中,进程间未共享任何对象,因而这类合作不需要互斥,但是仍然存在死锁和饥饿问题
互斥的要求:
- 必须强制实施互斥,即一次只确保一个进程处于临界区。
- 非临界区的进程不能干扰其他进程。
- 绝不允许出现需要访问临界区的进程被无限延迟的情况出现。
- 对相关进程的执行速度和处理器的数量没有要求和限制。
- 一个进程滞留在临界区的时间是有限的。
互斥的硬件支持:中断禁用;专用机器指令(比较和交换指令,交换指令)
互斥的软件支持:
- 信号量:一种在进程间传递消息的整数值,递减操作阻塞一个进程,递增操作接触一个进程的阻塞。
信号量看成一个值为整数的变量。主要有三个操作:
- 信号量可以初始化为非负数
- 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是为了 ...
随机推荐
- JAVA对Excel的导入导出
今天需要对比2个excel表的内容找出相同:由于要学的还很多上手很慢所以在这做个分享希望对初学的有帮助: 先是pom的配置: <dependency> <groupId>org ...
- 简单说一下UWP中的JumpList
在Windows10的10856这个版本中,微软为桌面版提供了一组新的应用交互方式,磁贴和Toast通知的个性化都有了一定的改善.针对磁贴方面,微软为我们提供了一组新的API来扩充我们对应用的交互方式 ...
- 汇编语言--CPU资源和存储器(二)
二.CPU资源和存储器 需要访问的硬件资源主要有:CPU内部资源.存储器和I/O端口. 1.寄存器组 (1)16位寄存器组 16位CPU所含有的寄存器有(见图2.1中16位寄存器部分): 4个数据寄存 ...
- 关于vue,webpack 中 “exports is not defined”报错
vue项目npm run dev 后项目报错 : 提示 “exports is not defined”. 导致这个问题是因为balbel的配置文件.babelrc的问题: { "prese ...
- git命令详解( 二 )
这是git详解的第二篇,最近这个加班有点虚,所以文章也写的比较懒了,一到加班不得已,保温杯里泡枸杞啊,不扯了,今天我们来看看git的第二篇 这篇内容主要是git的一些远程命令 远程仓库 git clo ...
- python自动化开发-5
列表生成式 生成器 迭代器 列表生成式 举个例子 列表[0, 1, 2, 3, 4, 5, 6],要求把列表里的每个值加1,如何实现呢? L=[0, 1, 2, 3, 4, 5, 6] a={i+ ...
- Kotlin入门(19)Android的基础布局
线性布局线性布局LinearLayout是最常用的布局,顾名思义,它下面的子视图像是用一根线串了起来,所以其内部视图的排列是有顺序的,要么从上到下垂直排列,要么从左到右水平排列.排列顺序只能指定一维方 ...
- springboot 升级到2.0后 context-path 配置 不起作用,不生效 不管用 皆是因为版本改动导致的在这里记录一下
不知不觉,新的项目已经将springboot升级为2.0版本了.刚开始没有配置server.contextpath,默认的“/”,然后今天放到自己的服务器上,所以就要规范名称. 结果,失败了,无论我 ...
- JavaWeb:Listener和Filter
本文内容: Listener Filter 首发日期:2018-07-15 Listener 监听器Listener负责监听事件的发生.我们能在事件发生后执行一些自定义的操作,这就是监听器的意义. 监 ...
- Mac上用spotlight搜索输入几个字母后闪退
最近使用电脑时遇到的问题: 使用spotlight进行搜索时,只要输入字母超过一定个数(在我的Mac上是3个),spotlight就闪退了. 谷歌搜索得到大部分解决方案是在系统自带词典的偏好设置里取消 ...