【进程管理】进程状态、前趋图、同步与互斥、调度、死锁、线程

计算机操作系统

1. 操作系统概述

  • 操作系统的作用:通过资源管理提高计算机系统的效率,改善人机界面向用户提供友好的工作环境。
  • 操作系统的特征:并发性、共享性、虚拟性、不确定性。
  • 操作系统的功能:进程管理、存储管理、文件管理、设备管理、作业管理
  • 操作系统的分类:批处理操作系统、分时操作系统 (轮流使用CPU工作片) 、实时操作系统 (快速响应)、网络操作系统、分布式操作系统 (物理分散的计算机互联系统)、微机操作系统 (即个人计算机操作系统Windows)、嵌入式操作系统
  • 计算机启动的基本流程为:BIOS -> 主引导记录 -> 启动操作系统
    【BIOS】计算机通电后,首先会进行基本输入输出系统(Basic Input/Output System)的自检。BIOS是存储在主板上的一组固件程序,其目的是检测并初始化计算机的硬件设备,例如处理器、内存、硬盘等。BIOS还负责寻找并加载存储在主引导记录中的引导加载程序。
    【主引导记录】主引导记录中包含了引导加载程序的代码,以及用于定位和加载操作系统的信息。当BIOS完成自检后,它会将控制权转移给主引导记录,并开始执行引导加载程序。

2. 进程的组成和状态

  • 进程的组成:进程控制块PCB(唯一标志着一个程序)、程序(描述进程要做什么) 、数据(存放进程执行时所需数据)。

  • 进程的状态(三态)🔥 :系统自动控制时的三种状态
    在这里插入图片描述
    运行状态:处于运行状态的进程占用CPU资源,正在执行计算机程序的指令
    就绪状态:处于就绪状态的进程已经获得了除了CPU以外的所有必需资源正等待系统分配CPU资源
    阻塞状态:处于阻塞状态的进程不占用CPU资源等待某个事件的发生,如等待外部输入/输出完成、等待某个资源的释放等。当所等待的事件发生时,进程将转移到就绪状态,等待CPU的调度。

  • 五态:多了两种状态“静止就绪”和“静止阻塞”,需要人为的操作才会进入对应状态,活跃就绪即就绪,活跃阻塞即等待。当人为干预后,进程将被挂起,进入静止状态,此时,需要人为激活,才能恢复到活跃状态。

3. 前趋图🔥

用来表示哪些任务可以并行执行哪些任务之间有顺序关系
如下前趋图可知:A B C可以并行执行,但是必须A B C都执行完后,才能执行D,这就确定了两点:任务间的并行、任务间的先后顺序。
在这里插入图片描述

4. 进程资源图🔥

用来表示进程与资源之间的分配和请求关系。

  • R表示资源(resource),P表示进程(progress)
  • R方框中有几个圆圈表示有几个这种资源
  • 对于进程来说,如果箭头是进来的资源,表示进程拥有它(资源分配给了该进程);如果箭头是出去的资源,表示进程还需要该资源才可以执行。

如下图所示,R1方框中有两个圆圈则表示有两个R1资源,R2方框中有三个圆圈则表示有三个R2资源。

R1的箭头指向P1,说明P1拥有一个R1(R1有一个资源已经分配给了P1);P1的箭头指向R2,说明P1需要一个R2资源才可以执行。那P2呢?P3呢?
在这里插入图片描述

  • 阻塞节点:某进程所请求的资源已经全部分配完毕,无法获取所需资源,该进程被阻塞了无法继续。
    如上图中P2就是阻塞节点。因为P2进程还需要R1资源才可以执行,可是R1的两个资源都被分配完了(被P1、P3占有),所以P2进程无法获取R1资源,进程阻塞了无法继续,除非P1或者P3释放R1资源。
  • 非阻塞节点:某进程所请求的资源还有剩余,可以分配给该进程继续运行。
    如上图中P1、P3就是非阻塞节点。因为P1还需要一个R2资源,而R2资源只被分出去了两个,还剩下一个,可以分配给P1进程继续执行;而P3也需要一个R2资源,同样的道理。
  • 当一个进程资源图中所有进程都是阻塞节点时,即陷入死锁状态。以上图并不会进入死锁状态,因为只要R1资源被释放了后,就P2进程就可以继续执行,所有进程都可以执行完。

🍉 【例题】在如下图所示的进程资源图中,( );该进程资源图是( )。

在这里插入图片描述

【第一空】
A、P1、P2、P3都是阻塞节点
B、P1是阻塞节点、P2、P3是非阻塞节点
C、P1、P2是阻塞节点、P3是非阻塞节点
D、P1、P2是非阻塞节点、P3是阻塞节点

【第二空】
A、可以化简的,其化简顺序为P1->P2->P3
B、可以化简的,其化简顺序为P3->P1->P2
C、可以化简的,其化简顺序为P2->P1->P3
D、不可以化简的,因为P1、P2、P3申请的资源都不能得到

【解析】C;B

能否化简的意思是所有进程能否执行完,化简顺序即为执行顺序,执行顺序自然是从非阻塞节点P3开始执行,由于P3进程需要一个R3资源,而R3资源还没有被分配完,P3同时占用一个R1资源和一个R2资源,所以执行完P3进程后,可以将所有资源释放掉。P1需要一个R2资源,P3释放的R2资源可以给到P1,P1可以执行。P2需要一个R1资源,P3释放的R1资源可以给到P2,P2可以执行。但P3肯定是先执行的,P1、P2的顺序随意。

5. 同步与互斥

  • 互斥:临界资源在同一时间内只能由一个任务单独使用,使用时需要加锁,使用完后解锁才能被其他任务使用。
    【解释】互斥是同步的一种特殊形式,它用于保护共享资源,使得在同一时间只有一个进程或线程可以访问该资源。互斥的目的是确保共享资源不会被多个进程同时访问和修改。如打印机只能用来打印某份文件,而不能同时打印多份文件。

  • 同步:同步是指多个进程之间协调执行的机制,它确保这些进程或线程按照一定的顺序和规则执行,以避免数据混乱和冲突的问题。
    【解释】同步关注的是进程之间的合作和执行顺序,避免数据混乱;而互斥用于限制并发访问共享资源,避免冲突和竞争条件。

  • 临界资源:各进程间需要以互斥方式对其进行访问的资源。
    【解释】临界资源是指在多个并发执行的进程中被共享的一种资源,如内存、文件、打印机等。临界资源的特点是同一时间只能被一个进程访问,其他进程需要等待当前进程释放该资源后才能访问

  • 临界区:指进程中对临界资源实施操作的那段程序。本质是一段程序代码。
    【解释】临界区是指一段在同一时间只允许一个进程执行的代码区域,用于控制对于共享资源的访问,确保在一个进程进入临界区之后,其他进程必须等待,直到该进程退出临界区,从而避免数据的混乱和错误。eg:假设有两个进程同时对一个共享变量进行操作,如果没有临界区的控制,那么它们可能会同时读取和修改这个变量,导致互相之间的操作产生冲突和错误的结果。

  • 互斥信号量:对临界资源采用互斥访问,使用互斥信号量后其他进程无法访问,初值为1。
    【解释】互斥信号量是一个二进制信号量,它只能取两个值:0和1。它用于保护临界资源(如共享内存或文件),以确保一次只能有一个进程访问该资源。当一个进程想要访问共享资源时,它会先检查互斥信号量的值。如果互斥信号量为1,表示资源没有被占用,进程可以将互斥信号量设置为0,然后访问资源。如果互斥信号量为0,表示资源已经被占用,进程必须等待,直到互斥信号量变为1才能访问资源。

  • 同步信号量:对共享资源的访问控制,初值一般是共享资源的数量。
    【解释】同步信号量的初始值是共享资源的数量。当一个进程请求访问共享资源时,同步信号量的计数器会减少。如果计数器大于零,表示还有可用的资源,进程可以继续执行。如果计数器为零,表示当前没有可用资源,进程将会被阻塞,直到有其他进程释放了资源,使计数器大于零。

6. 信号量操作

  • 信号量的本质?
    信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于0时,表示当前可用资源的数量;当它的值小于0时,其绝对值表示等待使用该资源的进程个数。注意,信号量的值仅能由PV操作来改变。

  • 信号量机制的功能?
    进程间通信处理同步互斥的机制。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

  • 什么是信号量操作(PV操作)?
    PV操作是由P操作和V操作,针对信号量进行相应的操作。

  • P(S):S表示信号量的值,P表示P操作,执行一次P操作意味着请求分配一个资源

  1. 申请资源,将信号量S的值减1,即S = S-1;
  2. 若S<0,无可用资源,则该进程为阻塞状态 ,并将其插入阻塞队列;
  3. 若S>=0,当前有可用资源,则该进程继续执行;
  • V(S):S表示信号量的值,V表示V操作,执行一次V操作意味着释放一个资源
  1. 释放资源,将信号量S的值加1,即S = S+1;
  2. 若S>0,则执行V操作的进程继续执行;( 当信号量的值大于0,表示有可用资源,那么表示信号量的资源足够进程进行申请,就不需要将进程进行放入到阻塞队列中)
  3. 若S<=0,则释放阻塞队列中的第一个等待信号量的进程;(当信号量小于0的时候,表示还有其他的进程是已经进行了申请信号量的操作,而只是之前是无法满足进程获取资源的)
    在这里插入图片描述

【经典问题】生产者与消费者的问题

  • 生产者和消费者对缓冲区互斥访问是互斥关系,同时生产者和消费者又是同步关系,只有生产者生产之后,消费者才能消费。
  • 三个信号量::互斥信号量S0 (仓库独立使用权)、同步信号量S1 (仓库中的空闲个数)、同步信号量S2 (仓库商品个数)。
    仓库独立使用权指的是生产者在使用仓库的时候,消费者就不能够使用。 假设当前有100个商品,如果仓库里面一个商品都没有,那么S1仓库空闲个数就是100,S2仓库商品个数就是0,而互斥信号量S0的初值就是1。
//生产流程
 prodect(){
        while(true) {
            首先,生产者生产一个商品S,生产完要放到仓库里面,要放进去,先要有仓库
            
            p(S0);		//申请仓库独立使用权
            p(S1);		//再判断仓库里面是否有空闲,申请一个仓库的空闲的地方存放商品
            
            把商品放入仓库中,放进去后商品的数量就多了一个
            
            v(S2)	    //释放掉该商品的数量
            v(S0)		//释放掉仓库独立使用权
//消费流程
comsumer() {
        while(1) { 
            p(S0);    //消费者要从仓库里取商品,要先申请仓库的独立使用权
            p(S2);	  //要消费商品就要看仓库里面有没有这个商品,申请看S2仓库商品个数
            
            取出一个商品
            
            v(S1);   //取出商品后,仓库中的空闲个数就增加了
            v(S0);	 //最后把仓库的独立使用权释放掉
        }

🍉 【例题】进程P1、P2、P3、P4和P5的前趋图如下图所示,若用PV操作控制进程P1、P2、P3、P4和P5并发执行的过程,则需要设置5个信号S1、S2、S3、S4和S5,且信号量S1~S5的初值都等于零。下图中a和b处应分别填( ); c和d处应分别填写( );e和f处应分别填写 ( ) 。

在这里插入图片描述
在这里插入图片描述
【第一空】
A.V (S1) P (S2) 、V (S3)
B.P (S1) V (S2) 、V (S3)
C.V (S1) V (S2) 、V (S3)
D.P (S1) P (S2) 、V (S3)

【第二空】
A.P (S2) 和 P (S4)
B.P (S2) 和 V (S4)
C.V (S2) 和 P (S4)
D.V (S2) 和 V (S4)

【第三空】
A.P(S4) 、V (S4) V (S5)
B.V(S5)、 P (S4) P (S5)
C.V(S3)、 V (S4) V (S5)
D.P(S3)、 P (S4) V (P5)

【解析】C; B; B
信号量主要是控制同步和互斥的,同步和互斥是由这些线控制的,而前趋图中的箭头表示进程执行的先后顺序,所以前趋图中的线表示五个信号量。

  • 在前趋图中,P1执行完后释放了两个信号量,假设信号量是S1、S2。
  • 在PV操作图中,P1执行完得到a,P2执行完得到b,在P2执行之前,需要P(S1)申请一个S1信号量。所以很明显,上面那根线是S1信号量,下面的是S2信号量。a=P1执行完释放的信号量V (S1) V (S2)
  • P2执行完后会释放一个P4需要的信号量,假设是S3(后面求证),结合答案看也就只有V (S3)
  • 在前趋图可以看到,P3执行依赖于S2信号量,所以c会是P(S2),P3执行完后会释放一个信号量,假设是S4(后面求证),结合答案看,也就只有V (S4)
  • P4先申请到S3信号量后执行,执行后要释放S5信号量,所以e是V(S5)
  • 在前驱图中,P5要执行,需要S4、S5信号量,所以f是P (S4) P (S5)

在这里插入图片描述

🍉 【例题】进程P1、P2、P3、P4、P5和 P6 的前趋图如下所示,若用 PV 操作控制这6个进程的同步与互斥的程序如下,那么程序中的空1和空2处应分别为();空3和空4处应分别为();空5和空6应分别为()。
【第一空】
A. V (S1) V (S2) 和 P (S2)
B. P (S1) P (S2) 和 V (S2)
C. V (S1) V (S2) 和 P (S1)
D. P (S1) P (S2) 和 V (S1)

【第二空】
A. V (S3) 和 V (S5) V (S6)
B. P (S3) 和 V (S5) V (S6)
C. V (S3) 和 P (S5) P (S6)
D. P (S3) 和 P (S5) P (S6)

【第三空】
A. P (S6) 和 P (S7) V (S8)
B. V (S6) 和 V (S7) V (S8)
C. P (S6) 和 P (S7) P (S8)
D. V (S7) 和 P (S7) P (S8)

在这里插入图片描述
在这里插入图片描述
【解析】C; B; D

  • 明确每个空分别代表什么:1是P1执行完的结果、2是P2的执行条件、3是P3的执行条件、4是P3执行完的结果、5是P4执行完的结果、6是P6的执行条件
  • 回到前驱图看不同的进程的执行条件和执行结果
  • 整个过程,信号量一般是从S1开始编号的,但是哪条线代表哪个信号量并不明确,所以:先假设,后根据答案求证

🍉 【例题】假设某系统采用非抢占式优先级调度算法,若该系统有两个优先级相同的进程P1和P2,各进程的程序段如下所示,若信号量S1和S2的初值都为0。进程P1和P2并发执行后a、b和c的结果分别为: a= ( ),b=( ),c=( )。
在这里插入图片描述
【第一空】
A.6 B.7 C.10 D.13
【第二空】
A.4 B.6 C.9 D.10
【第三空】
A.4 B.6 C.10 D.13

【解析】如果是抢占式的系统,优先级高的进程可以抢占正在运行进程的CPU,把当前的进程给挤下去。如果是非抢占式的系统,就算你的优先级再高,你也只能等待它运行完释放CPU。题目中的进程处于非抢占式系统,而且两个进程优先级相同,不存在抢占资源的问题。

首先从P1程序段开始执行,a=1,a=a+1=2,V(S1)释放资源,而S1的初始值是0,所以S1=1,c=a+5=7,P(S2)是申请S2资源,而S2的初始值为0,还要申请资源,所以此时S2<0,无可用资源,进程阻塞。

执行P2程序段,b=2,b=2+1=3,P(S1)是要申请一个资源,而在P1进程中,刚好释放了一个资源S1=1,所以这里可以申请到S1资源,继续执行程序,b=2+3=5,V(S2)是要释放一个S2资源,初始值S2=0,所以此时S2=1,继续执行并唤醒资源,继续执行P1程序段,a=a+c=14。

7. 死锁

当一个进程在等待永远不可能发生的事件时,就会产生死锁,若系统中有多个进程处于死锁状态,就会造成系统死锁。

死锁产生的四个必要条件🔥:

  • 资源互斥:互斥是共享的对立面,如果所有资源都是共享的,你也可以用,我也可以用,就不存在死锁的情况
  • 每个进程占有这个资源不释放,而且还等待其他资源(旧进程资源不释放,新进程得不到资源)
  • 进程资源图是一个环路

解决死锁的方法:(打破四大条件)

  • 死锁预防:采用某种策略限制并发进程对于资源的请求,破坏死锁产生的四个条件之使系统任何时刻都不满足死锁的条件
  • 死锁避免:一般采用银行家算法🔥来避免,银行家算法是提前计算出一条不会死锁的资源分配方法,才分配资源。相当于借贷,考虑对方还得起才借钱,提前考虑好以后,就可以避免死锁。操作系统就是一个银行家,它有很多资源,也有很多进程向他申请资源,所以操作系统必须管控好这些资源,避免造成死锁。
  • 死锁检测:允许死锁产生,但系统定时运行一个检测死锁的程序,若检测到系统中发生死锁,则设法加以解除。
  • 死锁解除:即死锁发生后的解除方法,如强制剥夺资源,撤销进程等。
  • 死锁计算问题:系统内有n个进程,每个进程都需要R个资源,那么其发生死锁的最大资源数为n*(R-1)。其不发生死锁的最小资源数为n*(R-1)+1。

🍉 【例题】 某系统中有3个并发进程竞争资源R,每个进程都需要5个R,那么至少有( )个R,才能保证系统不会发生死锁。
A.12
B.13
C.14
D.15

【解析】B。每个进程需要5个R才能执行,假设现在每个进程有4个资源R,也就是每个进程现在都有3*4=12个R,当有12个进程的时候,这三个进程都不能执行,所以12是会发生死锁的最大资源数,即这个情况下是死锁,加一个后就不会发生死锁。

🍉 【例题】假设系统中有三类互斥资源R1、R2和R3,可用资源数分别为10、5和3。在T0时刻系统中有P1、P2、P3、P4和P5五个进程,这些进程对资源的最大需求和已分配资源数如下表所示,此时系统剩余的可用资源数分别为( )。如果进程按( )序列执行,那么系统状态是安全的。
在这里插入图片描述

【第一空】
A.1、1和0
B.1、1和1
C.2、1和0
D.2、0和1

【第二空】
A.P1一P2一P4一P5一P3
B.P5一P2一P4一P3一P1
C.P4一P2一P1一P5一P3
D.P5一P1一P4一P2一P3

【解析】D

已知R1、R2和R3的可用资源数分别为10、5和3。计算得到已分配的资源R1、R2、R3分别是8、5、2,所以此时系统剩余的可用资源数分别为2、0、1。

  • 如果系统先从P1进程开始执行,P1对R1、R2、R3资源的需求量分别是5、3、1,而这时候只分配了1、1、1,还需要4、2、0个R1、R2、R3资源才可以执行,但这时分别只有2、0、1个R1、R2、R3,不够分配。
  • 如果系统先从P5开始执行,P5对R1、R2、R3资源的需求量分别是2、1、1,已分配资源数分别是1、1、0,还需要1、0、1个R1、R2、R3资源才可以执行,而此时系统剩余的可用资源数2、0、1,刚好满足;P5执行完会释放资源1、1、0,所以此时系统剩余的资源回事3、1、1,再执行P2,还需要1、1、0个资源,3、1、1个可用资源满足…

8. 线程

  • 传统的进程有两个属性:可拥有资源的独立单位、可独立调度和分配的基本单位。
  • 🔥线程是独立调度的最小单位,进程是拥有资源的最小单位。
  • 线程可以共享进程的公共数据、全局变量、代码、文件等资源,但不能共享线程独有的资源,如线程的栈指针等标识数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值