欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

进程互斥的软件实现、硬件实现和互斥锁-1。

最编程 2024-04-03 09:00:04
...

1.单标志法

1.算法思想:

两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。
也就是说每个进程进入临界区的权限只能被另一个进程赋予。

2.例子

在这里插入图片描述
在这里插入图片描述
因此,该算法可以实现“同一时刻最多只允许一个进程访问临界区”。

3.主要问题

只能按P0 ⟶ \longrightarrow P1 ⟶ \longrightarrow P0 ⟶ \longrightarrow P1 ⟶ \longrightarrow …………这样轮流访问。
这种必须“轮流访问”带来的问题是,如果此时允许进入临界区的进程是P0,
而P0一直不访问临界区,那么虽然此时临界区空闲,但是并不允许P1访问。

因此,单标志法存在的主要问题是:违背“空闲让进”原则。

2.双标志先检查

1.算法思想:

设置一个布尔型数组flag],数组中各个元素用来标记各进程想进入临界区的意愿
比如“ f l a g [ 0 ] = t u r e flag[0] =ture flag[0]=ture”意味着0号进程P0现在想要进入临界区。
每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,
如果没有,则把自身对应的标志 f l a g [ l i ] flag[li] flag[li]设为 t r u e true true,之后开始访问临界区。

2.例子

在这里插入图片描述

3.主要问题

若按照①⑤②⑥③⑦…的顺序执行,P0和P1将会同时访问临界区。
因此,双标志先检查法的主要问题是:违反“忙则等待”原则。
原因在于,进入区的“检查”和“上锁”两个处理不是一气呵成的。
“检查”后,“上锁”前可能发生进程切换。

3.双标志后检查

1.算法思想:

双标志先检查法的改版。
前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,
因此导致了两个进程同时进入临界区的问题。
因此,人们又想到先“上锁”后“检查”的方法,来避免上述问题。

2.例子

在这里插入图片描述

3.主要问题

若按照①⑤②⑥…的顺序执行,P0和P1将都无法进入临界区
因此,双标志后检查法虽然解决了“忙则等待”的问题,
但是又违背了“空闲让进”和“有限等待”原则,
会因各进程都长期无法访问临界资源而产生“饥饿”现象。

4.Peterson算法

1.算法思想:

结合双标志法、单标志法的思想。
如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨”(谦让)。
做一个有礼貌的进程。

2.例子

在这里插入图片描述

3.主要问题

Peterson算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待三个原则,但是依然未遵循让权等待的原则。

推荐阅读