竞争条件
两个或多个进程读写某些共享数据,而最后的结果取决于进程运行的精确时序,称为竞争条件。凡涉及到资源的共享时就容易发生这样的事情。解决的办法是设立临界区,让进程互斥地访问共享资源。一个好的避免竞争条件的方案,必须满足4个条件:
- 任何两个进程不能同时处于临界区。
- 不应对CPU的速度和数量做任何假设。
- 临界区外运行的进程不得阻塞其它进程。
- 不得让进程无限期等待进入临界区。
忙等待互斥
1.屏蔽中断
进程在进入临界区时屏蔽中断(包括时钟中断),离开临界区时打开中断。这使得CPU无法切换到其它进程。这种方案的缺点在于,将中断屏蔽的进程可能不再将中断打开,导致CPU永远无法切换进程;而且屏蔽的只是该进程对应的CPU的中断,其它没有被屏蔽中断的CPU仍然可以访问共享资源。在多核系统中,这种方法并不适用。
2、锁变量
进程进入临界区之前必须先持有锁,然后将锁占有,其它进程得不到所而在临界区外等待。但这种方案的缺陷在于,进程在判断锁可用到占有锁之间可能会被调度,另一个进程同样发现锁可用并进入临界区。这会导致两个进程同时进入临界区。
3、严格轮换法
进程等待某个变量被置位后才能进入临界区,如下图所示: