【用孔融让梨的故事理解Peterson算法】

用孔融让梨的故事理解Peterson算法

Peterson算法

Peterson算法³是一个实现互斥锁的并发程序设计算法,可以控制两个进程访问一个共享的单用户资源而不发生访问冲突。这个算法由Gary L. Peterson于1981年提出⁴。

Peterson算法是基于双线程互斥访问的LockOne与LockTwo算法而来。LockOne算法使用一个flag布尔数组,LockTwo使用一个turn的整型量,都实现了互斥,但是都存在死锁的可能。Peterson算法把这两种算法结合起来,完美地用软件实现了双线程互斥问题。

Peterson算法使用两个控制变量flag与turn。其中flag[n]的值为真,表示ID号为n的进程希望进入该临界区。变量turn保存有权访问共享资源的进程的ID号。

下面是Peterson算法的伪代码:

# flag[] is boolean array; and turn is an integer
flag[0] = false
flag[1] = false
int turn

P0:
    flag[0] = true # P0想进入临界区
    turn = 1 # P0把进入临界区的机会让给P1
    while (flag[1] == true && turn == 1) # 如果P1也想进入临界区,并且轮到P1
        # busy wait # P0等待
    # critical section # P0进入临界区
    ...
    # end of critical section
    flag[0] = false # P0离开临界区

P1:
    flag[1] = true # P1想进入临界区
    turn = 0 # P1把进入临界区的机会让给P0
    while (flag[0] == true && turn == 0) # 如果P0也想进入临界区,并且轮到P0
        # busy wait # P1等待
    # critical section # P1进入临界区
    ...
    # end of critical section
    flag[1] = false # P1离开临界区

该算法满足解决临界区问题的三个必须标准:互斥访问,空闲让进,有限等待⁵。

用孔融让梨的故事理解Peterson算法

我们可以用孔融让梨的故事来类比Peterson算法,帮助我们更好地理解这个算法的思想。

假设孔融和他的哥哥们都想吃一个大梨,这个大梨就是共享的单用户资源,也就是临界区。孔融和他的哥哥们都有一个flag,表示他们是否想吃这个大梨。还有一个turn,表示轮到谁吃这个大梨。

当孔融想吃这个大梨时,他把自己的flag设为真,表示他想进入临界区。然后,他把turn设为他哥哥的ID号,表示他把吃大梨的机会让给他哥哥。如果他哥哥也想吃这个大梨,并且turn也是他哥哥的ID号,那么孔融就等待,直到他哥哥不想吃或者轮到自己吃。如果他哥哥不想吃这个大梨,或者轮到自己吃,那么孔融就可以进入临界区,吃这个大梨。吃完后,孔融把自己的flag设为假,表示他离开了临界区。

同样地,当孔融的哥哥想吃这个大梨时,他也把自己的flag设为真,表示他想进入临界区。然后,他把turn设为孔融的ID号,表示他把吃大梨的机会让给孔融。如果孔融也想吃这个大梨,并且turn也是孔融的ID号,那么孔融的哥哥就等待,直到孔融不想吃或者轮到自己吃。如果孔融不想吃这个大梨,或者轮到自己吃,那么孔融的哥哥就可以进入临界区,吃这个大梨。吃完后,孔融的哥哥把自己的flag设为假,表示他离开了临界区。

通过这样的方式,孔融和他的哥哥们可以实现互斥地访问这个大梨,并且避免了死锁和饿死的情况。只要有一个人想吃这个大梨,并且没有人跟他争抢,那么他就可以进入临界区;如果有两个人都想吃这个大梨,并且互相谦让一次后,那么就按照turn的值来决定谁先进入临界区。

在这里插入图片描述

参考

如何更好理解Peterson算法? - 知乎 - 知乎专栏.
Peterson算法的原理和实现 - 维基百科,自由的百科全书.
Peterson算法的应用和优缺点 - 第六章:进程同步【临界区,Peterson算法、互斥锁、信号量、经典同步问题、管程】_peterson算法和互斥锁_马小超i的博客-CSDN博客.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值