文章目录
进程互斥的软件实现方法
单标志法
算法思想:一个进程在访问完临界区后会把使用临界区的权限转交给另一个进程,也就是说每个进程进入临界区的权限只能被另一个进程赋予
【分析】
turn 的初值为 0,即刚开始只允许 0 号进程进入临界区
若 P1 先上处理机运行,则会一直卡在 ⑤,直到 P1 的时间片用完,发生调度,切换 P0 上处理机运行
代码 ① 不会卡住 P0,P0 可以正常访问临界区,在 P0 访问临界区期间即使切换回 P1,P1 依然会卡在 ⑤
只有 P0 在退出区将 turn 改为 1 后,P1 才能进入临界区
结合以上例子可以看出,该算法可以实现“同一时刻最多只允许一个进程访问临界区”
缺点:违背“空闲让进”原则,各进程只能轮流访问,轮流到不需要访问临界区的进程时,即使临界区空闲,也不允许其他进程访问
双标志先检查
算法思想:设置一个布尔型数组 flag[ ]
,数组中各个元素用来标记各进程想进入临界区的意愿(比如 flag[0]=true
意味着 0 号进程 P0 现在想要进入临界区),每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志 flag[i]
设为 true
,之后开始访问临界区
缺点:违反“忙则等待”原则,比如上例中如果按照 ①⑤②⑥③⑦… 的顺序执行, P0 和 P1 将会同时进入临界区
原因在于,进入区的 “检查” 和 “上锁” 两个处理不是一气呵成的,“检查后上锁前” 可能发生进程切换
双标志后检查
算法思想:双标志先检查法的改版,前一个算法的问题是先“检查”后“上锁”,但是这两个操作又无法一气呵成,因此导致了两个进程同时进入临界区的问题,因此人们又想到**先“上锁”后“检查”**的方法,来避免上述问题
缺点:双标志后检查法虽然解决了“忙则等待”的问题,但是又违背了“空闲让进”和“有限等待“原则,会因各进程都长期无法访问临界资源而产生“饥饿”现象,比如上例中若按照 ①⑤②⑥… 的顺序执行,P0 和 P1 将都无法进入临界区
Peterson算法
算法思想:结合双标志法、单标志法的思想,为了防止两个进程为进入临界区而无限期等待,又设置了变量 turn
,每个进程在先设置自己的 flag[ ]
标志后再设置 turn
标志,这时再同时检测另一个进程状态标志和允许进入标志,以便保证两个进程同时要求进入临界区时,只允许一个进程进入临界区
缺点:Peterson 算法用软件方法解决了进程互斥问题,遵循了空闲让进、忙则等待、有限等待 三个原则,但是依然未遵循让权等待的原则,但是相较于前面三个算法是最好的
进程互斥的硬件实现方法
中断屏蔽方法
利用“开/关中断指令”实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
优点:简单高效
缺点:不适用于多处理机(因为关中断指令只对执行关中断指令的那个处理机有用);只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)
TestAndSet / TestAndSetLock(TS指令/TSL指令)
TestAndSet指令:这条指令是原子操作,即执行该代码时不允许被中断,其功能是读出指定标志后把该标志设置为真
以下是用 C 语言描述的 TSL 指令的逻辑
【分析】
若刚开始 lock 是 false,则 TSL 返回的 old 值为 false,while 循环条件不满足,直接跳过循环,进入临界区
若刚开始 lock 是 true,则执行 TLS 后 old 返回的值为 true,while 循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行“解锁”
相比软件实现方法,TSL指令把“上锁”和“检查”操作用硬件的方式变成了一气呵成的原子操作
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行TSL指令,从而导致“忙等”
Swap指令(XCHG指令)
Swap指令:该指令的功能是交换两个字(字节)的内容
以下是用 C 语言描述的 Swap 指令的逻辑
【分析】
逻辑上来看 Swap 和 TSL 并无太大区别,都是先记录下此时临界区是否已经被上锁(记录在 old 变量上),再将上锁标记 lock 设置为 true,最后检查 old,如果 old 为 false 则说明之前没有别的进程对临界区上锁,则可跳出循环,进入临界区
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足“让权等待”原则,暂时无法进入临界区的进程会占用CPU并循环执行Swap指令,从而导致“忙等”
【计算机操作系统】 专栏的文章 均有参考 《王道计算机考研 操作系统》 课程视频