操作系统——进程管理

版权声明:转载请注明出处 https://blog.csdn.net/weixin_39918693/article/details/81541466

1、进程与线程

进程的概念和特征

引入进程的目的:以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性

为了使参与并发执行的程序(含数据)能独立地运行,必须为之配置一个专门的数据结构,称之为进程控制块(Process Control Block, PCB)

系统利用PCB来描述进程的基本情况和运行状态,进而控制和管理进程

由程序段、相关数据段和PCB三部分构成了进程映像(进程实体)

创建进程,实质上是创建进程映像中的PCB;而撤销进程,实质上是撤销进程的PCB

进程映像是静态的,进程则是动态的

PCB是进程存在的唯一标志,动态性是进程最基本的特征

进程是系统进行资源分配和调度的一个独立单位(注意对于资源一词的理解)


进程的状态与转换

运行状态就绪状态阻塞状态(等待状态)、创建状态、结束状态

前三种是进程的`基本状态

不同状态之间的转换(理解记忆)

一个进程从运行状态变变成阻塞状态是一个主动的行为;而从阻塞状态变到就绪状态是一个被动的行为,需要其他相关进程的协助


进程控制

进程控制的主要功能是对系统中所有的进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能

在操作系统中,一般把进程控制用的程序段称为原语,原语的特点是执行期间不允许中断,它是一个不可分割的基本单位

允许一个进程创建另一个进程。子进程可以继承父进程所拥有的资源。当子进程别撤销时,应将其从父进程那里获得的资源归还给父进程。此外,在撤销父进程时,也必须同时撤销其所有的子进程

新进程的创建过程(创建原语):主要是PCB的申请(并初始化其中的信息)和资源的分配

进程的终止步骤(撤销原语):主要是资源的释放

Block原语Wakeup原语是一对作用刚好相反的原语,必须成对使用。Block原语是由被阻塞进程自我调用实现的,而Wakeup原语则是由一个与被唤醒进程相合作或被其他相关的进程调用实现的

任何进程都是在操作系统内核的支持下运行的,是与内核紧密相关的

进程的切换是指处理机从一个进程的运行转到另一个进程上运行,这个过程中,进程的运行环境产生了实质性的变化

进程切换处理机模式切换是不同的

进程的环境信息:??????

调度切换的区别:调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换


进程的组织

进程是操作系统的资源分配独立运行的基本单位

进程创建时,操作系统就新建一个PCB结构,它之后就常驻内存,任一时刻可以存取,在进程结束时删除。PCB是进程实体的一部分,是进程存在的唯一标志

PCB主要包括进程描述信息进程控制和管理信息资源分配清单处理机相关信息

在操作系统中存在着很多进程,这些进程的PCB都是通过相应的方式(链接方式或索引方式)组织起来的

程序段就是进程在执行的时候,所执行的程序代码段

程序可以被多个进程共享,即多个进程可以运行同一个程序;一个进程也可以对应多个程序

数据段是进程对应的程序加工处理的原始数据和所获得的中间或最终结果


进程的通信

进程通信是指进程之间的信息交换

PV操作是低级通信方式;高级通信方式是指以较高的效率传输大量数据的通信方式

高级通信方式主要有三类:共享存储消息传递管道通信

在通信的进程之间存在一块可直接访问的共享空间,通过对这片共享空间进行写/读操作实现进程之间的信息交换。在对共享空间进行写/读操作的时候,需要使用同步互斥工具(如P操作、V操作),对共享空间的写/读进行控制

低级方式的共享是基于数据结构的共享;高级方式的共享是基于存储区的共享

操作系统只负责为通信进程提供可共享使用的存储空间同步互斥工具,而数据交换则由用户安排写/读指令完成

用户进程空间一般都是独立的,进程运行期间一般不能访问其他进程的空间,要想让两个用户进程共享空间必须通过特殊的系统调用实现,而进程内的线程是自然共享进程空间的

进程之间也可以利用操作系统提供的消息传递方法实现进程通信。在消息传递系统中,进程间的数据交换是以格式化的消息(Massage)为单位的,在该系统中进程通过系统提供的发送消息原语接收消息原语进行数据交换

消息传递方式分为:直接通信方式和间接通信方式

管道是指用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件

为了协调双方的通信,管道机制必须提供以下三方面的协调能力:互斥同步确定对方的存在

从管道中读数据是一次性操作,数据一旦被读取,它就从管道中被抛弃,释放空间以便写更多的数据。

管道只能采用半双工同信,即某一时刻只能单向传输

要实现父子进程双方互动通信,需要定义两个管道

管道可以理解为是共享存储的优化和发展


线程概念和多线程模型

引入进程的目的:为了更好的使多道程序并发执行,以提高资源利用率和系统吞吐量,增加并发程度

引入线程的目的:为了减少程序在并发执行时所付出的时空开销,提高操作系统的并发性能

线程:轻量级进程,一个基本的CPU执行单元,也是程序执行流的最小单元

线程实体有线程ID线程控制块(程序计数器、寄存器集合、堆栈)组成

线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源(或只拥有一点在运行中必不可少的资源),但它可与同属一个进程的其他线程共享进程所拥有的全部资源

线程也有就绪阻塞运行三种基本状态

引入线程后,进程的内涵发生了改变,进程只作为除CPU以外系统资源的分配单元,线程则作为处理机的分配单元。由于一个进程内部有多个线程,如果线程的切换发生在同一个进程内部,则只需要很少的时空开销

同一进程内的多个线程共享进程的地址空间,所以这些线程之间的同步和通信非常容易实现,甚至无需操作系统的干预

线程的实现方式:用户级线程(User-Level Thread,ULT)内核级线程(Kernel-Level Thread,KLT)

用户级线程中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。应用程序可以通过使用线程库设计成多线程程序

在内核级线程中,线程管理的所有工作由内核完成,应用程序没有进程线程管理的代码,只有一个到内核级线程的编程接口

在一些系统中,使用组合方式的多线程实现

有些系统同时支持用户线程内核线程,由此产生了不同的多线程模型,即实现用户级线程和内核级线程的连接方式

多线程模型:多对一一对一多对多


2、处理机调度

处理机调度的概念

处理机调度是对处理机进行分配,就是从就绪队列中,按照一定的算法(公平、高效)选择一个进程并将处理机分配给它运行,以实现进程并发地执行

处理机调度是多道程序操作系统的基础,它是操作系统设计的核心问题

三级调度:

  • 作业调度:也称高级调度,按一定的原则从外存上处于处于后备状态的作业中挑选一个(或多个)作业,给它(们)分配内存、输入/输出设备等必要的资源,并建立相应的进程,以使它(们)获得竞争处理机的权利。是内存和外存之间的调度。对于每个作业只调入一次,调出一次
  • 中级调度:为了提高内存利用率和系统吞吐量而引入的。将暂时不能运行的进程,调至外存(挂起状态);在它们已具备运行条件且内存又稍有空闲时,由中级调度再将外存上已具备运行条件的就绪进程调入内存(就绪状态
  • 进程调度:也称低级调度,按照某种方法和策略从就绪队列中选取一个进程,将处理机分配给它。

多道批处理系统中大多配有作业调度,而其他系统中通常不需要配置作业调度

进程调度是操作系统中最基本的一种调度,在一般操作系统中都必须配置进程调度


调度的时机、切换与过程

进程调度程序进程切换程序是操作系统的内核程序

当请求调度的事件发生后,才可能会运行进程调度程序,当调度了新的就绪进程后,才会去进行进程间的切换

理论上上述三件事情应该顺序执行,但在实际设计中,在操作系统内核程序运行时,如果发生了引起进程调度的因素,并不一定能够马上进行调度与切换

现代操作系统中,不能马上进行进程的调度与切换的情况:

  • 1、在处理中断的过程中
  • 2、进程在操作系统内核程序临界区中时
  • 3、其他需要完全屏蔽中断的原子操作过程中

在上述过程中发生了引起调度的事件,并不能马上进行调度和切换,应置系统的请求调度标志,直到上述过程结束后才进行相应的调度与切换

应该马上进行进程调度与切换的情况:

  • 1、当发生引起调度的事件,且当前进程无法继续运行下去时(剥夺式的)
  • 2、当中断处理结束或自陷处理结束后,返回被中断进程的用户态程序执行现场前(非剥夺式的)

进程切换往往在调度完成后立刻发生,它要求保存原进程当前切换点的现场信息,恢复被调度进程的现场信息。现场切换时,操作系统内核将原进程的现场信息推入到它自己的内核堆栈来保存它们,并更新堆栈指针。在内核完成从新进程的内核栈中装入新进程的现场信息、更新当前运行进程空间指针、重设PC寄存器等相关工作后,开始运行新的进程


进程调度方式

进程调度方式是指当某一个进程正在处理机上执行时,若有优先权更高的进程进入就绪队列,此时应如何分配处理机

两种进程调度方式:

  • 非剥夺调度方式:实现简单、系统开销小,适用于大多数的批处理系统,但它不能用于分时系统和大多数的实时系统
  • 剥夺调度方式:可以提高系统的吞吐率和响应效率。剥夺遵循的原则:优先权短进程优先时间片原则

调度算法的评价准则

  • CPU利用率
  • 系统吞吐量:单位时间内CPU完成作业的数量
  • 周转时间:从作业提交到作业完成所经历的时间
  • 等待时间:进程处于等待处理机状态时间之和
  • 响应时间:从用户提交请求到系统首次产生响应所用的时间

设计调度程序的时候,一方面要满足特定系统用户的要求;另一方面要考虑系统整体效率;同时还要考虑调度算法的开销


典型的调度算法

先来先服务(FCFS)调度算法

既可用于作业调度也可以用于进程调度

属于不可剥夺算法

该算法的特点是:

  • 算法简单,但效率低
  • 对长作业比较有利,但对短作业不利(相对SJF和高响应比)
  • 有利于CPU繁忙型作业,而不利于I/O繁忙型作业
短作业优先(SJF)调度算法

不可剥夺算法

既可用于作业调度,也可以用于进程调度

特点:

  • 对长作业不利,长作业容易出现饥饿现象(饥饿现象是调度策略问题,死锁是系统环形等待
  • 未考虑作业的紧迫程度
  • 估计时间并不准确
  • 该算法的平均等待时间平均周转时间最少
优先级调度算法

既可用于作业调度,也可用于进程调度

非剥夺式优先级调度算法剥夺式优先级调度算法

根据进程创建后其优先级是否可以改变,进程优先级可以分为静态优先级动态优先级。它们各自有自己的确定依据

高响应比优先调度算法

该算法主要用于作业调度,其是对FCFSSJF的一种综合平衡

R P = +

时间片轮转调度算法

该算法主要用于分时系统

剥夺式算法

时间片的大小对系统性能的影响很大

时间片的长短通常由以下因素确定:系统的响应时间就绪队列中的进程数目系统的处理能力

多级反馈队列调度算法(集合了前几种算法的优点)

多级反馈队列调度算法时间片轮转调度算法优先级调度算法的综合和发展。通过动态调整进程的优先级时间片大小,多级反馈队列调度算法可以兼顾多方面的系统目标

优点:

  • 终端型作业用户:短作业优先
  • 短批处理作业用户:周转时间较短
  • 长批处理作业用户:经过前面几个队列得到部分执行,不会长期得不到处理

相关试题

进程处于临界区时,说明进程正在占用处理机,只要不破坏临界资源的使用规则,是不会影响处理机的调度的,即在不破坏临界资源使用规则的前提下,可以进行处理机的调度

甘特图的画法不只一种,要会根据题目选择合适的画法

在涉及到作业调度的时候一般不考虑中级调度

要注意理解关于中断时间计算的试题

使用最高相应比优先调度算法来进行进程调度的时候,每次有进程完成后,都要进行一次响应比的比较,以选出来占用处理机的进程


3、进程同步

进程同步的基本概念

在多道程序环境下,进程是并发执行的,不同进程之间存在着不同的相互制约关系。为了协调进程之间的相互制约关系,引入了进程同步的概念

同步就是协调多个进程之间的制约关系

一次(一段时间内)仅允许一个进程使用的资源称为临界资源

临界资源不仅仅指设备,还包括变量和数据

对临界资源的访问,必须互斥地进行,在每个进程中,访问临界资源的那段代码称为临界区(所以只有在临界区中才可以访问临界资源)

为了保证临界资源的正确使用,可以把临界资源的访问过程分成四个部分

  • 进入区:检查是否可进入临界区,如果可进入,应设置正在访问临界区的标志
  • 临界区
  • 退出区:清除正在访问临界区的标志
  • 剩余区:代码中的其余部分

同步,即直接制约关系,多个进程要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系

进程间的直接制约关系就是源于它们之间的相互合作

互斥,即间接制约关系,因使用临界资源而产生的制约关系

为禁止两个进程同时进入临界区,同步机制(这里的同步指的是协调,而不是直接制约关系)应遵循以下准则:

  • 空闲让进
  • 忙则等待
  • 有限等待
  • 让权等待

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

软件实现方法

软件方法:通过在进入区设置和检查一些标志来标明是否有进程在临界区,如果已有进程在临界区,则在进入区通过循环检查的方式进行等待,进程离开临界区后则在退出区修改标志

相关的算法有:

  • 1、单标志法:通过设置一个公用整型变量turn,用于指示被允许进入临界区的进程编号。该算法违背空闲让进的准则
  • 2、双标志法先检查:通过设置一个数据flag[i],来表示Pi进程是否进入临界区。该算法会违背忙则等待的准则
  • 3、双标志法后检查:该算法可能会出现饥饿现象
  • 4、Peterson's Algorithm:本算法是算法一和算法三的结合。利用flag解决临界资源的互斥访问,而利用turn解决饥饿现象
硬件实现方法

通过硬件支持实现临界段问题的方法称为低级方法元方法

CPU只在发生中断时引起进程切换(即CPU的切换是通过中断机制实现的)

当一个进程正在使用处理机执行它的临界区代码时,要防止其他进程再进入其临界区访问的最简单方法是禁止一切中断发生,称之为屏蔽中断关中断

TestAndSet指令:读出指定标志后把该标志设置为真。为每个临界资源设置一个共享布尔变量lock,表示资源的两种状态,true表示正在被占用

Swap指令:为每个资源设置一个共享布尔变量lock,在每个进程中再设置一个局部布尔变量key,用于与lock交换信息

以上对TestAndSetSwap指令的描述仅仅是功能实现,并非软件实现定义,事实上它们是由硬件逻辑直接实现的,不会被中断(原子操作)

通过硬件实现的方法有:

  • 1、中断屏蔽方法:该方法限制了处理机交替执行程序的能力,因此执行的效率将会明显降低
  • 2、硬件指令方法:TestAndSet指令和Swap指令

硬件方法的优点:适用于任意数目的进程,不管是单处理机还是多处理机;简单、容易验证其正确性。可以支持进程内有多个临界区,只需要为每个临界区设立一个布尔变量

硬件方法的缺点:进程等待进入临界区时要耗费处理机时间,不能实现让权等待(即忙等现象)。从等待进程中随机选择一个进入临界区,有的进程可能一直选不上,从而导致饥饿现象

以上的代码实现与我们平时在编辑器上写的代码意义不同,以上的代码实现是为了表述进程实现同步和互斥的过程,并不是说计算机内部实现同步互斥就是这些代码(可以理解为伪代码)


信号量

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

原语是指完成某种功能且不被分割不被中断执行的操作序列,通常可由硬件来实现完成不被分割执行的功能(也可通过软件方法来实现)

信号量的类型:

  • 整型信号量:一个表示资源数目的整型量。该机制并未遵循让权等待的准则,而是使进程处于忙等的状态
  • 记录型信号量:该机制遵循让权等待的准则

信号量可以实现的功能:

  • 利用信号量实现同步:设置一个公共信号量。如果某个行为要用到某种资源,那么在那个行为面前P那种资源一下;如果某个行为会提供某种资源,就在那个行为后面V那种资源一下
  • 利用信号量实现进程互斥:互斥的实现是不同进程对同一信号量进程P、V操作。P、V操作要紧紧夹着使用互斥资源的那个行为,中间不能有其他冗余代码
  • 利用信号量实现前驱关系

分析进程同步和互斥问题的方法步骤:p80


管程

系统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,而忽略了它们的内部结构和实现细节

管程:由一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块。这组操作能够初始化并改变管程中的数据和同步进程

管程的组成:

  • 1、局部于管程的共享结构数据说明
  • 2、对该数据结构进行操作的一组过程
  • 3、对局部于管程的共享数据设置初始值的语句

管程的基本特征:

  • 1、局部于管程的数据只能被局部于管程内的过程所访问
  • 2、一个进程只有通过调用管程内的过程才能进入管程访问共享数据
  • 3、每次仅允许一个进程在管程内执行某个内部过程

由于管程是一个语言成分,所以管程的互斥部分完全由编译程序在编译时自动添加,无需程序员关注(对程序员透明),而且保证正确


经典同步问题

注意分析问题的方法和步骤

生产者-消费者问题
semaphore mutex = 1; //临界区互斥信号量
semaphore empty = n;
semaphore full = 0;

producer(){
    while(1){
        produce an item in nextp;
        P(empty);
        P(mutex);
        add nextp to buffer;
        V(mutex);
        V(full);
    }
}

consumer(){
    while(1){
        P(full);
        P(mutex);
        remove an item from buffer;
        V(mutex);
        V(empty);
        consume the item;
    }
}

empty和full信号量P操作必须放在对mutex的P操作之前,不过释放信号量时的顺序没所谓(建议坚持一种写法)

读者-写者问题
//读进程优先的读者写者问题
int count = 0; //用于记录当前的读者数量
semaphore mutex = 1; // 用于实现更新count时的互斥
semaphore rw = 1;

writer(){
    while(1){
        P(rw);
        writing;
        V(rw);
    }
}

reader(){
    while(1){
        P(mutex);
        if(count == 0)
            P(rw);
        count++;
        V(mutex);
        reading;
        P(mutex);
        count--;
        if(count == 0)
            V(rw);
        V(mutex);
    }
}
//写者优先的读者写者问题(优先是相对的,称为读写公平法)
int count = 0;
semaphore mutex = 1;
semaphore rw = 1;
semaphore w = 1;

writer(){
    while(1){
        P(w);
        P(rw);
        writing;
        V(rw);
        V(w);
    }
}

reader(){
    while(1){
        P(w);
        P(mutex);
        if(count == 0)
            P(rw);
        count++;
        V(mutex);
        V(w);
        reading;
        P(mutex);
        count--;
        if(count == 0)
            V(rw);
        V(mutex);
    }
}

读者写者问题有一个关键特征,就是有一个互斥访问的计数器count,所以当遇到一个不太好解决的同步互斥问题的时候,尝试使用一下互斥访问的计算器count

哲学家进餐问题
semaphore chopstick[5] = {1, 1, 1, 1, 1};
semaphore mutex = 1; //设置取筷子的信号量

Pi(){
    do{
        P(mutex);
        P(chopstick[i]);
        P(chopstick[(i + 1) % 5]);
        V(mutex);
        eat;
        V(chopstick[i]);
        V(chopstick[(i + 1) % 5]);
        think;
    }while(1)
}

还可以使用AND型信号量机制来解决哲学家进餐问题

哲学家进餐问题的解决思想和贪心算法截然相反。贪心算法强调争取眼前认为最好的,而不会考虑后续会有什么后果;哲学家进餐问题不仅考虑眼前的一步,而且考虑下一步,只有一次能拿起两只筷子才做决定,这样可以避免死锁问题

吸烟者问题(不太重要)

相关试题

进程执行的前驱关系实质上是指进程的同步关系

P、V操作是一种低级的进程通信原语,它是不能被中断的

不能被任何进程修改的代码就是可重入代码(也叫纯代码),即允许多个进程同时访问的代码

管程的signal操作与信号量机制中的V操作不同。管程中的signal操作是针对某个条件变量的,如果不存在因该条件而阻塞的进程,则signal不会产生任何影响


4、死锁

死锁是指多个进程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进

进程陷入死锁状态

死锁产生的原因:

  • 1、系统资源的竞争:只有对不可剥夺资源的竞争才可能产生死锁,对可剥夺资源的竞争是不会引起死锁的
  • 2、进程推进顺序非法

死锁产生的必要条件(产生死锁必须同时满足以下四个条件,只要其中任一条件不成立,死锁就不会发生):

  • 1、互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有
  • 2、不剥夺条件
  • 3、请求和保持条件
  • 4、循环等待条件:存在一种进程资源的循环等待链,链中的每一个进程已获得的资源同时被链中下一个进程所请求

资源分配图含圈而系统又不一定有死锁的原因是同类资源数大于1。然若系统中每类资源都只有一个资源,则资源分配图含圈就变成了系统出现死锁的充分必要条件


死锁的处理策略

  • 1、预防死锁:设置某些限制条件,破坏产生死锁的四个必要条件中的一个或几个,以防止发生死锁
  • 2、避免死锁:在资源的动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁
  • 3、死锁的检测及解除:无需采取任何限制性措施,允许进程在运行过程中发生死锁。通过系统的检测机构及时地检测出死锁的发生,然后采取某种措施解除死锁

预防死锁避免死锁都属于事先预防策略

预防死锁的限制条件比较严格,实现起来较为简单,但往往导致系统的效率低,资源利用率低;避免死锁的限制条件相对宽松,资源分配后需要通过算法来判断是否进入不安全状态,实现起来较为复杂


死锁预防

破坏互斥条件:因为有的系统资源只能互斥使用,所以该方法不太可行

破坏不剥夺条件:该策略实现起来比较复杂。释放已获得的资源会造成前一阶段工作的失效,反复的申请和释放资源会增加系统开销降低系统吞吐量。这种方法常用于状态易于保存和恢复的资源

破坏请求和保持条件:采用预先静态分配方法,即进程在运行前一次申请完它所需要的全部资源,在它的资源未满足前,不把它投入运行。该方法实现简单,但系统资源被严重浪费

破坏循环等待条件:可采用顺序资源分配法。该方法会限制新类型设备的增加、造成资源浪费、为用户的编程带来麻烦


死锁避免

死锁避免:在资源分配过程中,防止系统进入不安全状态,以避免发生死锁。这种方法所施加的限制条件较弱,可以获得较好的系统性能

该方法允许进程动态地申请资源,但系统在进行资源分配之前,应先计算此次资源分配的安全性。若此次分配不会导致系统进入不安全状态,则将资源分配给进程;否则,让进程等待

安全状态:系统能按某种进程推进顺序,为每个进程分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺序地完成。此时称该中进程推进顺序为安全序列。如果系统无法找到一个安全序列,则称系统处于不安全状态

并非所有的不安全状态都是死锁状态,但当系统进入不安全状态后,便可能进入死锁状态;反之,只要系统处于安全状态,系统便可以避免进入死锁状态

银行家算法涉及的数据结构:

  • 可利用资源矢量Available:一个数组,某个元素值表示一类可用的资源的数目
  • 最大需求矩阵Max:最大需求
  • 分配矩阵Allocation:已分配的
  • 需求矩阵Need:还需要的

N e e d = M a x A l l o c a t i o n

安全性算法是银行家算法的核心部分

银行家算法的一般步骤:

  • 1、一般会有某个进程发起资源请求,资源请求向量为 R e q u e s t i ,其为数组
  • 2、判断 R e q u e s t i [ j ] N e e d [ i , j ] 是否成立,其中每个元素都必须成立,若成立,下一步;否则出错
  • 3、判断 R e q u e s t i [ j ] A v a i l a b l e [ i , j ] 是否成立,其中每个元素都必须成立,若成立,下一步;否则,该进程等待
  • 4、如果2和3都成立,则尝试着把资源分配给该进程,并更新Available、Allocation、Need这三个矩阵
  • 5、系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,才正式将资源分配给进程Pi,以完成本次分配;否则,将本次的试探分配作废,恢复原来的资源分配状态,让进程Pi等待

安全性算法的具体执行步骤p122


死锁检测和解除

资源分配图:从进程到资源的有向边叫请求边,表示该进程申请一个单位的该类资源;从资源到进程的边叫分配边,表示该类资源已经有一个资源被分配给了该进程

通过将资源分配图简化的方法来检测系统状态S是否为死锁状态。具体简化步骤见p123

S为死锁的条件是当且仅当S状态的资源分配图是不可完全简化的,该条件为死锁定理

死锁解除的主要方法:

  • 资源剥夺法
  • 撤销进程法
  • 进程回退法

猜你喜欢

转载自blog.csdn.net/weixin_39918693/article/details/81541466