2.3 进程间通信
Posted manch1n
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2.3 进程间通信相关的知识,希望对你有一定的参考价值。
2.3.1 竞争条件
举个栗子:有两个进程同时对同一内存或磁盘上的文件进行读写,那么假设进程A先读了一段,此时内核调度让进程B进行写,那么下一次A读的就不是原来的数据了。类似这样的情况,两个或多个进程同时读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。
2.3.2 临界区
我们要找出某种途径来阻止多个进程同时读写数据,即以某种手段来确保当一个进程在使用共享数据时,其他进程不能做相同的操作,所以我们需要的是互斥(mutual exclusion)。运用抽象的思想:我们把对内存进行访问的程序片段称为临界区(critical region)。所以一个好的方案要满足一下的条件:
1.任何两个进程不能同时进入临界区 2.不能对cpu速度和数量做任何的假设。
3.临界区外进行的进程不能阻塞其他进程 4.不能使进程无限期等待进入临界区。
如下图:
2.3.3 忙等待的互斥
有几种实现互斥的方案,如下:
1.屏蔽中断
当进程进入临界区时,让内核不进行上下文的切换,让cpu单独为这个进程服务,当然这是最简单的想法也是最不现实的。
2.锁(lock)变量
进程有一个共享锁变量,初始值为0,表示进程可以进入临界区,然后修改值为1,其他进程想要进入临界区时先访问这个锁变量,如果值为1则切换其他线程。虽然比上一个方法解决了运行多个进程的功能,然而也有缺陷:假设进程A此刻读锁变量为0,不巧的是来不及修改锁变量,切换到另一个进程B,进程B也发现了锁变量为0,它即认为可以进入临界区。此时就会导致两个进程同时读写。
3.严格轮换法
这个方法只适用于两个进程。假设有一个变量turn(称为自旋锁spin lock),它的值用来记录何时轮到某个进程执行。当turn=0时A进程进入临界区,=1时B进程进入临界区。虽然这个方法避免了两个进程同时进入临界区,可是当A进程需要很多的cpu时间,那么这就会一直阻塞B进程的执行,所以违反了规则3:临界区外的运行的进程不得阻塞其他进程。如下图:
4.Peterson 解法
避免了严格轮换,如下图:
//TODO
以上是关于2.3 进程间通信的主要内容,如果未能解决你的问题,请参考以下文章
[架构之路-60]:目标系统 - 平台软件 - 基础中间件 - Linux进程间通信的主要方式