【操作系统-23】进程互斥实现-单标志法
·
进程互斥的软件实现 - 单标志法
定义:
单标志法是一种用于解决两个进程间互斥访问共享资源的软件实现方式。它通过使用一个标志变量来确保同一时刻只有一个进程可以进入临界区,从而实现互斥。该方法的基本思想是使用一个共享的标志(或变量),来表示一个进程是否正在执行临界区代码,其他进程通过检查该标志来判断自己是否可以进入临界区。
原理:
在单标志法中,进程间通过共享一个变量(通常是标志位)来相互协调。当一个进程想要进入临界区时,它检查标志变量。如果标志表示没有其他进程正在执行临界区代码,它就可以进入临界区;如果标志表示另一个进程正在执行临界区代码,它就会等待或延迟进入临界区。通过这种方式,单标志法确保在任意时刻只有一个进程能够进入临界区,从而实现互斥。
单标志法的基本步骤
1、进程 A 尝试进入临界区:
- 进程 A 在进入临界区之前检查标志变量(如
flag)。如果flag的值为 0,表示没有其他进程在执行临界区代码,进程 A 可以进入临界区。 - 如果
flag的值为 1,表示另一个进程正在执行临界区代码,进程 A 会等待或延迟进入临界区。
2、进程 B 尝试进入临界区:
- 同样地,进程 B 在进入临界区之前也会检查标志变量。如果
flag的值为 0,进程 B 可以进入临界区;如果flag的值为 1,进程 B 会等待。
3、进入临界区:
- 只有一个进程可以在同一时刻进入临界区,因此如果一个进程进入了临界区,它会设置标志变量为 1,表示临界区正在被占用。
4、离开临界区:
- 当一个进程执行完临界区的任务后,它会将标志变量恢复为 0,表示临界区可以被其他进程访问。
单标志法的示例代码(伪代码)
// 标志变量,用于表示是否有进程正在执行临界区
flag = 0; // 0 表示临界区空闲,1 表示临界区正在被占用
// 进程 A
Process_A() {
while (flag == 1) {
// 等待,直到临界区空闲
}
flag = 1; // 设置标志,表示进程 A 正在进入临界区
// 执行临界区代码
flag = 0; // 离开临界区,重置标志
}
// 进程 B
Process_B() {
while (flag == 1) {
// 等待,直到临界区空闲
}
flag = 1; // 设置标志,表示进程 B 正在进入临界区
// 执行临界区代码
flag = 0; // 离开临界区,重置标志
}
单标志法的关键点:
- 标志变量:flag 是用来指示临界区是否正在被占用的变量。只有当 flag == 0 时,进程才能进入临界区。
- 检查和修改标志:每个进程在进入临界区之前都需要检查 flag 变量的值,并在进入临界区后将其设置为 1,退出时将其重置为 0。
- 等待机制:如果某个进程发现 flag == 1,则它需要等待,即无法进入临界区,直到 flag 变为 0。
单标志法的优缺点:
优点:
- 简单易懂:单标志法实现简单,逻辑清晰,容易理解。
- 低开销:与一些较复杂的互斥方法相比,单标志法的开销较小,尤其在涉及少数进程时,效率较高。
缺点:
- 忙等(Busy Waiting):进程在等待进入临界区时,会不断检查标志变量,消耗 CPU 时间,这被称为忙等(或自旋等待)。这种方法在高负载或进程较多时效率较低。
- 只能解决两个进程的互斥:单标志法通常用于两个进程之间的互斥问题。如果有多个进程同时竞争进入临界区,单标志法不再适用。
- 缺乏公平性:如果一个进程一直处于忙等状态,它可能永远无法获得进入临界区的机会,从而导致进程饥饿(starvation)。
- 可能导致竞态条件:如果标志位的更新操作不是原子性的(即不是一个不可分割的操作),可能会导致竞态条件,从而引发错误或不一致的结果。
适用场景
单标志法适用于以下情况:
- 只有两个进程需要共享访问某些资源。
- 临界区的执行时间较短,进程等待时间不长。
- 系统中没有非常严格的性能要求。
总结
单标志法是进程互斥的一种简单软件实现方法,主要通过一个标志变量来控制进程对共享资源的访问。然而,由于它存在忙等、缺乏公平性和只能适用于两个进程等问题,因此在更复杂或更高效的场景中需要使用更高级的互斥机制,如互斥锁、信号量等。
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)