Operating System-进程/线程内部通信-竞争条件(Race Conditions)
从本文开始介绍进程间的通信,进程间通信遇到的问题以及方式其实和线程之间通信是一致的,所以进程间通信的所有理论知识都可以用在线程上,接下来的系列文章都会以进程之间的通信为模版进行介绍,本文主要内容:
- 进程间通信简介(IPC)
- 进程间的竞争条件(Race Conditions)
一、进程间通信简介
InterProcess Communication(IPC)。进程间通信主要从三个方面说:
- 一个进程如何把信息传递个另外一个进程
- 确保多个进程不会交叉,比如两个进程同时去订最后一张火车票,该怎么处理
- 进程的执行顺序,比如A进程产生数据,B进程打印A产生的数据,那么A进程得先运行,B才能运行
二、进程间的竞争条件(Race Conditions)
如下图所示。

Spooler Directory是一个是一个打印机的缓存迟,当有进程想打印文件时,就将文件名字写入这个缓存池子。有一个专门的打印机定时读取这个缓存池进行,如果有文件则打印,
Out和In是两个共用变量用于标识下一个用于打印的文件的位置和下一个可以写入文件的位置,因为只有一个打印机在读取Spooler Directory,所以Out这个值永远都不会有人来竞争,接下来主要谈的是In这个变量。
- 因为有多个进程在往Spooler Directory里面写文件,假设ProcessA写的时候,In值是6,ProcessA读到IN之后先保存在了自己的本地变量中,这个时候CPU认为PRocessA已经运行了有一段时间,打算把CPU让给刚刚启动的Process B。
- 这个时候因为 Process A只是刚刚读取到了In,还没有写入文件,所以In的值还是6,所以Process B得到的in也是6,然后Process B把文件写入了第6个位置,且把In的值++后变为7
- 接下来CPU又一次切换到了Process A,之前就说了,CPU切换后,被恢复的进程(线程)会从原来的状态开始继续运行,那么对于Process A来说,In还是6,Process A也把自己的文件写入到了第6个位置,且把In的值++后变为7。
问题来了:Process B的文件被Process A再第二次运行的时候覆盖了。Process B的文件不会被打印。
上述的问题就叫进程之间的竞争条件:多个进程在读写共享数据,最终的结果取决于进程的运行时间。
上面的问题很明显,把进程换成线程也会有一样的问题产生。
Operating System-进程/线程内部通信-竞争条件(Race Conditions)的更多相关文章
- Operating System-进程/线程内部通信-临界区(Critical Regions)
上一篇文章讲述了进程之间的竞争条件:多个进程同时进入一个共享区域,导致了数据的不一致,本文主要介绍如何解决这个问题. 一.临界区介绍 解决这个问题就是阻止多个进程同时进入这个共享区域,换句话说,进程之 ...
- 理解竞争条件( Race condition)漏洞
这几天一个叫做"Dirty COW"的linux内核竞争条件漏洞蛮火的,相关公司不但给这个漏洞起了个洋气的名字,还给它设计了logo(见下图),首页,Twitter账号以及网店.恰 ...
- Operating System-进程/线程内部通信-管程(Monitor)介绍,实现以及应用
本文主要内容: 管程(Monitor)介绍 管程实现 管程应用 一.管程(Monitor)介绍 1.1 管程 前一篇文章介绍了信号量以及使用,信号量已经提供了一个方便且高效的进程同步机制,但是信号量有 ...
- Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)
本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...
- Operating System-进程/线程内部通信-信号量和PV操作
本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能 ...
- Golang 入门 : 竞争条件
笔者在前文<Golang 入门 : 理解并发与并行>和<Golang 入门 : goroutine(协程)>中介绍了 Golang 对并发的原生支持以及 goroutine 的 ...
- Fortify Audit Workbench 笔记 Race Condition: Singleton Member Field 竞争条件:单例的成员字段
Race Condition: Singleton Member Field 竞争条件:单例的成员字段 Abstract Servlet 成员字段可能允许一个用户查看其他用户的数据. Explanat ...
- linux c编程:进程控制(二)_竞争条件
前面介绍了父子进程,如果当多个进程企图对共享数据进行处理.而最后的结果又取决于进程运行的顺序时,就认为发生了竞争关系.通过下面的例子来看下 在这里标准输出被设置为不带缓冲的,于是父子进程每输出一个字符 ...
- Java进程&线程(整理)
Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...
随机推荐
- 洛谷 2216 [HAOI2007]理想的正方形
题目戳这里 一句话题意 给你一个a×b的矩形,求一个n×n的子矩阵,矩阵里面的最大值和最小值之差最小. Solution 这个题目许多大佬都是单调队列,但是我不是很会,只好用了比较傻逼的方法: 首先我 ...
- [luogu3413]萌数
[luogu3413]萌数 luogu 考虑数位dp 怎么判断一个数是不是萌数? 只要知道其中某一位和它的前一位相等或者和前一位的前一位相等,那么它就是一个萌数 什么样的数不是萌数? 对于它的每一位都 ...
- 关于中国省市的一份js代码
下面是一份关于中国省市的js代码,搜藏起来,非常有用. var arrCity = [ { name:"请选择", sub:[{name:"请选择"}], ty ...
- Django开发模式会加载两次settings文件导致RotatingFileHandlerError
当使用RotatingFileHandler作为django的日志处理器的时候,会报: Traceback (most recent call last): File "C:\Python2 ...
- python selenium cookie 登录
概要: 1.正常登录,使用selenium获取cookie: 2.保存cookie: 3.使用cookie登录. 4.python--2.7,selenium--3.4.1 步骤1 正常登录,使用se ...
- Java中byte转换int时与0xff进行与运算的原因
http://w.baike.com/LGAdcWgJBBQxRAHUf.html 转帖 java中byte转换int时为何与0xff进行与运算 在剖析该问题前请看如下代码 public static ...
- [笔记]几个简单有用的PHP函数
收藏几个简单的PHP函数,分别用于对象到数组转换.json到php数组转换功能.curl模拟POST以及根据链接获取内容.不直接使用json_decode()的原因是php json_decode() ...
- IOS 判断当前UIViewController 是否正在显示
我通常的做法是根据视图控制器的生命周期来判断,其是否是正在使用的状态. 举例 设一个实例布尔变量isVisible 在 -ViewWillAppear 里面 isVisible = YES ; 在 ...
- redis于spring整合之RedisTemplate
原文地址: http://www.jianshu.com/p/7bf5dc61ca06
- 每天一个Linux命令(7)pwd命令
pwd命令以绝对路径的方式显示用户当前工作目录.命令将当前目录的全路径名称(从根目录)写入标准输出.全部目录使用/分隔.第一个/表示根目录,最后一个目录是当前目录. (1)用法介绍: pwd[ ...