王道操作系统考研笔记——2.3.2 进程互斥的软件实现方法

2.3.2 进程互斥的软件实现方法

知识总览

image-20220208171128877

2.3.2.1 单标志法

单标志法的算法思想是:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。具体实现过程如下:

image-20220216175101867

对于turn表示当前允许进入临界区的进程号,而只有当前允许进入临界区的进程在访问了临界区之后,才会修改turn的值。也就是说,对于临界区的访问,一定是按p0→p1→p0→p1…这样轮流访问

这种必须轮流访问带来的问题是,如果此时允许进入临界区的进程是P0,而P0一直不访问临界区,那么虽然此时临界区空闲,但是并不允许P1访问。因此对于单标志法,其违背了空闲让进的原则。

2.3.2.2 双标志先检查法

双标志先检查法的算法思想是:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如flag[0] = true意味着0号进程p0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。

image-20220216180541941

需要注意的是,如果按照152637的顺序执行,p0和p1将会同时访问临界区。因此对于双标志先检查法,其违背了忙则等待的原则。

之所以造成这种问题,就是因为进入区的检查上锁不是原子操作,在检查完的下一步还没上锁很有可能发生其他事件。

2.3.2.3 双标志后检查法

既然在前一个算法中,原因出在先检查后上锁,那我们调换一下顺序能否改变情况呢?

双标志后检查法的思想是:既然先检查后上锁不行,那我就先上锁,然后在检查。

image-20220216183243339

需要注意的是,如果按照1526的顺序执行,p0和p1将都无法进入临界区。

因此双标志后检查法虽然解决了忙则等待的问题,但是又违背了空闲让进有限等待原则,因为如果各进程都长期无法访问临界资源会产生饥饿现象。

2.3.2.4 Peterson算法

在双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,既然这样,那只需要有人礼让即可解决问题。

image-20220216184039531

如果按照123678的顺序,则相当于串行执行,这种方式肯定可以执行。

如果按照162378的顺序,那么进程0表明自己想进入临界区,进程1表明自己想进入临界区,回到2步骤,0进程表示愿意先让给1进程执行,然后在检查1也有意愿进入临界区和自己已经让位的情况下,自己处于等待状态。这时候回到7步骤,1号进程也表示自己愿意先让给0进程执行,然后在检查0也有意愿进入临界区和自己已经让位的情况下,自己也处于等待状态。此时回到步骤3,0号进程发现turn被修改为0了,说明自己可以不用等待让位了,先行一步作为后回到步骤8,进程P1也顺利做完了。

尽管Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待原则。但是相较于前面三种算法,其本身已然是最好。

2.3.2.5 小结

image-20220216185223288

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奶茶不喝奶茶

如果知识有用请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值