同步与互斥(一)

目录

一. 同步与互斥基本概念

多道程序环境下,进程并发执行,为了协调不同进程之间的相互制约关系,引入** 进程同步** 的概念。

如:计算 1+1 × 3,假设系统产生 加法进程 和 乘法进程 ,由于进程异步性,可能发生先计算加法后计算乘法;

因此需要制定一种机制 约束加法进程在乘法进程执行结束后发生。

临界资源

  • 临界资源:同一时刻仅允许一个进程使用的资源。
  • 如:许多物理设备 (打印机,键盘等);被多个进程共享的变量,数据等。

临界区与临界资源:

  • **临界区:**对临界资源的访问,必须互斥进行,每个进程中,访问临界资源的代码段 称为临界区
  • 访问临界资源 的过程:
    • 进入区 :检查是否可以进入临界区。如果可以进入,将设置访问临界区标志,阻止其他进程进入。
    • 临界区 :访问临界资源的那段代码,又称临界段
    • 退出区:清除访问临界区的标志。
    • 剩余区:代码中剩余的部分。

同步

  • 亦称直接制约关系,是指为完成某种任务而建立的≥2个进程,由于需要协调它们的运行次序而等待、传递信息产生的制约关系。源于进程之间的合作
  • 例如:进程A通过单缓冲向进程B提供数据。
    • 缓存区empty:B进程阻塞,A进程送入数据 唤醒进程B。
    • 缓冲区full: A进程被阻塞,进程B取走数 唤醒进程A。

互斥

  • 亦称间接制约关系。一个进程A进入临界区使用临界资源时,另一个进程必须等待。进程A退出临界区后,另一进程才允许访问临界资源。
  • 例如:仅有一台打印机的系统中,两个进程A和B。
    • 若进程A需要打印,但是打印机已经被分配给进程B,则进程A阻塞。
    • 进程B释放打印机后,唤醒进程A,从阻塞态变为就绪态。

实现临界区互斥遵循的准则:

为了禁止两个进程同时进入临界区。

  • 空闲让进:临界区空闲,让一个请求进程进入。
  • 忙则等待:已有进程进入临界区,其他请求进程必须等待。
  • 有限等待:请求的进程,保证在有限时间进入临界区,防止进程无限等待。
  • 让权等待(原则上,非必须)进程无法进入临界区,立即释放处理机,防止进程忙等待。

二. 临界区互斥实现方法

2.1 软件实现

进入区 设置并检查访问临界区标志,已有进程进入临界区,则通过在进入区循环检查 进行等待,进程离开后在退出区修改标记

算法一:单标志法

设置一个公用整形变量 turn指示允许进入临界区的进程标号 。turn=N,表示允许进程 P(N) 进入临界区;进程退出临界区时,转移临界区使用权,如进程 P(i) 退出临界区,将 turn 置为 j。(i ≠ j)
特点:

  • 每次只允许一个进程进入临界区。
  • 两个进程必须交替进入 临界区,若只有两个进程,进程 P(B) 不再进入临界区,则进程 P(A) 从临界区退出后,由于修改后 turn = B,(此时临界区空闲) 进程 P(A) 将不能再次进入临界区。【违背了"空闲让进"原则

算法二:双标志先检查法

设置布尔型数组 flag[2] ,标记各个进程想进入临界区的意愿,flag[i] = true 表示进程 P(i) 想要进入临界区【i=0 或 1】

  • P(i) 进入临界区之前,先检查对方 是否想进入临界区;
    • 若 flag[ 1-i ] = true,则 P(i) 进程等待,否则设置 flag[ i ] = true,然后 进入临界区。
  • P(i) 退出临界区时,设置 flag[ i ] = false
  • 优点:不需要交替进入,可以连续使用。
  • 缺点:可能 存在 P(0) 和 P(1) 同时进入临界区
    • 上图中,按照 ①⑤②⑥③⑦ 执行的时候【即检查对方标记后和设置自己的标记前 可能发生进程切换】,出现两个进程都通过检查的情况,同时进入临界区。(违背"忙则等待"原则)。原因在于 检查和设置操作 不是一气呵成的。

算法三:双标志后检查法

基于算法二的机制,采用先设置后检查法,以避免算法二导致量两个进程同时进入临界区的问题。

  • P(i) 进入临界区之前,先设置 flag[ i ] = true, 再检查对方 是否想进入临界区;
    • 若 flag[ 1-i ] = true,则 P(i) 进程等待,否则直接进入临界区。
    • P(i) 退出临界区时,设置 flag[ i ] = false
  • 优点:避免了两个进程同时进入临界区的问题。
  • 缺点:上图中,按照 ①⑤②⑥... 执行的时候,出现两个进程 都想要进入临界区 情况,结果都无法进入 临界区。(违背"空闲让进"原则)。

各个进程长期无法访问临界区导致"饥饿"现象。(违背"有限等待"原则

算法四:Peterson算法

结合算法一和算法三思想,**利用 flag[ ] 解决互斥访问,利用"turn"**解决"饥饿"问题。

  • 进程进入临界区之前 ,先设置 flag 标志 ,再设置** turn 标志**【turn 标志设置为对方的,表示对方优先进入。】;
  • 接着 同时检查对方的 flag 和 turn 标志,以保证同时要求进入时候,只允许一个进入。

若检查时候出现冲突:都想要进入,则最后设置 turn 标志【发出"谦让"】的进程等待。最终 turn 指示进入临界区的进程标号。


  • 优点:P[j] 退出后,如果 P[ i ] 不想进入临界区,则设置 flag[ i ] = false(P[ i ] 不会陷入 while 循环),遵循了"空闲等待","忙则等待","有限等待"。
  • 缺点:未遵循"让权等待"原则,依然不够好。

2.2 硬件实现

  • 计算机提供特殊硬件指令,允许对一个字的内容进行检测和修正,或交换两个字的内容。

中断屏蔽方法

硬件指令方法------TestAndSet 指令

硬件指令方法------Swap 指令

** 总结 **

三. 互斥锁


相关推荐
郑州光合科技余经理5 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php
西岸行者5 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意5 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码5 天前
嵌入式学习路线
学习
毛小茛5 天前
计算机系统概论——校验码
学习
babe小鑫5 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms5 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下5 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。5 天前
2026.2.25监控学习
学习
im_AMBER5 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode