挑战408——操作系统(9)——进程的同步与互斥

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

操作系统中的并发进程有些是独立的有些需要相互协作,独立的进程在系统中执行不影响其他进程,也不被其他进程影响(因为他们没有共同需要一起用到的资源)。而另外一些进程则需要与其他进程共享数据,以完成一项共同的任务。
因此,为了保证操作系统的正常活动,使得程序的执行具有可再现性,保证执行结果的正确性。操作系统必须为这种协作的进程提供某种机制。
进程间的协作关系分为:互斥,同步,通信。(实习面试的时候,有个考官问过我这个问题)

进程间的协作关系
  • 互斥是指多个进程不允许同时使用同一资源。当某个进程使用某种资源的时候,其他进程必须等待。所以资源不能被多个进程同时使用。在这种情况下,程序的执行与其他进程无关。
  • 同步是指多个进程中发生的事件存在某种先后顺序。即某些进程的执行必须先于另一些进程(我们之前画的前驱图)。其任务是使得并发执行的诸多进程有效的共享资源和相互合作,从而使程序的执行具有可再现性。这种情况下,进程间接知道对方。
  • 通信是指多个进程间要传递一定的信息。这个时候进程直接得知对方。
临界资源和临界区

在计算机中,某段时间内只允许一个进程使用的资源称为临界资源,比如打印机,共享变量等等。而每个进程访问临界资源的那段程序代码称为临界区。
显然,几个进程共享一个临界资源,它们必须互斥使用。为此每个进程在进入临界区的时候,要对访问的临界资源进行检查,看它是否正在被访问,若是则不进入临界区,否则进入临界区,并设置标志,表明我这个进程正在访问临界资源,这段代码称为进入区。其余的代码称为剩余区。
在这里插入图片描述

当然,不是所有的程序都必须等待资源的释放,当满足下面几个条件的时候可以允许进入(具体的后面会解释,感觉配合案例好理解):
1. 空闲让进
2. 忙则等待
3. 有限等待
4. 让权等待

这里说说临界资源与共享资源的区别*:
临界资源是指某段时间内只允许一个进程使用的资源。(比如打印机)
共享资源是指某段时间内允许多个进程同时使用的资源。(比如磁盘,公用队列等,可以多个进程同时读取数据,但不能同时修改)
再注意一下临界区的概念:每个进程访问临界资源的那段程序代码称为临界区。 注意:临界区是进程的一段代码,有n个进程就会有n个临界区。

实现互斥的方法

实现互斥常用的方法有:软件实现法,硬件实现法,pv信号量法。其中软件实现方法虽然用的比较少,但是其算法的思想还是比较重要的,考试喜欢在选择题中考。硬件的实现了解一下,考的比较多。而PV操作即能实现同步又能实现互斥,所以是历年考查的重点,如果说大题年年考都不为过,这个放单独的章节写。

软件实现法

为了更好的理解思想,我们采用编程语言的思想去分析过程

单标志法

先看下面的两段代码:

/*进程p1*/                                 /*进程p2*/ 
while(turn != 0){                       while(turn != 1){
	什么也不做                                 什么也不做
}                                       }
/**p1的临界区**/                        /**p2的临界区**/
turn = 1;                                turn = 0;
/**剩余区**/                             /**剩余区**/

当采用单标志法的时候,我们设置公共的bool变量turn。对于进程P1而言,只有当turn =0的时候才允许它进入临界区,当它退出的时候,将turn置1,这个时候才轮到P2进入,因此实现了两个进程互斥进入临界区,保证了任何时刻都至多只有一个进程可以进入临界区
但是这种方法带来了新的问题:这种做法强制进程轮流进入临界区,而且这时候如果出现没有进程在访问临界资源的话,资源空闲,但是可以进入。不能保证空闲让进,也就是当资源空闲的时候,不能保证有进程进入。
举个例子:进程p1进入临界区并顺利执行后离开,并将turn 置1,按照正常流程应该轮到p2执行,但是如果p2迟迟不来呢?(比如某些原因阻塞了),那么临界资源空闲,而turn = 1一直成立,导致其他需要使用这个资源的进程必须等待。
所以不能做到空闲让进

双标志先检查法

那么既然前一种方式不能做到空闲让进,那么我们就设法克服这一点,看下面的代码:

/*进程p1*/                                 /*进程p2*/ 
while(flag[1]){ //(1)                     while(flag[0]){//(2)
	什么也不做                                 什么也不做
}                                     }
flag[0] = true; //(3)                     flag[1] = true;//(4)
/**p1的临界区**/                        /**p2的临界区**/
flag[0] = false;                       flag[1] = false;
/**剩余区**/                             /**剩余区**/

这样想,既然我们可以用一个标志位保证进程间只能允许一个进程访问临界资源,那么我们是否也可以再采用一个标志位来保证空闲让进呢?
我们设置一个BOOL类型的数组flag[2],初始值为false,用来表示一开始时所有进程都未进入临界区,若flag[0] = true,则表示p1允许进入临界区并执行。
与(1)不同,在进入之前,检查是否有进程在使用该资源。如果有,那么就等待,如果没有就进入。
我们来分上面两个进程:

while(flag[1]) //如果此刻p2正在使用临界资源,那么等待
flag[0] = true;//否则,将flag[0]置为true,进入临界区,也表明这个资源我在用。
flag[0] = false;//离开临界区,表明这个资源我用完了或者没在用

//再来看看P2:
 while(flag[0]) //如果此时p1正在使用临界资源,那么等待
 以下同上

这样进程在使用之前都检查一下是否有其他进程在使用临界资源,没有就进入,所以保证了空闲让进
潜在的问题:由于进程是并发执行的,所以执行的步骤或者说推进的速度都是不一致的,如果推进的速度是这样的:(1)->(2)->(3)->(4),那么(1)(2)步骤一开始都是false,继续执行(3)(4),发现这个时候flag[2]全部都是true,也就是双方的while循环都是对的,因此同时进入临界区。这样就违背了“忙则等待”。即有进程在访问临界资源的时候,其他进程必须等待。

双标志,先修改后检查

同样的,先看看方法(2)的问题所在,原因就是它先进行检查,却忽略了进程执行速度对检查的影响。那么我们在检查之前进修改一下呢?

/*进程p1*/                                 /*进程p2*/ 
flag[0 ] = true;                       flag[1] = true;
while(flag[1]){                        while(flag[0]){
   什么也不做                                 什么也不做
}                                     }
flag[0] = true;                        flag[1] = true;
/**p1的临界区**/                        /**p2的临界区**/
flag[0] = false;                       flag[1] = false;
/**剩余区**/                             /**剩余区**/

其实,对比上面的方法(2),只是先执行了赋值操作,我们分析一下:
flag[0 ] = true; //P1想进入临界区
while(flag[1]) //于是检查一下p2是否在使用临界资源,如果是,那么什么都不做
flag[0] = false;//否则进入临界区,并且离开的时候,置为false,表明资源使用完毕。这样,在获得进入临界区的权利后,准备进入之前,看看有没有进程也想进入,有的话就让给对方。克服了两个进程同时进入临界区的问题
但是,又考虑一种极端的情况
假设P1和P2都同时想进入临界区,并发执行的顺序同方法二,那么都将自己置为true,此时while循环执行,发现对方也想进入,于是相互谦让,导致谁都访问不了这个资源,产生饥饿现象。

Peterson’s算法

也称为先修改,后检查,后修改者等待算法。很拗口,但是理解起来不难,该算法可以看错做是方法(1)(3)的结合。用方法一中的turn标志实现临界资源的访问,用(3)的双标志个修改来维护临界区进入准则。

 /*进程p1*/                                 /*进程p2*/ 
 flag[0 ] = true;                       flag[1] = true;
 turn = 1;                                 turn = 0;
while(flag[1]&&turn ==1){          while(flag[0]&&turn ==0){
	什么也不做                                 什么也不做
}                                     }
/**p1的临界区**/                        /**p2的临界区**/
flag[0] = false;                       flag[1] = false;
/**剩余区**/                             /**剩余区**/

算法通过修改同一标志turn来描述标志修改的前后。我们同样分析一下p1的进程:
flag[0 ] = true; //表明P1想进入临界区
turn = 1;//设置标志位为1,
while(flag[1]&&turn ==1) //如果p2想用,并且p1的推进速度较慢,那么让出给p2.
flag[0] = false //否则进入临界区,并且离开的时候,置为false,表明资源使用完毕

为什么turn的值会受推进速度的影响?我们同样考虑之前的极端情况,按照顺序(1)(2)(3)(4),turn的值先从1,再变为0,说明P2的赋值语句turn = 0对比P1的赋值语句 turn = 1执行的较晚,根据后修改的进程等待的原则,这个时候给P1执行。

所以这个方法实现了“空闲让进”和"忙则等待"

硬件实现法

硬件的实现方法主要有两种:禁止中断和专用机器指令

  1. 禁止中断:
    这个方法其实很简单:
静止中断
/**临界区**/
开中断
/**剩余区**/

这种方式主要用于单处理机,因为单处理机中进程不能并发执行,所以只要保证一个进程不被中断即可。
但是这样子进程被限制只能交替进行。

  1. 专用机器指令(TS指令, swap指令)
    TS指令是指读出指定标记后记为true,设置一个bool变量lock,当lock为true时,代表资源正在使用,反之false表示空闲:
    在这里插入图片描述
    当进程进入临界区时,由于while循环的存在,于是不会主动放弃CPU。这种方法适用范围广,并且简单,同时支持多个临界区。

但是却不能做到“让权等待”,并且进程是随机选择的,可能造成某个进程饥饿。

2018 年研究生全国统考计算机试题——操作系统部分试题解析 2018 年研究生全国统考计算机试题——操作系统部分试题解析,408操作系统真题解析 立即下载

相关推荐

ICC 实战解析——CTS 时钟树综合中的关键设置优化策略

本文深入解析ICC工具中CTS时钟树综合的关键设置优化策略,涵盖时钟树异常引脚设置、目标参数配置、非默认布线规则(NDR)等核心技术。通过实战案例展示如何有效控制时钟偏差、优化信号完整性,并平衡功耗面积,为芯片物理设计提供专业指导。

weixin_30872577的博客 294

计算机考研408强化之操作系统 | 2.进程管理

计算机考研408强化 操作系统 进程管理

为了远大的理想,冲锋! 1469

‌NTRU算法详细教程 | 2025年最新版(基于NIST后量子密码标准更新)

‌:NTRU是当前抗量子加密的黄金标准,‌。

blns_yxl的博客 1778

进程互斥同步

一、进程 进程互斥(mutual exclusion) 共享资源 是竞争关系。 是无意识安排的,可以发生在相关进程之间,也可以发生在无关进程之间。 是间接制约关系。 进程同步 合作关系。 是有意识的安排,只发生在相关进程之间。 直接制约关系。 二、实现进程互斥 临界区 系统中某些资源只允许一个进程使用,这样的资源称为临界资源(critical resource),或互斥资源又...

冲鸭^ 1828

进程互斥的软件方法

通过平等协商方式实现进程互斥的最初办法是软件办法。其基本思路是在进入区检查和设置一些标志,如果已经有进程在临界区,则在进入区通过循环检查进行等待;在退出区修改标志。其中的主要问题是设置什么标志和如何检查标志。下面讨论几种软件方法实现软件互斥算法

cat_milk的博客 502

操作系统进程线程学习笔记

操作系统进程线程复习一、什么是线程,什么是进程?二、进程控制通过什么方式?关于进程关于线程什么是调度?关于CPU利用率的计算进程互斥 一、什么是线程,什么是进程? 线程是CPU调度和分派的基本单位,不拥有系统资源(–线程ID,TCB线程控制块) 进程是资源调度的基本单位,拥有系统资源,(PCB进程控制块) 二、进程控制通过什么方式? 通过操作系统核心态原语实现(原语特点:不可中断),这样的操作叫做原子操作。 原语采用开关中断实现 【阻塞原语和唤醒原语两两会同时出现】 关于进程进程内存地址空间相互独立

qq_44781255的博客 202

操作系统进程同步通信

进程同步通信 互斥 多个进程不能同时使用同一个资源,当某个进程使用某种资源时,其他进程必须等待 同步 多个进程中发生的事件存在时序关系 进程通信 多个进程之间要传递信息 进程间的相互作用 无关进程:在逻辑上无任何联系的进程 相关进程:指多个并发进程在逻辑上有某种联系 进程的交互 互斥:指多个进程不能同时使用同一个资源 死锁:指多个进程互不相让,都得不到足够的资源 饥饿:指一个进程一直得不到资源 ...

T2020_2_22的博客 379

考研408——操作系统

啥叫文件的逻辑结构呢?其实很好理解,就是在用户的视角下,看到的文件结构。啥叫用户视角下看到的文件结构?难道用户看到的文件结构不是真正的文件结构吗?没错,确实不是,那为啥呢?这主要是因为,为了实现高效的存储(为了在有限的空间内装入尽可能多的文件),工程师们肯定会设计一些特殊机制。而这些特殊机制在用户层面是不好理解的,如果把原原本本的结构展现给用户,这样就会增加用户的理解成本,不利于产品的推广。为了使产品的用户尽可能的多,我们肯定是要想尽一切办法,让用户使用计算机变得很简单。

codezhu的博客 1056

408操作系统考纲知识点

这部分是操作系统的“绪论”,旨在建立对OS的。

weixin_50444005的博客 1145

macosx 不允许无名信号量_挑战408——操作系统(10)——信号量PV操作

处理同步互斥的问题,除了用到之前的软件和硬件的方法,用的最多的还是信号量机制。 信号量机制是通过定义表示共享资源使用的特殊变量以及两个标准的原语(P操作和V操作),来实现同步互斥的。 根据信号量的数据类型不同,我们将信号量分为整型信号量和记录型信号量。整型信号量整型信号量是一种被定义为用来表示资源数的整型量S,其值只能被wait和signal操作。S的初始值被设置为可访问的资源数的数量。当用...

weixin_32380501的博客 140

挑战408——操作系统(15)——进程管理刷题(1)

本节刷题内容:进程管理 题库来源:408真题,王道教材,百度文库 涉及的知识点: 进程线程 进程状态转换 进程控制 进程通信 进程调度 基础概念 第一题 解析:在前面我们就强调,进程是运行中的程序,引入进程的目的就是为了动态的研究程序的运行状态。所以进程的动态性和程序的静态性是进程程序最根本的区别。不多说,课本原话。 第二题 解析:调度是操作系统的基本功能,几乎所有的计算机资源在使用前...

redAnt的博客 1009

挑战408——操作系统(12)——进程通信,管程介绍

PS:这部分内容考的比较少,了解实例就好 进程间的通信,要解决的问题是进程之间信息的交流问题。根据交流信息量的大小,我们将通信分为低级通信和高级通信两种。 低级通信中,进程中只能传递状态跟整数值,比如我们刚刚提到的PV操作。 高级通信中,进程能传递任意数量的数据,传递的信息大。 下面主要谈一些高级通信机制。 进程通信的类型 高级进程之间的通信机制主要分为三种: 共享存储器系统,消息传递系统,管道通...

redAnt的博客 1255

挑战408——操作系统(1)——介绍一下操作系统这个东西

在开篇我们提到过,操作系统的工作就相当于管理者的工作。操作系统是一种系统软件,它的任务是控制和管理计算机系统中的资源(包括硬件和软件资源)。控制是说系统要合理的组织和调度计算机的工作和资源的分配并且提供给用户和其他软件方便的接口环境。操作系统不是单一的程序,它是一个程序集合。 操作系统的特征 操作系统是一种系统软件,主要的特点有并发性,共享性,虚拟性,不确定性。 - 并发性。并发性是指两个或者两个...

redAnt的博客 1208

挑战408——操作系统(10)——信号量PV操作

处理同步互斥的问题,除了用到之前的软件和硬件的方法,用的最多的还是信号量机制。 信号量机制是通过定义表示共享资源使用的特殊变量以及两个标准的原语(P操作和V操作),来实现同步互斥的。 根据信号量的数据类型不同,我们将信号量分为整型信号量和记录型信号量。 整型信号量 整型信号量是一种被定义为用来表示资源数的整型量S,其值只能被wait和signal操作。S的初始值被设置为可访问的资源数的数量。当...

redAnt的博客 2174

试利用记录型信号量和pv操作写出_挑战408——操作系统(10)——信号量PV操作...

处理同步互斥的问题,除了用到之前的软件和硬件的方法,用的最多的还是信号量机制。 信号量机制是通过定义表示共享资源使用的特殊变量以及两个标准的原语(P操作和V操作),来实现同步互斥的。 根据信号量的数据类型不同,我们将信号量分为整型信号量和记录型信号量。整型信号量整型信号量是一种被定义为用来表示资源数的整型量S,其值只能被wait和signal操作。S的初始值被设置为可访问的资源数的数量。当用...

weixin_39849800的博客 582

27考研408操作系统强化指南:核心考点、PV操作内存管理实战

操作系统是计算机系统的核心,负责管理硬件资源并为应用程序提供运行环境。其核心原理包括进程管理、内存分配、文件系统和I/O控制,通过抽象和虚拟化技术,实现了多任务并发、内存高效利用和数据持久化存储。理解这些原理对于构建稳定、高效的软件系统至关重要,尤其在需要处理高并发、资源调度和性能优化的场景下,如服务器开发、嵌入式系统和分布式计算。在考研408的强化复习中,**进程同步互斥PV操作)** 和 **虚拟内存页面置换** 是两大核心难点高频考点。本文聚焦于如何将抽象的操作系统概念转化为具体的解题能力,针

weixin_30715523的博客 475

挑战408——操作系统(11)——多角度看生产者消费者问题

对于信号量的使用,主要是如何选择信号量和如何安排pv操作在程序中的位置。下面来分析一下经典的生产者消费者问题。教材的说法有点过于笼统了,我就用自己的语言来重新描述一遍。 生产者——消费者问题 问题描述:有两组进程共享一个环形的缓冲池,其中的一组进程称为生产者,另一组进程称为消费者。缓冲池由若干个大小相等的缓冲区组成,每一个缓冲区都可以容纳一个产品。生产者进程不断的将生产的产品放入到缓冲池中,消费者...

redAnt的博客 927

保研面试操作系统408简答攻略:从核心概念到实战应答

操作系统作为计算机系统的核心,其设计原理深刻影响着软件的性能可靠性。理解其核心机制,如进程线程的管理、内存的虚拟化以及文件系统的组织,是掌握计算机系统能力的基础。这些知识不仅具有重要的技术价值,更是构建高效、稳定应用系统的基石,在高并发服务器、数据库管理系统等关键应用场景中不可或缺。本文聚焦于保研面试中的高频考点,深入解析进程同步、内存管理等核心概念,并结合面试实战技巧,帮助读者将知识内化为应对挑战的能力,从容展现系统思维深度。

weixin_34262482的博客 442

挑战408——操作系统(6)——线程详解

20世纪80年代,人们提出了比进程更小,并能独立运行的基本单位——线程。如果说进程的目的是为了让多个程序彼此之间能够并发执行,那么引入线程就是为了减少并发执行所付出的时间和空间开销。从而使得操作系统具有更好的并发性。 线程的作用 由于进程是一个资源的拥有者,因此在进程的创建,撤销以及状态转换中都要付出巨大的时间和空间开销。因此系统中的进程都不宜过多(打开你们的任务管理器,运行的进程都能数出来),因...

redAnt的博客 668

大三考研规划:从C语言到408四大件,我的系统性学习路线

大家好,我是开发三明治,一名普通的双非三本院校计算机专业大三学生。和许多正在备考计算机考研408的同学们一样,我正站在人生的重要十字路口,希望通过自己的努力,实现学历和能力的双重提升。作为一名双非三本院校的计算机专业大三学生,我深知考研路上将面临诸多挑战。经过仔细思考,我制定了掌握C语言,再系统学习408专业课,同时兼顾统考课程的学习路线。这篇博客将分享我的具体规划,希望能给同样在考研路上的你一些参考。我是23级的本科生,我的本科背景并不出众,学校资源有限,同学中认真学习的氛围并不浓厚。

2504_94492961的博客 1055

猿创征文|在第一轮复习中,考研路上的成长历程

CSDN【猿创征文】第二季正式开启了。征文的文章内容要求,是记录自己在某一领域的技术成长历程,领域不限。想了许多天,有些犹豫,更有些不知怎么开始这一征文的书写。这一年,自己的技术成长历程,我在想,怕不是 C/C++ 语言?但仔细想想,实际上是对考研所需掌握的专业课知识点有了一定的成长进步。今年,较以往更为积极地参了 CSDN 创作活动,例如深读计划、竞赛等。CSDN 的 APP 的每日一练也不失为一种好的复习方式。

qq_34438969的博客 1188
上一篇: 挑战408——组成原理(6)——浮点数及其加减运算
下一篇: 挑战408——操作系统(10)——信号量与PV操作
gzhosp_redAnt
博客等级 码龄10年 702粉丝 269原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值