标签:假设 程序 img 内核 height 也有 方法 共享数据 spin
举个栗子:有两个进程同时对同一内存或磁盘上的文件进行读写,那么假设进程A先读了一段,此时内核调度让进程B进行写,那么下一次A读的就不是原来的数据了。类似这样的情况,两个或多个进程同时读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。
我们要找出某种途径来阻止多个进程同时读写数据,即以某种手段来确保当一个进程在使用共享数据时,其他进程不能做相同的操作,所以我们需要的是互斥(mutual exclusion)。运用抽象的思想:我们把对内存进行访问的程序片段称为临界区(critical region)。所以一个好的方案要满足一下的条件:
1.任何两个进程不能同时进入临界区 2.不能对cpu速度和数量做任何的假设。
3.临界区外进行的进程不能阻塞其他进程 4.不能使进程无限期等待进入临界区。
如下图:
有几种实现互斥的方案,如下:
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
标签:假设 程序 img 内核 height 也有 方法 共享数据 spin
原文地址:https://www.cnblogs.com/manch1n/p/10308651.html