码迷,mamicode.com
首页 > 系统相关 > 详细

2.3 进程间通信

时间:2019-01-23 14:32:34      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:假设   程序   img   内核   height   也有   方法   共享数据   spin   

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 进程间通信

标签:假设   程序   img   内核   height   也有   方法   共享数据   spin   

原文地址:https://www.cnblogs.com/manch1n/p/10308651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!