什么是同步?什么是互斥?
互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源。
互斥与同步解决方法之一:(软件方法)
软件解决方法有很多种,比较有代表性的软件方法有荷兰数学家Dekker提出的
Dekker算法和科学家G.L.Peterson提出的Peterson算法。
初步设想:
为了控制两个进程互斥进入临界区,可以让两个进程轮流进入临界区。指定进程号。
var turn 0..1
P0 P1
.... ....
while turn <> 0 do {nothing} while turn <> 1 do
{nothing} {nothing}
<临界区>; <临界区>;
turn:=1 ; turn:=0 ;
..... .....
存在问题分析:
问题1:“忙等”现象,会消耗机器的很多资源。在进程时间片内会循环执行while语句。
问题2: 进程严格交替进入临界区。如果进程需要多次使用临界区,那么,使用临界区频率低的进程严重制约着使用临界区频率高的进程的执行程度。毕竟,TURN没有标示临界区是否被占用。
问题3: 任何进程在临界区内或外失败,其他进程将可能因为等待使用临界区,而无法向前进。
第一次改进:
分析:初步设想的主要问题在于没有针对临界区的标志位,而是严格的进行进程交替执行。可以为临界区设置一个状态标志,标明临界区是否可用。当临界区空闲时,任何一个进程进入。但此时必须修改临界区标志为“被占用”,别的进程就不能进入临界区。当临界区使用完毕,必须修改该标志为“空闲”.这样就不再使诸进程严格交替使用临界区,而且,如果某进程在临界区外失败,也不会影响其他进程。其算法描述如下: