Peterson 算法是用于解决临界区问题的经典算法,那么什么是临界区问题呢?
临界区是一段代码,进程在执行该段代码时可能修改公共变量、更新一个表、写一个文件等。当一个进程在临界区执行时,其他进程不允许在他们的临界区内执行。即没有两个进程可以同时在它们的临界区内执行。临界区问题是设计一个协议以便协作进程。
Peterson 算法适用于两个进程交替执行临界区与剩余区。
Peterson 算法要求两个进程共享以下两个数据项:
int turn;
boolean flag[2];
变量 turn 指示哪个进程能进入临界区,如果 turn == i,则进程 i 可以进入临界区。
数组 flag 指示哪个进程准备进入临界区,如果 flag[i] == true,则进程 i 准备进入临界区。
Peterson 算法的进程 i 的结构
while (true) {
flag[i] = true;
turn = j;
while (flag[j] && turn == j); // 进程 j 在临界区时,无限循环
// 进程 i 的临界区
flag[i] = false;
// 进程 i 的剩余区
}
Peterson 算法中,进程都是“谦让的”,他们都将 turn 设为另一个进程,所以当另一个进程想进临界区时,那么它就能做到。如果两个进程同时希望进入临界区,那么 turn 会在几乎同时被设成 i 和 j ,但是只有一个赋值语句的结果会被保持。turn 的最终值决定了哪个进程能进入临界区。
因为现代计算机指令集包含 load,store 这样的基础的机器语言指令,所以在这样的机器上无法保证 Peterson 算法能正确执行。