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的文件不会被打印。
上述的问题就叫进程之间的竞争条件:多个进程在读写共享数据,最终的结果取决于进程的运行时间。
上面的问题很明显,把进程换成线程也会有一样的问题产生。
转载于:https://www.cnblogs.com/Brake/p/Operating_System_Interprocess_Communication_Race_Conditions.html