视频字幕
临界区是指访问共享资源的代码段,同一时刻只能有一个进程执行。让我们通过银行ATM的例子来理解这个问题。假设有两个进程同时要从同一个账户取款,进程1要取500元,进程2要取300元,账户余额是1000元。如果两个进程同时读取余额,都看到1000元,然后分别计算新余额并写回,就会出现数据不一致的问题。
为了正确实现临界区互斥,必须满足三个基本准则。第一是互斥准则,同一时刻只能有一个进程在临界区执行。第二是空闲让进,当临界区空闲时应该允许进程进入。第三是有限等待,等待进入临界区的时间应该是有限的。我们可以用交通信号灯来类比这三个准则:红绿灯确保互斥,绿灯时空闲让进,合理的信号周期保证有限等待。
Peterson算法是经典的软件互斥实现方法。它使用两个关键变量:flag数组表示各进程的进入意愿,turn变量决定优先权。当进程0想进入临界区时,先设置flag[0]为true表示意愿,然后设置turn为1让对方优先,最后检查对方是否也想进入且拥有优先权。这种谦让机制巧妙地避免了死锁,确保了互斥访问。
硬件实现方法利用处理器提供的原子指令来实现互斥。TestAndSet指令能原子地测试并设置锁变量,返回原来的值。Swap指令则原子地交换两个变量的值。这些操作由硬件保证不可中断。就像用钥匙开锁一样,TestAndSet相当于检查锁是否空闲并立即占用的原子动作,硬件保证这个过程不会被打断,从而确保同一时刻只有一个进程能获得访问权。
信号量是更通用的同步机制,用整型变量表示可用资源数量。P操作申请资源使信号量减1,若资源不足则等待。V操作释放资源使信号量加1,并唤醒等待的进程。就像停车场管理系统,信号量值代表可用车位数,车辆进入时执行P操作减少车位,离开时执行V操作增加车位,确保不会超出停车场容量。