文章目录
- 2.3.2 进程互斥的软件实现方法
- 2.3.2.1 单标志法
- 2.3.2.2 双标志先检查法
- 2.3.2.3 双标志后检查法
- 2.3.2.4 Peterson算法
- 2.3.2.5 小结
2.3.2 进程互斥的软件实现方法
知识总览
2.3.2.1 单标志法
单标志法的算法思想是:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予。具体实现过程如下:
对于turn表示当前允许进入临界区的进程号,而只有当前允许进入临界区的进程在访问了临界区之后,才会修改turn的值。也就是说,对于临界区的访问,一定是按p0→p1→p0→p1…这样轮流访问
。
这种必须轮流访问带来的问题是,如果此时允许进入临界区的进程是P0,而P0一直不访问临界区,那么虽然此时临界区空闲,但是并不允许P1访问。因此对于单标志法,其违背了空闲让进
的原则。
2.3.2.2 双标志先检查法
双标志先检查法的算法思想是:设置一个布尔型数组flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如flag[0] = true意味着0号进程p0现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志flag[i]设为true,之后开始访问临界区。
需要注意的是,如果按照152637的顺序执行,p0和p1将会同时访问临界区。因此对于双标志先检查法,其违背了忙则等待
的原则。
之所以造成这种问题,就是因为进入区的检查
和上锁
不是原子操作,在检查完的下一步还没上锁很有可能发生其他事件。
2.3.2.3 双标志后检查法
既然在前一个算法中,原因出在先检查后上锁,那我们调换一下顺序能否改变情况呢?
双标志后检查法的思想是:既然先检查后上锁不行,那我就先上锁,然后在检查。
需要注意的是,如果按照1526的顺序执行,p0和p1将都无法进入临界区。
因此双标志后检查法虽然解决了忙则等待
的问题,但是又违背了空闲让进
和有限等待
原则,因为如果各进程都长期无法访问临界资源会产生饥饿
现象。
2.3.2.4 Peterson算法
在双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,既然这样,那只需要有人礼让即可解决问题。
如果按照123678的顺序,则相当于串行执行,这种方式肯定可以执行。
如果按照162378的顺序,那么进程0表明自己想进入临界区,进程1表明自己想进入临界区,回到2步骤,0进程表示愿意先让给1进程执行,然后在检查1也有意愿进入临界区和自己已经让位的情况下,自己处于等待状态。这时候回到7步骤,1号进程也表示自己愿意先让给0进程执行,然后在检查0也有意愿进入临界区和自己已经让位的情况下,自己也处于等待状态。此时回到步骤3,0号进程发现turn被修改为0了,说明自己可以不用等待让位了,先行一步作为后回到步骤8,进程P1也顺利做完了。
尽管Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待原则。但是相较于前面三种算法,其本身已然是最好。