二、进程管理(三)同步与互斥

news2025/7/19 5:06:21

目录

3.1 临界资源与临界区

3.2 同步与互斥概念

3.3 实现临界区互斥的基本方法

3.3.1 软件实现方法

3.3.1.1 单标志法

3.3.1.2 双标志先检查法

3.3.1.3 双标志后检查法

3.3.1.4 Peterson算法

3.3.2 硬件实现方法

3.3.2.1 中断屏蔽方法

3.3.2.2 硬件指令方法之TestAndSet指令

3.3.2.3 硬件指令方法之Swap指令

3.4信号量

3.4.1整型信号量

3.4.2记录型信号量

3.4.3信号量实现同步

3.4.4信号量实现互斥

3.4.5信号量实现前驱关系 

3.5互斥锁

3.6管程

3.6.1管程的概念

3.6.2条件变量 


3.1 临界资源与临界区

临界资源是一段时间仅允许一个进程使用的资源。

包括,许多物理设备如打印机、变量数据(公用队列)、共享缓存区。

注:可以共享的资源分为临界资源(非并发)和同时访问资源(并发)。

此外还有私有数据(非共享)这种资源只能供一个进程使用。

还有共享程序段(并行)可能同时被多个进程使用,必须是可重入代码,也称纯代码,允许多个进程同时访问。

 将临界资源的访问过程分以下4个部分:

  1. 进入区。检查能否进入临界区,如果能够进入则设置标志阻止其他进程进入临界区。
  2. 临界区临界段)。进程中访问临界资源的那段代码。
  3. 退出区。将正在访问的临界区标志清除。
  4. 剩余区。代码中的其余部分。

3.2 同步与互斥概念

同步的概念是与异步对立的,异步性是指,各并发执行的进程以各自独立的、不可预知的速度向前推进,即 “具有多个相异” 的 “步骤”  。

同步也称直接制约关系,是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。进程间的直接制约关系源于它们之间的相互合作。

互斥也称间接制约关系,当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。

进程同步的解决的就是进程由于异步性而出现的错误,错误也包括两个进程同时进入了临界区,所以同步机制应该遵循以下准则。

  • 空闲让进。临界区空闲时让请求访问临界区的进程进入。
  • 忙则等待。当已有进程进入临界区后,其他试图进入临界区的进程必须等待而不能进入。
  • 有限等待。对请求访问的进程,必须在有限的时间内进入临界区。
  • 让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等待

 注:这里忙则等待和忙等待着重点不同,前者是一瞬间,后者是长时间。

3.3 实现临界区互斥的基本方法

3.3.1 软件实现方法

 在进入区设置并检查一些标志,若不满足进入条件则循环检查等待,在退出区修改标志。

注:单标志法在进入区不设置标志 。

3.3.1.1 单标志法

turn:公用整型变量,比如为0时表示进程0可以进入。为1时表示进程1可以进入。

在进入区只会检查能否进入,如果不能则循环等待。

可以看到只有另一个进程进入临界区后才会在退出区改变turn让其他进程有进入的资格,

所以当一个有资格的进程长时间不进入临界区会导致另一个进程想进也无法进入临界区,违反空闲让进。

3.3.1.2 双标志先检查法

 flag[ i ]:表明第 i 个程序是否进入临界区,当检查到其他程序进入临界区时不能进入。

进入区要干两件事情,一个是检查,一个是检查成功后修改 flag[ i ] 。这两次操作不能一步完成,所以可能会出现两个进程依次都先检查后允许进入,出现错误。违反忙则等待

3.3.1.3 双标志后检查法

两个进程先修改标志再进入检查, 结果发现对方都正在使用临界区(其实没有),违反空闲让进、有限等待准则。

3.3.1.4 Peterson算法

Peterson算法同时使用turn和flag[],turn表示该进程有进入的意愿(自己给的资格),flag表示别的进程是否占用临界区

仅当某一个进程有意愿进入临界区和其他进程没有进入临界区时该进程可以进入临界区。

 

Perterson是单标志法和双标志后检查法的优点结合。利用flag实现临界资源的互斥访问,利用turn实现空闲让进,避免饥饿现象发生。

上述四种软件实现的临界区互斥都违背让权等待。

3.3.2 硬件实现方法

计算机提供了特殊的硬件指令,允许对一个字中的内容进行检测和修正,或对两个字的内容进行交换等。通过硬件支持实现临界段问题的方法称为低级方法,或元方法。  

3.3.2.1 中断屏蔽方法

 利用“开/关中断指令”实现

缺点:不适合多处理机(另外一个处理机上的进程还可访问临界区);只能在内核态完成,故只适用于内核进程。

3.3.2.2 硬件指令方法之TestAndSet指令

又称TS、TSL指令,是用硬件实现的,执行的过程是一气呵成的,双标志先检查由于上锁和检查不是一气呵成的而出错。以下是C语言描述的逻辑:

3.3.2.3 硬件指令方法之Swap指令

又称Exchge指令、XCHG指令以下是C语言描述的逻辑。

共享布尔变量lock,初值为false表示未上锁。当old为ture时会不断循环交换函数,只有当lock为false时只需交换一次然后上锁,在退出区再解锁。

上面两种硬件指令方法适用于任意数目的进程,不管是单处理机还是多处理机。多处理机更适宜,因为单处理机会忙等。

上述三种低级(元)方法都没法实现让权等待。

3.4信号量

信号量机制是一种用来解决同步和互斥问题的机制,它只能被两个标准的原语wait(S)和signal(S)访问,可记为“P操作”和“V操作” 

3.4.1整型信号量

定义为一个用于表示资源数目的整型量S 。

3.4.2记录型信号量

记录型信号量是在整型信号量的基础上实现让权等待即解决忙等待而提出的。下面是定义:

 

  • block原语实现自我阻塞,将进程从运行态→阻塞态。
  • wakeup原语实现唤醒,将另一个进程从阻塞态→运行态。它们是成对出现的。

 注:若无特别说明,P/V操作都是记录型信号量。

3.4.3信号量实现同步

在前操作后执行V操作,在后操作前执行P操作。初值为0

  • 假如先进行P1操作,则V(S)使S++,后面进行P2的P(S)操作没有阻塞。
  • 假如先进行P2操作,则P(S)使P2进程阻塞,直到V(S)后P2才转到就绪态。

注:这个只是一个简单的同步问题,即P1操作的代码1,2一定要在P2操作的代码4,5,6前面。

当同步问题为一个进程中所进行的事情是某资源加一,而另一个进程中某事件的前提条件是某资源不为零,则同步信号量的初值不是恒为0。这些问题在后面的经典同步问题中会遇见。

3.4.4信号量实现互斥

用P/V操作夹住临界区。初值为1.

3.4.5信号量实现前驱关系 

为每一对前驱关系都设置一个信号量,初值为0。 

3.5互斥锁

解决临界区的最简单的工具就是互斥锁(mutex lock)函数acquire()获得锁,而函数release()释放锁。

互斥锁的主要缺点是忙等待,可称为自旋锁(spin lock),如前面的TSL指令、swap指令、单标志法、Peterson。

互斥锁通常用于多处理器系统,一个线程可以在一个处理器上等待,不影响其他线程的执行。 

3.6管程

3.6.1管程的概念

信号量机制存在的问题:编写程序困难,易出错。引入管程进行封装,简化内部实现细节。

它有这些部分组成:

  1. 局部于管程的共享数据结构说明。
  2. 对该数据结构进行操作的一组函数。
  3. 对局部于管程的共享数据初始化的函数。
  4. 管程有一个名字。

一个进程只有通过调用管程内的函数才能进入管程访问共享资源。

每次仅允许一个进程进入管程,从而实现进程互斥。

 实现同步也可以执行调用这些函数:

3.6.2条件变量 

当一个进程进入管程后被阻塞,此时其他进程无法进入管程。

将阻塞原因定义为条件变量(condition),只能对其进行wait和signal操作。

x.wait:当x对应的条件不满足时,正在调用管程的进程调用x.wait将自己插入x条件的等待队列,并释放管程。

x.signal:x对应的条件发生了变化,则调用x.signal,唤醒一个因x条件而阻塞的进程。 

条件变量和信号量的比较:条件变量的wait和signal和信号量的P/V操作是不同的,条件变量的wait和signal操作类似于P/V操作中的block和wakeup原语,能够实现进程的阻塞/唤醒。而信号量中的P/V操作是“有值”的,信号量的值反映了剩余资源数(或排队等待的阻塞进程数),而在管程中,剩余资源数用共享数据结构记录,被封装了起来,程序员无需关心。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37570.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用DIV、CSS技术设计的个人博客网页(web期末考试)

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

GANs综述

生成式对抗网络GANs及其变体 基础GAN 生成式对抗网络,是lan Goodfellow 等人在2014年开发的,GANs 属于生成式模型,GANs是基于最小值和最大值的零和博弈理论。 为此,GANs是由两个神经网络组成一个Generator。另一个是Discriminat…

dolphinscheduler 2.0.5和2.0.6 体验记录及优化扩展(任务出现kill状态、未设置延时执行出现延时执行、系统变量扩展)

目录🐬未停止工作流的情况下出现kill状态的任务实例🐬未设置延时执行出现延时执行🐠集群服务器时间有误差导致的🐠优化:增加延时时间判断🐬系统变量🐠第N周扩展*️⃣主目录:dolphins…

Kettle:跨库(SQLServer-PostgreSQL)同步多张表数据的详细设计过程

〇、参考地址 1、多个Excel实现同步 https://www.wangt.cc/2021/05/kettle%E5%A4%9A%E4%B8%AA%E8%A1%A8%E4%B8%80%E8%B5%B7%E8%BF%81%E7%A7%BB-%E9%80%9A%E8%BF%87%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E9%85%8D%E7%BD%AE%E9%9C%80%E8%A6%81%E5%90%8C%E6%AD%A5%E7%9A%84%E5%AD…

Java搭建实战基于若依springboot二次开发WMS带移动端管理系统vue源码

大家好啊,我是测评君,欢迎来到web测评。 有个朋友发了一套基于若依开发的springboot源码给我,让我帮忙看一下,录制一期视频教程出来,我看了一下,系统是前后端分离的架构,前端使用Vue2&#xff0…

Ubuntu20.04安装graph-tool

目录step1:查看系统发行版本step2: 在 /etc/apt/sources.list文件中添加一行step3: 下载密钥step4: 更新apt-getstep5: 下载graph-toolstep6:移动graph-tool包到anaconda下step7: 测试是否安装成功链接: 官方安装教程注:如果下列过程中出现权…

cesium在地形上贴地添加各种entity

目录 添加带标签的点 添加billboard 添加corridor 添加面polygon 添加带图片的面polygon 添加矩形 添加glb模型 被遮挡的线用其他颜色标注 添加贴地线 官方示例:Cesium Sandcastlehttps://sandcastle.cesium.com/?srcClamp%20to%20Terrain.html&labelTutor…

都已过35+程序员高危高龄,我为什么还要学习python?

前言 首先声明一点:学习PYTHON,绝不是要去当一名“憔悴的”程序猿~ (文末送读者福利) 去互联网大厂?则更是谈不上。就算我想去,大厂也是看不上。 年龄看不上(已过程序员35岁之高龄&#xff0…

学生个人网页设计作品 学生个人网页模板 简单个人主页成品 个人网页制作 HTML学生个人网站作业设计代做

🎉精彩专栏推荐👇🏻👇🏻👇🏻 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业…

LaTex常用技巧6:矩阵编写总结

本文记录和总结了LaTex编写矩阵的一些要点,具体参考这位博主半个冯博士的知乎文章如何用latex编写矩阵(包括各类复杂、大型矩阵)? 无括号矩阵圆括号矩阵方括号矩阵大括号矩阵行列式范数分块矩阵竖实线竖虚线横实线横虚线其他要点横…

redis的下载和安装详解

一、下载redis安装包 进入redis官网查看当前稳定版本: https://redis.io/download/发现此时的稳定版本是6.2.4, 此时可以去这个网站下载6.2.4稳定版本的tar包。 暂时不考虑不在windows上使用redis,那样将无法发挥redis的性能 二、上传tar…

智能疾病查询接口

一、接口介绍 最全的疾病大全,收集了数万种常见疾病,任何常见疾病都可查询。 二、功能体验 三、API文档 3.1 查询疾病科目 3.1.1接入点说明 查询疾病的类别。 3.1.2接口地址 http[s]😕/www.idmayi.com/546-1?idmayi_appid替换自己的值&…

spring复习02,xml配置管理bean

spring复习02,xml配置管理bean获取bean的几种方式1. 通过id获取bean2. 通过class获取bean3. id和class结合来获取bean依赖注入的两种方式setter注入有参构造器注入依赖注入时一些特殊值的处理1.字面量2.null值3.xml实体4.CDATA节为类类属性赋值1.引入已经声明的bean的方式2.内部…

在springboot工程中修改使用quartz创建的定时任务

Quratz是什么: Quartz 是一个完全由 Java 编写的开源作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。 Quartz 可以与 J2EE 与 J2SE 应用程序相结合也可以单独使用。 Quartz 允许程序开发人员根据时间的间隔来调度作业。 Quartz 实现了作业和触发器的…

CTF-misc练习(https://buuoj.cn)之第二页

目录 一、被劫持的神秘礼物 二、刷新过的图片 三、[BTF2020]认真你就输了 四、[BJDCTF2020]藏藏藏 五、被偷走的流量 九、菜刀666 十、秘密文件 十一、[BJDCTF2020]just_a_rar 十二、[BJDCTF2020]鸡你太美 十三、[BJDCTF2020]一叶障目 十四、神奇的二维码 十五、梅…

mysql必知必会

名词 数据库软件 : DBMS(database manager system) 数据库 :database, 通过DBMS创建和操作的容器, 保存有组织的数据的容器,,,通常是一个文件或者一组文件 表: 是一种结构化文件,,…

安科瑞水电预付费平台,远程控制,高校宿舍、员工宿舍、商场等多场合适用

安科瑞 司红霞 一、引言 预付费水表是一种为了适应“先付费后用水”的管理原则和系统而开发的水表产品其设计是在水表基表上加装了电子附加装置和控制阀,要求用户先预付,一定的费用或购置一定数量的水量,将预付费的信息输入水表后才可正常用…

四轴斜转魔方

目录 四轴斜转魔方 1,魔方三要素 2,公式推导 (1)调整8个角块位置 (2)调整6个中心块位置 (3)调整角块方向 四轴斜转魔方 1,魔方三要素 (1)组…

Sentinel实现服务降级并与api解耦

Sentinel怎样实现熔断降级 熔断降级介绍 sentinel支持服务的熔断降级 熔断类似于保险丝,在超出了阈值的情况下,在一定的时间内不会执行业务逻辑,直接执行服务降级的方法。服务降级利用本地fallback方法,返回一个有好的提示给客…

Scala配置和Spark配置以及Scala一些函数的用法(附带词频统计实例)

文章目录配置Spark配置Scala生成RDDfilter过滤器map方法flatMap方法reduceByKeyspark下wordcount程序参考先给出spark和Scala的下载地址,这是我用的版本https://pan.baidu.com/s/1rcG1xckk3zmp9BLmf74hsg?pwd1111也可以自己去官网下载。配置Spark 解压文件到softw…