OS.二轮复习.§2进程与线程

文章介绍了同步与互斥的概念,强调了它们在多进程/线程环境中的作用。同步关注的是进程按特定顺序执行,而互斥关注的是临界资源的独占访问。临界资源包括硬件和某些软件资源,操作系统需要确保其访问的原子性。文章提出了进程对临界资源互斥访问的四个原则,并详细解释了Peterson算法,这是一种用于两个进程间实现临界资源互斥的软件方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2.2同步与互斥

2.2.1同步与互斥的理解

·进程同步与互斥二者的区别是:

-同步强调的是完成同一任务的几个进程/线程按照某一特定顺序,其中同一任务还有某一特定顺序是同步强调的。

-互斥强调的是对于某一临界资源的访问是不能同时有两个以上进程/线程同时进行的,其中某一临界资源的不同时被多个进程/线程访问是互斥强调的。

·临界资源与临界区

-什么是临界资源?

★临界资源不仅仅指硬件设备,有些软件资源也属于临界资源,比如:由不同进程共享的消息队列、某些变量、某些文件等。

但是临界资源本质上的特性,也即临界资源的定义:同一时刻,只能被一个进程使用的资源。强调一个被使用的互斥性。

-临界区这个概念听起来很高大上,其实就是每个程序他要想访问某个临界资源所对应的访问该临界资源的代码,本质上是一段代码。但是一定要注意★:只要进程一个脚指甲盖踏入了这个临界区,那么我们的操作系统就有责任并且必须保证临界区这段代码的运行的原子性(也即一气呵成)这也就意味着访问临界资源是操作系统需要保证临界资源必须不能被其他进程插一脚来访问,必须要保证这种互斥性。(为什么保证这种互斥性其实从汇编的角度就很好理解,其实进程同步互斥本身就是伴随着现代操作系统的多道程序在一个机器里并发执行,为了让这多道程序直接切换运行的流利自如,OS不仅为期提供了PCB机制来保护现场更需要保证某些情况下不能让进程入侵式抢占正在访问临界区的进程,就拿老生常谈的打印机的例子,当Thr_A访问打印机使用打印进程打印自己的论文的时候,Thr_B也向OS申请了访问打印机来打印自己的美女图片,那OS背地里就得通过一些方法,让Thr_B的打印内容不能和Thr_A的打印内容混淆(比如为打印机这个临界资源设置等待队列)这就是一个活生生的保证临界资源互斥性使用例子)。

 

 

2.2.2 进程对临界资源实现互斥访问遵循的原则:

(1)空闲让进 —— 只要临界区空闲(临界资源没有被使用),且有进程请求进入临界区访问临界资源,则立刻让该进程进入临界区(强调的是不让这个进程等)

(2)忙则等待—— 当 存在一个进程进入某临界资源的临界区使用该临界资源时(进程可以在该临界资源设置标志已表明该临界资源正在被使用,从而告知其他进程防止其他进程没必要的访问,其他进程在进入临界区访问临界资源前,也会检查相应的临界资源是否正在被使用的变量来决断是否进入相应的临界区),则其他进程如果也想使用该临界资源,则需要等待。

(3)有限等待—— 对于(2)中那些等待使用某临界资源的进程,不能让他们等太久,不然就会发生进程饥饿的情况,因此,为了避免这种进程饥饿的情况的发生,应该通过某些机制来保证等待临界资源的进程不会无限时间等待。

(4)★让权等待—— 当进程不能进入临界区时,应立刻释放CPU 。← 是王道书原话,我来解释一下:当进程不能进入临界区时,意思是进程不满足或者无法使用其请求的相应的临界资源,因此其缺少继续进行作业所需要的资源,所以其无法继续完成运行(好比你让一个工匠给你造一把宝剑,然后你给工匠的设计图纸需要卡拉玛依宇宙第一大宝石,然而工匠那边克拉玛依宇宙第一大宝石缺货,那工匠不会坐那里干等着克拉玛依大宝石,他会继续为别的客户进行打造武器,这里的克拉玛依大宝石就好比临界资源,工匠就是cpu,而你的宝剑的制造进度就是进程完成作业的进度,也就是说当你缺少资源,更何况是临界资源——克拉玛依大宝石时,工匠会让给的武器赶制造进度,以此来最大限度压榨工匠😂)也就是不让进程占着cpu一直循环空等临界资源的释放,来以此来最大限度利用CPU。

由以上原则,特别是原则(2)我们可以大致推断出一个临界区的基本模版:

while(1)

{

        进入区;//1st:检查临界资源是否“上锁”,if(没上锁) 对临界资源进行上锁,进入临界区

        访问临界区ing;//此时临界资源正在被访问

        退出区//用来解锁临界资源的标志位

        剩余部分//

  }

2.2.3.1实现临资源的互斥访问的软件实现——Peterson算法

·Peterson算法的目的:

两个进程间要想对同一临界资源实现互斥访问,可以通过皮特森算法对临界区进行代码补充实现。

-Peterson算法在两个互斥访问同一临界资源的进程的临界区共享两个变量:

        (1)turn:表示应该轮到哪个进程进入临界区。

        (2)bool flag[2]:指明进程已经做好准备使用临界区

                               例如:

                                        两个进程:p_0、p_1;

                                        (turn == 0)//表示该轮到p_0进入临界区;

                                        (bool flag[0] == ture)//表示p_0准备进入临界区;

       (3)进入临界区的条件:

                对于thread_i (i = 0或1) ,当

                 1) turn== i || flag[ (i+1)%2] == flase 为真时进程i才可以进入临界区;

                        // 在i的回合内,或者j不想进入临界区

-Peterson算法的证明(NJU.jyy:程序的本质就是状态机,而我们可以借用树的结构来证明所有的可能状态)

0147767ede85492ca9841168f6514454.png

 未完待续……

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值