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 解法

  避免了严格轮换,如下图:

                                                                                                       然而我觉得这个方法还是会导致死锁,因为当A进程感兴趣之后,切换到B进程也感兴趣,此时两个进程都在感兴趣因而一直被互相阻塞。

  5.TSL指令   

  在现在多处理机的计算机上,硬件支持互斥成为可能,关键的汇编代码指令是:TSL RX,LOCK。TSL(test and set lock):将一个内存字lock读到寄存器RX中,然后在该内存地址上存一个非零值,读与写该字为原子(atomic)性。如下:

  意思就是,当有两个进程同时读时,由于进程切换,必然有先后的顺序,即使时间很短。当一个进程先得到该锁后后面的进程都只能得到该锁是1。

  与TSL指令相同功能的是XCHG:原子性地交换两个位置的内容。

2.3.4 睡眠与唤醒

  生产者-消费者问题

  两个进程间通信原语:sleep() :使进程睡眠,阻塞直到其他进程发送wakeup信号。wakeup():发送信号给进程继续工作。如下图:

  然而这将导致死锁。

2.3.5 信号量

  用一个整形变量来累计唤醒次数,称为信号量(semaphore),当0时表示睡眠,当被唤醒时其值加一。Dijkstra建议将检查数值,修改变量,以及可能发生的操作均作为单一的一个原子操作(atomic oepration),这就避免了很多问题。在多处理器的机器上,通常与TSL指令配合避免多个进程同时访问锁变量。解决生产者-消费者模型如下图:

2.3.6 互斥量

  互斥量(mutex)(我认为这个英文时mutual exclusion拼成的2333)是信号量的一个简化版本,它的值只有两种状态,锁或未锁分别用1,0表示。与TSL指令配合很简单的可以写下来为:

  1.快速用户互斥量futex

  2.pthread 中的互斥量

  除了互斥量外,还有一种同步机制:条件变量:允许或阻塞对临界区的访问。有关函数如下:

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