【操作系统】第2章进程同步、PV操作、死锁

news2024/11/15 8:49:32

一、进程同步

1、 定义

(1) 临界资源:把一个时间段内只允许一个进程使用的资源称为临界资源。许多物理设备(摄像头、打印机)和许多变量、数据、内存缓冲区都属于临界资源。
对临界资源的访问必须互斥地进行
进入区:为了进入临界区使用临界资源,在进入区检查可否进入临界区,如果可以进入临界区,则应设置正在访问临界区的标志,以阻止其他进程同时进入临界区
临界区:进程中访问临界资源的那段代码,又称临界段
退出区:将正在访问临界区的标志清除
剩余区:代码中其余的部分
在这里插入图片描述

(2) 互斥:亦称间接制约关系,进程互斥是指当一个进程访问某临界资源时,另一个想要访问该临界资源的进程必须等待。当前访问临界资源的进程访问结束,释放该资源之后,另一个进程才能去访问临界资源
为了实现对临界资源的互斥访问,同时保证系统整体性能,需要遵循以下原则:
空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区
忙则等待。当已有进程进入临界区时,其他试图进入临界区的进程必须等待
有限等待。对请求访问的进程,应保证能在有限时间内进入临界区(保证不会饥饿)
让权等待。当进程不能进入临界区时,应立即释放处理机,防止进程忙等待
(3) 同步:亦称直接制约关系,它是指为完成某种任务而建立的两个或多个进程,这些进程因为需要在某些位置上协调它们的工作次序而产生的制约关系。进程间的直接制约关系就是源于它们之间的相互合作

二、进程互斥的软件实现方法

1、 单标志法

➢ 算法思想:两个进程在访问完临界区后会把使用临界区的权限转交给另一个进程。也就是说每个进程进入临界区的权限只能被另一个进程赋予
在这里插入图片描述
turn 表示当前允许进入临界区的进程号,而只有当前允许进入临界区的进程在访问了临界区之后,才会修改 turn 的值。也就是说,对于临界区的访问,一定是按P0→P1→P0→P1……这样轮流访问。这种必须“轮流访问”带来的问题是,如果此时允许进入临界区的进程是 P0,而 P0 一直不访问临界区,那么虽然此时临界区空闲,但是并不允许 P1 访问。
因此,单标志法存在的主要问题是:违背“空闲让进”原则

2、 双标志先检查

➢ 算法思想:设置一个布尔型数组 flag[],数组中各个元素用来标记各进程想进入临界区的意愿,比如“flag[0]=ture”意味着 0 号进程 P0 现在想要进入临界区。每个进程在进入临界区之前先检查当前有没有别的进程想进入临界区,如果没有,则把自身对应的标志 flag[i]设为 true,之后开始访问临界区
在这里插入图片描述

3、 双标志后检查

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

4、 Peterson 算法

➢ 算法思想:双标志后检查法中,两个进程都争着想进入临界区,但是谁也不让谁,最后谁都无法进入临界区,Peterson 提出:如果双方都争着想进入临界区,那可以让进程尝试“孔融让梨“,主动让对方先使用临界区
在这里插入图片描述

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

三、进程互斥的硬件实现方法

1、 中断屏蔽方法

➢ 利用“开/关中断指令“实现(与原语的实现思想相同,即在某进程开始访问临界区到结束访问为止都不允许被中断,也就不能发生进程切换,因此也不可能发生两个同时访问临界区的情况)
优点:简单、高效
缺点:不适用于多处理机;只适用于操作系统内核进程,不适用于用户进程(因为开/关中断指令只能运行在内核态,这组指令如果能让用户随意使用会很危险)

2、 TestAndSet(TS 指令/TSL 指令)

TSL 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成
在这里插入图片描述
➢ 若刚开始 lock 是 false,则 TSL 返回的 old 值为 false,while 循环条件不满足,直接跳过循环,进入临界区。若刚开始 lock 是 true,则执行 TLS 后 old 返回的值为 true,while 循环条件满足,会一直循环,直到当前访问临界区的进程在退出区进行“解锁
➢ 相比软件实现方法,TSL 指令把“上锁“和”检查“操作用硬件的方式变成了一气呵成的原子操作
优点:实现简单,无需像软件实现方法那样严格检查是否会有逻辑漏洞;适用于多处理机环境
缺点:不满足“让权等待“原则,暂时无法进入临界区的进程会占用 CPU 并循环执行TSL 指令,从而导致”忙等“

3、 Swap 指令(XCHG 指令)

Swap 指令是用硬件实现的,执行的过程不允许被中断,只能一气呵成
在这里插入图片描述

四、信号量机制

1、 定义

➢ 用户进程可以通过使用操作系统提供的一对原语来对信号量进行操作,从而很方便的实现了进程互斥、进程同步
信号量其实就是一个变量(可以是一个整数,也可以是更复杂的记录型变量),可以用一个信号量来表示系统中某种资源的数量,比如:系统中只有一台打印机,就可以设置一个初值为 1 的信号量
➢ 原语是一种特殊的程序段,其执行只能一气呵成,不可被中断。原语是由关中断/开中断指令实现的。软件解决方案的主要问题是由“进入区的各种操作无法一气呵成”,因此如果能把进入区、退出区的操作都用“原语”实现,使这些操作能“一气呵成”就能避免问题
➢ 一对原语:wait()原语和 signal()原语,可以把原语理解为自己写的函数,函数名分别为 wait 和 signal。

wait、signal 原语常称为 P、V 操作

2、 整型信号量

用一个整数型的变量作为信号量,用来表示系统中某种资源的数量
与普通整数变量的区别:对信号量的操作只有三种——初始化、P 操作、V 操作
在这里插入图片描述

3、 记录型信号量

整型信号量的缺陷是存在“忙等”问题,因此人们又提出了“记录型信号量”,即用记录型数据结构表示的信号量
在这里插入图片描述
在这里插入图片描述

五、用信号量实现进程互斥、同步和前驱关系

1、 实现进程互斥

① 分析并发进程的关键活动,划定临界区(如:对临界资源打印机的访问就应放在临界区)
② 设置互斥信号量 mutex,初值为 1
③ 在临界区之前执行 P(mutex)
④ 在临界区之后执行 V(mutex)
注意:对不同的临界资源需要设置不同的互斥信号量。
P、V 操作必须成对出现。缺少 P 操作就不能保证临界资源的互斥访问。缺少 V 操作会导致资源永不被释放,等待进程永不被唤醒

在这里插入图片描述

2、 实现进程同步

① 分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码)
② 设置同步信号量 S,初始为 0
③ 在“前操作”之后执行 V(S)
④ 在“后操作”之前执行 P(S)
在这里插入图片描述

3、 实现进程的前驱关系

在这里插入图片描述

六、管程

1、 定义

管程是一种特殊的软件模块,有这些部分组成:
① 局部于管程的共享数据结构说明;
② 对该数据结构进行操作的一组过程;
③ 对局部于管程的共享数据设置初始值的语句;
④ 管程有一个名字。

2、 基本特征

① 局部于管程的数据只能被局部于管程的过程所访问;
② 一个进程只有通过调用管程内的过程才能进入管程访问共享数据
③ 每次仅允许一个进程在管程内执行某个内部过程。

3、 管程的使用注意

引入管程的目的无非就是要更方便地实现进程互斥和同步
① 需要在管程中定义共享数据(如生产者消费者问题的缓冲区)
② 需要在管程中定义用于访问这些共享数据的“入口”——其实就是一些函数(如生产者消费者问题中,可以定义一个函数用于将产品放入缓冲区,再定义一个函数用于从缓冲区取出产品)
③ 只有通过这些特定的“入口”才能访问共享数据
④ 管程中有很多“入口”,但是每次只能开放其中一个“入口”,并且只能让一个进程或线程进入(如生产者消费者问题中,各进程需要互斥地访问共享缓冲区。管程的这种特性即可保证一个时间段内最多只会有一个进程在访问缓冲区。注意:这种互斥特性是由编译器负责实现的,程序员不用担心)
⑤ 可在管程中设置条件变量及等待/唤醒操作以解决同步问题。可以让一个进程或线程在条件变量上等待(此时,该进程应先释放管程的使用权,也就是让出“入口”);可以通过唤醒操作将等待在条件变量上的进程或线程唤醒程序员可以用某种特殊的语法定义一个管程,之后其他程序员就可以使用这个管程提供的特定的“入口”很方便地使用实现进程同步/互斥了

七、死锁

1、 概念

  • (1) 在多道程序系统中,由于多个进程的并发执行,改善了系统资源的利用率并提高了
    系统的处理能力。然而,多个进程的并发执行也带来了新的问题——死锁。死锁是
    指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都
    将无法向前推进。
  • (2) 区别饥饿、死循环
    ➢ 饥饿:由于长期得不到想要的资源,某进程无法向前推进的现象
    ➢ 死循环:某进程执行过程中一直跳不出某个循环的现象
    在这里插入图片描述

2、 死锁产生的原因

① 对系统资源的竞争。各进程对不可剥夺的资源(如打印机)的竞争可能引起死锁,对可剥夺的资源(如 CPU)的竞争不会引起死锁
② 进程推进顺序非法。请求和释放资源的顺寻不当,也会导致死锁
③ 信号量的使用不当。如生产者-消费者问题中,如果实现互斥的 P 操作在实现同步的 P 操作之前,就有可能导致死锁

3、 死锁产生的必要条件

产生死锁必须同时满足四个条件,只要一条不成立,死锁就不会发生
① 互斥条件:只有对必须互斥使用的资源的争抢才会导致死锁
② 不剥夺条件:进程所获得的资源在未使用完之前,不能由其他进程强行夺走,只能主动释放。
③ 请求和保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源又被其他进程占有,此时请求进程被阻塞,但又对自己已有的资源保持不放。
④ 循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被下一个进程所请求
注意:发生死锁一定循环等待,但循环等待不一定死锁

4、 死锁的预防

  • (1) 破坏互斥条件(不太可行)
    将系统资源都共享使用,但有些资源根本不能共享使用
  • (2) 破坏不剥夺条件
    当某个进程请求新的资源得不到满足时,它必须立即释放保存的所有资源,待以后需要时再重新申请。也就是说,即使某些资源尚未使用完,也需要主动释放,从而破坏了不可剥夺条件
    缺点
    ① 实现起来比较复杂;
    ② 释放已获得的资源可能造成前一阶段工作的失效。因此这种方法只适用于易保存和恢复状态的资源,如 CPU;
    ③ 反复地申请和释放资源会增加系统开销,降低系统吞吐量
    ④ 如果暂时得不到某个资源就要放弃所有资源,以后再重新申请,就有可能发生饥饿
  • (3) 破坏请求和保持条件
    可以采用静态分配法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不让它投入运行。一旦投入运行后,这些资源就一直归它所有,该进程就不会再请求别的任何资源了
    缺点:有些资源可能只需要用很短的时间,因此如果进程的整个运行期间都一直保持着所有资源,就会造成资源浪费,资源利用率极低。另外,该策略也有可能导致某些进程饥饿。
  • (4) 破坏循环等待条件
    可采用顺序资源分配法。首先给系统中的资源编号,规定每个进程必须按编号递增的顺序请求资源,同类资源(即编号相同的资源)一次申请完。一个进程只有已占有小编号的资源时,才有资格申请更大编号的资源。按此规则,已持有更大编号资源的进程不可能逆向地回来申请小编号的资源,从而就不会产生循环等待的现象
    缺点
    新的设备,因为可能需要重新分配所有的编号
    ① 进程实际使用资源的顺序可能和编号递增顺序不一致,会导致资源浪费
    ② 必须按规定次序申请资源,用户编程麻烦

5、 死锁的避免

  • (1) 什么是安全序列
    ➢ 所谓安全序列,就是指如果系统按照这种序列分配资源,则每个进程都能顺利完成。
    只要能找出一个安全序列,系统就是安全状态。当然,安全序列可能有多个。
    ➢ 如果分配了资源之后,系统找不出任何一个安全序列,系统就进入了不安全状态。
    这就意味着之后可能所有进程都无法顺利的执行下去。当然,如果有进程提前归还了一些资源,那系统也有可能重新回到安全状态,不过我们在分配资源之前总是要考虑到最坏的情况
    ➢ 如果系统处于安全状态,就一定不会发生死锁。如果系统进入不安全状态,就可能发生死锁(处于不安全状态未必就是发生了死锁,但发生死锁一定是不安全状态)
    ➢ 因此可以在资源分配之前预先判断这次分配是否会导致系统进入不安全状态,以此决定是否答应资源分配请求。这也是“银行家算法”的核心思想
    在这里插入图片描述
  • (2) 银行家算法
    在这里插入图片描述
    数据结构:

➢ 长度为 m 的一维数组 Available 表示还有多少可用资源
➢ nm 矩阵 Max 表示各进程对资源的最大需求数
➢ n
m矩阵 Allocation 表示已经给各进程分配了多少资源
➢ Max-Allocation=Need 矩阵表示各进程最多还需要多少资源 ➢
用长度为 m 的一维数组 Request 表示进程此次申请的各种资源数

在这里插入图片描述
银行家算法步骤:
① 检查此次申请是否超过了之前声明的最大需求数
② 检查此时系统剩余的可用资源是否还能满足这次请求
③ 试探着分配,更改各数据结构
④ 用安全性算法检查此次分配是否会导致系统进入不安全状态
安全性算法步骤:
检查当前的剩余可用资源是否能满足某个 进程的最大需求,如果可以,就把该进程加入安全序列,并把该进程持有的资源全部回收不断重复上述过程,看最终是否能让所有进程都加入安全序列

6、 死锁检测和解除

  • (1) 死锁的检测
    为了能对系统是否已发生了死锁进行检测,必须:
    ① 用某种数据结构来保存资源的请求和分配信息;
    ② 提供一种算法,利用上述信息来检测系统是否已进入死锁状态
    在这里插入图片描述
  • (2) 死锁的解除
    一旦检测出死锁的发生,就应该立即解除死锁。并不是系统中所有的进程都是死锁状态,用死锁检测算法化简资源分配图后,还连着边的那些进程就是死锁进程
    解除死锁的主要方法:
    ① 资源剥夺法。挂起(暂时放到外存上)某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但是应防止被挂起的进程长时间得不到资源而饥饿
    ② 撤销进程法(或称终止进程法)。强制撤销部分、甚至全部死锁进程,并剥夺这些进程的资源。这种方式的有点是实现简单,但付出的代价可能会很大
    ③ 进程回退法。让一个或多个死锁进程回退到足以避免死锁的地步。这就要求系统要记录进程的历史信息,设置还原点
  • (3) 如何选择回退或撤销哪个进程
    ① 进程优先级
    ② 已执行时间
    ③ 还有多久能完成
    ④ 进程已经使用了多少资源
    ⑤ 进程是交互式的还是批处理式的,优先回退或撤销批处理进程

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

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

相关文章

【软考】中级 | 数据库系统工程师 | 笔记总结

📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由肩匣与橘编写,首发于CSDN🙉 📢生活依旧是美好而又温柔的,你也…

解决winstore下载mincraft 出现错误提示的问题

mincraft 点开显示此应用无法在你的电脑上运行,去C:\XboxGames\Minecraft Launcher\Content下看了下: 但是别人电脑上相同目录下一样的文件能运行,于是选择重装,但是刚开始下载就遇到这个问题: 商店提示这个 点开一…

Ansys Zemax | 计算任意温度和压强下的折射率

概述 这篇文章介绍了OpticStudio如何计算材料在任意输入波长、环境温度和压强下的折射率。 介绍 通常情况下有两种参考折射率的测量方法:绝对测量和相对测量。其中绝对测量以真空为参考介质;相对测量则是以空气(摄氏温度20,一个标…

MySQL之盛放记录的大盒子 【InnoDB 数据页结构】

前言 本文章收录在MySQL性能优化原理实战专栏,点击此处查看更多优质内容。 本文摘录自 ▪ 小孩子4919《MySQL是怎样运行的:从根儿上理解MySQL》 学完了记录结构,我们该学数据页的结构,前边我们简单的提了一下页的概念&#xff…

臻图信息利用数字孪生构建生态环境智慧监测系统

2月27日,中共中央国务院印发《数字中国建设整体布局规划》中指出,要推动生态环境智慧治理,加快构建智慧高效的生态环境信息化体系,建设绿色智慧的数字生态文明。 生态环境监测是生态环境保护的基础,是生态文明建设的重…

企业什么时候需要ERP系统?

对于许多成长中的企业来说,是否需要ERP系统不是问题,而是何时需要的问题。随着企业的发展,其生成的数据量和要跟踪的数据源也在不断增加。在多个平台上管理所有这些信息变得成本昂贵、费时,而且容易出现管理不善的情况。 虽然对于…

性能测试入门实践路线图

我转行做软件测试工作已有六年多了, 从功能到自动化测试,然后负责性能测试团队和质量团队的技术专项治理,再到测试专家角色,负责整个技术项目的产品/运营和质量保障工作。 其中性能测试和线上稳定性保障,算是我最擅长…

物联网|IAR集成开发环境简介|cc254核心板硬件资源|物联网之蓝牙4.0 BLE基础-学习笔记(3)

文章目录 4、IAR集成开发环境简介5、 cc254核心板硬件资源 4、IAR集成开发环境简介 完整稳定的专业嵌入式开发环境,对不同的处理器有统一的用户界面,支持35种以上的MCU,包括8,16,32位, 完全兼容C语言的 高…

女孩子转数据分析难吗?难在哪里?

对于数据分析,很多人乍一听会觉得没啥技术难度,是个适合女孩子的专业。我们面对很多零基础小白也是用通俗的语言来形容这个专业:一般是通过Excel或者power BI工具对数据进行分析,制作成可视化的报表给领导层,为公司业务…

VS2022编译libiconv-1.17

需求概述 获得最新版本的windows下可用的libiconv静态库。 解决方案 概述 使用VS2022编译libiconv-1.17。需要对源码手动进行配置。 本文所述的方法同样适用于动态库,并且理论上适用于VS2010~2022所有版本。 如果你不在乎libiconv的版本,可以参考 …

DevOps死了吗?平台工程能否取代DevOps?

最近, Scott Carey 发表了一篇调查文章,喊出了一些开发者的心声:“扯淡的DevOps,我们开发者根本不想做运维!”除此之外,软件工程师兼DevOps评论员Sid Palas也在推特上写道,“DevOps已死&#xf…

C++知识点 -- 特殊类设计

C知识点 – 特殊类设计 文章目录 C知识点 -- 特殊类设计一、不能被拷贝的类二、 只能在堆上创建对象的类三、 只能在栈上创建对象的类四、 不能被继承的类五、 只能创建一个对象的类(单例模式)1.饿汉模式2.懒汉模式3. 单例对象释放问题: 一、…

【Python入门篇】——Python中判断语句(布尔类型,比较运算符,if语句)

作者简介: 辭七七,目前大一,正在学习C/C,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选择循环语句…

Verilog 编程——奇偶分频(50%占空)

引言 最近准备一些笔试面试,想再把时钟奇偶分频的再整理一下。 我之前写过一个PWM产生的模块,里面有任意频率/占空比的时钟生成。可以参考: 基于FPGA的PWM发生器设计https://blog.csdn.net/qq_43045275/article/details/128365705?ops_re…

Scala学习(一)

1.什么是Scala Scala将面向对象和函数式编程结合成一种简洁的高级语言。Scala的静态类型有助于避免复杂应用程序中的错误。 1.1 为什么要学习Scala? Spark基于内存的大数据计算框架,而Spark就是Scala开发的。所以为了学习好Spark需要掌握Scala语言。 …

learn C++ NO.3 ——类和对象(1)

1.初步理解面向过程和面向对象 C语言是面向过程的高级编程语言,而C是面向对象的高级编程语言。那么两者有什么区别呢?且看下图分析。 面向过程语言就是逐步拆分并解决问题。其特点是过程化和模块化,数据和对数据的操作是分离的。 由于面向过…

《LeetCode》—— 哈希

今天刷题讲解的主要讲的是关于——哈希这个知识点的题目讲解。 目录 (一)缺失的第一个正整数 (二)数组中只出现一次的两个数字 1、直接法 2、哈希 (三)直线上最多的点数 (一)缺…

力扣题库刷题笔记735-行星碰撞

1、题目如下: 2、个人Python代码实现 个人代码思路,主要是新建一个列表stack,将原列表asteroids中的元素依次加入到stack中。以上代码可能会有两部分比较冗余的部分,一是两个标志位可以不用单独声明,二是当stack列表中…

解析内存中的高性能图结构

在进行各种图处理、图计算、图查询的时候,内存或是硬盘中如何存储图结构是一个影响性能的关键因素。本文主要分析了几种常见的内存图结构,及其时间、空间复杂度,希望对你有所启发。 通常来说,对于图结构的几种常见的基础操作&…

通过SSH隧道安全消费Kafka数据

一.背景 由于我们有个业务在阿里云部署了Kafka,但是想直接在本地IDC机房服务器直接通过公网消费Kafka进行业务处理。这个本来也不是什么难事,阿里云把9092默认端口打开运行访问即可,也不不值得再写这篇博客了。 这个事情让人特别关注的一个主…