Peterson 算法

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 算法能正确执行。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容