进程间通信
进程间通信的三个问题
信息传递
关键活动不交叉,抢火车票问题
处理顺序问题,进程间相互依赖,生产者消费者问题
条件竞争
当两个进程和线程同时访问共享的数据的时候他的结果依赖于每个进程执行的时间顺序。
临界区
访问共享数据的那一段代码就叫临界区
忙等待互斥方法
下面的几种方法都是要全部全用CPU,所以叫做忙等待
屏蔽中断
在单核CPU中,程序屏蔽系统中断,使得程序在访问临界区的时候不会切到另一个程序中去。
锁变量
用一个全局变量来做标记,先获得的就把它标记一下,但是这样会产生条件竞争。
忙等待(busy waiting),连续测试一个变量直到某个为止。这种方式非常的浪费CPU。只有在等待时间非常短的情况下,才会使用。
自旋锁(spin lock),用于忙等待的。因为忙等待基本上就是一个无限循环然后去测试一个值,i所以像个旋转的锁。
这段代码的疑问是,这个函数多进程的,那么她怎么样去读取这个turn变量。因为每个进程都有自己的地址空间,除非它使用的是共享内存的方式。
Peterson解法
严格轮换,一个进程使用完之后再交给另外一个进程每个进程每次只能执行一次。考虑两个进程同时执行到turn=process的时候,这是没关系的。
TSL硬件指令
先从内存中把lock读到寄存器当中,把内存中lock值设为非零。然后CPU区把内存总线锁住,其他的CPU不能访问内存,直到指令执行结束。
互斥量
互斥量是一种简化版的信号量,只有加/解锁这两种状态。对用户空间线程来说很轻巧。