从本文开始介绍进程间的通信,进程间通信遇到的问题以及方式其实和线程之间通信是一致的,所以进程间通信的所有理论知识都可以用在线程上,接下来的系列文章都会以进程之间的通信为模版进行介绍,本文主要内容:

  • 进程间通信简介(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)的更多相关文章

  1. Operating System-进程/线程内部通信-临界区(Critical Regions)

    上一篇文章讲述了进程之间的竞争条件:多个进程同时进入一个共享区域,导致了数据的不一致,本文主要介绍如何解决这个问题. 一.临界区介绍 解决这个问题就是阻止多个进程同时进入这个共享区域,换句话说,进程之 ...

  2. 理解竞争条件( Race condition)漏洞

    这几天一个叫做"Dirty COW"的linux内核竞争条件漏洞蛮火的,相关公司不但给这个漏洞起了个洋气的名字,还给它设计了logo(见下图),首页,Twitter账号以及网店.恰 ...

  3. Operating System-进程/线程内部通信-管程(Monitor)介绍,实现以及应用

    本文主要内容: 管程(Monitor)介绍 管程实现 管程应用 一.管程(Monitor)介绍 1.1 管程 前一篇文章介绍了信号量以及使用,信号量已经提供了一个方便且高效的进程同步机制,但是信号量有 ...

  4. Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

    本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct ...

  5. Operating System-进程/线程内部通信-信号量和PV操作

    本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能 ...

  6. Golang 入门 : 竞争条件

    笔者在前文<Golang 入门 : 理解并发与并行>和<Golang 入门 : goroutine(协程)>中介绍了 Golang 对并发的原生支持以及 goroutine 的 ...

  7. Fortify Audit Workbench 笔记 Race Condition: Singleton Member Field 竞争条件:单例的成员字段

    Race Condition: Singleton Member Field 竞争条件:单例的成员字段 Abstract Servlet 成员字段可能允许一个用户查看其他用户的数据. Explanat ...

  8. linux c编程:进程控制(二)_竞争条件

    前面介绍了父子进程,如果当多个进程企图对共享数据进行处理.而最后的结果又取决于进程运行的顺序时,就认为发生了竞争关系.通过下面的例子来看下 在这里标准输出被设置为不带缓冲的,于是父子进程每输出一个字符 ...

  9. Java进程&线程(整理)

    Java进程&线程 程序:程序员写的代码,就是代码,不运行好像不会发生什么: 进程:一个进程可以理解为"运行的"一个程序,当我们启动一个java程序后,对应的jvm就会创建 ...

随机推荐

  1. H - Coins

    H - Coins Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Descripti ...

  2. iptables的用例

    iptables书写思路顺序 1.协议 icmp 2.哪个功能和目标:过滤,拒绝 3.数据包流向:外到内 4.哪个链适合:越早越好,INPUT 5.源地址和目标地址 练习1.禁止某些主机或网络访问本机 ...

  3. zookeeper snowflake 实战

    目录 写在前面 1.1.1. 集群节点的命名服务 1.1.2. snowflake 的ID算法改造 SnowFlake算法的优点: SnowFlake算法的缺点: 写在最后 疯狂创客圈 亿级流量 高并 ...

  4. images have the “stationarity” property, which implies that features that are useful in one region are also likely to be useful for other regions.

    Convolutional networks may include local or global pooling layers[clarification needed], which combi ...

  5. Flask 进阶session和上下文管理解析

    session的源码流程 将session放置在redis中 安装 pip install flask-session 使用 import redis from flask import Flask, ...

  6. mysql(root用户密码设置)

    root密码重置 修改root用户的密码: /*登录mysql*/ mysql -uroot -p123 /*切换数据库*/ use mysql /*修改root用户的密码*/ update user ...

  7. sublime运行Python

    1.首先安装Python 我这里安装的是Python的3.7版本. 这里有两种安装方式 第一种: 默认路径安装,勾选添加到path复选框(这种情况,sublime可以直接运行Python了) 第二种: ...

  8. Java多线程系列 JUC线程池06 线程池原理解析(五)

    ScheduledThreadPoolExecutor解析 ScheduledThreadPoolExecutor适用于延时执行,或者周期性执行的任务调度,ScheduledThreadPoolExe ...

  9. 【leetcode刷题笔记】Decode Ways

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  10. python中返回函数

    Python的函数不但可以返回int.str.list.dict等数据类型,还可以返回函数! 例如,定义一个函数 f(),我们让它返回一个函数 g,可以这样写: def f(): print 'cal ...