OS复习——进程管理

OS复习——进程管理

1. 进程与线程的基本概念

1.1 并发与并行的区别

  • 并发:设有两个活动a1和a2,如果在某一指定的时间t,无论a1和a2是在同一处理机上还是在不同的处理机上执行,只要a1和a2都处在各自的起点和终点之间的某一处,则称a1和a2是并发执行的。
  • 并行:如果考虑两个程序,它们在同一时间度量下同时运行在不同的处理机上,则称这两个程序是并行执行的。
  • 并发可能是伪并行,也可能是真并行。

1.2 进程与程序的区别

  • 进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移;而程序通常对应着文件、静态和可以复制。
  • 进程是暂时的,程序是永久的:进程是一个状态变化的过程,程序可长久保存。
  • 进程与程序的组成不同:进程的组成包括程序、数据和进程控制块(即进程状态信息)。
  • 进程与程序的对应关系:通过多次执行,一个程序可对应多个程序;通过调用关系,一个进程可包括多个程序。

1.3 进程的三个基本状态

  • 进程的三种基本状态
    • 就绪状态:等待处理机的状态。该进程运行所需的一切资源(不包括处理机)都得到满足,但因处理机个数少于进程个数,所以该进程不能运行,而必须等待分配处理及资源,一旦获得处理机就立即投入运行。
    • 执行状态:进程正在处理机上运行的状态,该进程已获得必要的资源,也获得了处理机,用户程序正在处理机上运行。
    • 阻塞状态:进程等待某种事件完成(例如等待I/O操作的完成)而暂时不能运行的状态,处于该状态的进程不能参与竞争处理机。
  • 状态转换
    • 就绪—>运行
      • 进程调度程序根据调度算法(如优先级或时间片规定)把处理机分配给某个就绪进程,建立该进程运行状态标记,并把控制转到该进程,把他由就绪状态变为运行状态。
    • 运行—>就绪
      • 一个正在运行的进程,由于规定的运行时间用完而使系统发出超时中断请求,超市中断处理程序把该进程的状态修改为就绪状态,并根据其自身的特性而插入就绪队列的适当位置,保存进程现场信息,收回处理机并转入进程调度程序。
      • 运行进程被中断,因为这一高优先级进程处于就绪状态
    • 运行—>阻塞
      • 当进程在等待某个事件时,由运行状态变成阻塞状态,标记阻塞原因,保留当前进程现场信息,然后将控制转给进程调度程序,再由进程调度程序根据调度算法把处理机分配给处于就绪状态下的其他进程。可能需要等待的事件有:
        • 当一进程所需的资源必须等待时
        • OS尚未完成服务
        • 对一资源的访问尚不能进行
        • 初始化I/O且必须等待结果
        • 等待某一进程提供输入
    • 阻塞—>就绪
      • 当所等待的事件发生时,被阻塞的进程在其被阻塞的原因获得解除后,需要通过进程调度程序统一调度才能获得处理机,于是将其阻塞状态变成就绪状态继续等待处理机。仅当进程调度程序把处理机再次分配给它时,才可恢复曾被中断的现场继续运行。

在这里插入图片描述

1.4 进程的控制原语

  • 原语通常由若干条指令所组成,用来实现某个特定的操作。通过一段不可分割的或不可中断的(当不考虑高级中断时)程序实现其功能。原语是操作系统核心(不是由进程而是由一组程序所组成)的一个组成部分,它必须在管态(内核态,通常把它作为操作系统执行时的程序状态)下执行,且常驻内存。
  • 原语系统调用都能被进程所调用,两者的差别在于原语有不可中断性,原语是通过在其执行过程中关闭中断实现的,且一般由系统进程调用;而系统调用的功能可用目态(通常把它作为用户程序执行时的状态)下运行的程序调用,借助中断进入管态程序,然后转交给相应的系统进程实现其功能。
  • 创建原语:创建一个新的子进程时,父进程要通过创建原语完成创建一个新的子进程的功能,进程的存在是以其进程控制块为标志的,创建一个新进程的主要任务就是为进程建立一个进程控制块PCB,将调用者提供的有关信息填入该PCB中。创建一个新进程,首先要根据建立的进程名查找PCB表,若找到了则非正常终止(即已有同名进程),否则,申请分配一块PCB空间;若进程的程序不在内存中,则应将它从外存调入内存,然后将有关信息(进程名、各信号量和状态位等)分别填入PCB的相应栏目中,并将PCB链接到PCB链中。
    • Fork()函数:在语句fpid=fork()之前,只有一个进程在执行这段代码,但在这条语句之后,就变成了两个进程在执行了。在fork函数执行完毕后,如果创建新进程成功,则出现两个进程,一个是子进程,一个是父进程。在子进程中,fork函数返回0,在父进程中,fork返回新创建子进程的进程ID。我们可以通过fork返回的值来判断当前进程是子进程还是父进程。fork可以做到仅仅被调用一次,却能够返回两次。其实就相当于链表,进程形成了链表,父进程的fpid指向子进程的进程id,因为子进程没有子进程,所以其fpid为0。
  • 撤销原语:根据提供的欲被撤销进程的名称,在PCB链中查找对应的PCB,若找不到要撤销的进程名或该进程尚未停止,则转入异常终止作业处理,否则从PCB链中撤销该进程及其所有子孙进程(因为仅撤销该进程可能导致其子程序与进程家族隔离开来,而成为难以控制的进程)。检查一下此进程是否有等待读取的信息,有则释放所有缓冲区,最后释放该进程的工作空间和PCB空间,以及其他资源。撤销原语撤销的是标志进程存在的进程控制块PCB,而不是进程的程序段。
  • 阻塞原语:首先中断处理机,停止进程运行,将CPU的现行状态存放到PCB的CPU状态保护区中,然后将该进程置阻塞状态,并把它插入到等待队列中。
  • 唤醒原语:把除了处理机之外的一切资源都得到满足的进程置为就绪状态。执行时,首先找到被唤醒进程的内部名,让该进程脱离阻塞队列。将现行状态改变为就绪状态,然后插入就绪状态等待调度运行。

1.5 进程的组成:程序、数据、PCB

  • 进程的结构特征:程序段、数据段、进程控制块PCB
  • 一个进程应该包括程序的代码,程序的数据,PC中的值(用来指示下一条将运行的指令),一组通用的寄存器的当前值、堆、栈和一组系统资源(如打开的文件)。

1.6 线程的概念

​ 进程包含了两个概念:资源拥有者和可执行单元。现代操作系统将资源拥有者成为进程,可执行单元称为线程。通常一个程序都有若干个线程,至少需要有一个线程。线程将资源与计算分离,提高并发效率。

​ 线程是进程中的一个实体,是被系统独立调度和分配的基本单位。线程基本上不拥有系统资源,只拥有一些在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但它可与同属一个进程的其他线程共享进程所拥有的全部资源。

1.7 进程与线程的区别

  • 调度:在引入线程的操作系统中,则把线程作为调度和分配的基本单位,而把进程作为资源拥有的基本单位。在同一进程中,线程的切换不会引起进程的切换,在由一个进程中的线程切换到另一个进程中的线程,将会引起进程的切换。线程不能单独执行,但是每一个线程都有程序的入口、执行序列以及程序出口,线程必须组成进程才能被执行
  • 并发性线程执行过程之中很容易进行协作同步,而进程需要通过消息通信进行同步。线程的划分尺度更小,并发性更高。
  • 拥有资源进程是拥有资源的一个独立单位,它可以拥有自己的资源线程基本上不拥有资源,只有必不可少的少量资源,所有线程共享其所属进程的所有资源与代码,同时每个线程都有自己的堆栈。
  • 系统开销:在进行进程切换时,涉及当前进程整个CPU环境的保存,以及新被调度运行的进程的CPU环境的设置。而线程切换只需保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作。进程切换的开销也远大于线程切换的开销

2. 进程同步

2.1 临界资源、临界区

  • 临界资源:某段时间内只允许一个进程使用的资源称为临界资源,如打印机、共享变量。
  • 临界区:对临界资源进行访问的程序片段称为临界区。(使两个进程不同时处于临界区可以避免竞争)。

2.2 原子性

​ 一组事务操作要么都做,要么都不做。

2.3 同步、互斥

  • 进程同步:进程间的必须相互合作的协同工作关系,有前后次序的等待关系称为进程同步。
  • 进程互斥:两个并行的进程,如果当其中一个进程进行某个操作时,另一个进程不能做这个操作,进程间的这种限制条件称为进程互斥。

2.4 信号量、PV操作

2.5 管程的基本概念

2.6 进程间通信的基本方法

3. 进程调度算法

3.1 调度的三个类型

简单了解即可

  • 高级调度(又称为宏观调度、作业调度):从用户工作流程的角度,一次提交的若干个作业,对每个作业进行调度。
  • 中级调度:内外存交换,指令和数据必须在内存里才能被CPU直接访问。从存储器资源的角度,将进程的部分或全部换初到外存上,将当前所需部分换入到内存。
  • 低级调度(又称为微观调度、进程或线程调度):从CPU资源的角度,执行的单位,时间上通常是毫秒。

3.2 进程调度算法

3.2.1 非抢占式、抢占式

  • 非抢占式:一旦处理器分配给一个进程,它就一直占用处理器,直到该进程自己因调用原语操作或等待I/O等原因而进入阻塞状态,或时间片用完才让出处理器,重新进行。
  • 抢占式:就绪队列中一旦有优先级高于当前运行进程优先级的进程存在时,便立即进行进程调度,把处理器转给优先级高的进程。

3.2.2 评价指标

  • 周转时间、带权周转时间、平均周转时间、带权平均周转时间
    • 周转时间:作业从提交到完成(得到结果)所经历的时间。周转时间=完成时刻-提交时刻
    • 带权周转时间周转时间/执行时间
    • 平均周转时间作业周转时间之和/作业数
    • 带权平均周转时间(T/Ts)作业带权周转时间之和/作业数
  • 吞吐量:单位时间内所完成的作业数,吞吐量=作业数/总执行时间。平均周转时间不是吞吐量的倒数,因为并发执行的作业在时间上可以重叠。
  • 响应时间:用户输入一个请求到系统给出首次响应的时间——分时系统

3.2.3 常见调度算法

  • 先来先服务(FCFS):FCFS调度算法按照进程就绪的先后顺序来调度进程,分派CPU。在非抢占方式中,当前作业或进程占用CPU,直到执行完或阻塞,才出让CPU。FCFS比较有利于长作业和COU繁忙的作业,不利于短作业和I/O繁忙的作业。
  • 短作业优先(SJF):对预计执行时间短的作业(进程)优先分派处理机。通常后来的短作业不抢先正在执行的作业。SJF的优点是比FCFS改善平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量;缺点是对长作业非常不利,可能长时间得不到执行,而且而能依据作业的紧迫程度来划分执行的优先级,难以准确估计作业(进程)的执行时间,从而影响调度性能。
  • 最高响应比优先(HRRF):在每次选择作业投入运行时,先计算后备作业队列中每个作业的响应比RP(相应优先级),然后选择其值最大的作业投入运行。RP定义为:RP=(已等待时间+要求运行时间)/要求运行时间。HRRF算法优点是短作业容易得到较高的响应比,长作业等待时间足够长后,也将获得足够高的响应比,且饥饿现象不会发生;缺点是每次计算各道作业的响应比会有一定的时间开销,性能比SJF略差。
  • 优先级调度:把处理机分配给就绪队列中具有最高优先级的就绪进程,适用于作业调度和进程调度。可分为抢占式和非抢占式,可见3.2.1。
    • 静态优先级:创建进程时就确定,直到进程终止前都不改变。可依据:
      • 进程类型:根据不同类型的进程确定其优先级,如系统进程比用户进程具有较高的优先级。
      • 对资源的需求:如对CPU和内存需求较少的进程,优先级较高。
      • 用户要求:紧迫程度和付费多少。
    • 动态优先级:在创建进程时赋予的优先级,在进程运行过程中可以自动改变,以便获得更好的调度性能。
      • 在就绪队列中,等待时间延长则优先级提高,从而使优先级较低的进程在等待足够的时间后,其优先级提高到可被调度执行。
      • 进程每执行一个时间片,就降低其优先级,从而一个进程持续执行时,其优先级降低到出让CPU。
  • 轮转调度:系统将所有就绪进程按FCFS原则排队,处理机总是优先分配给就绪队列中的第一个就绪进程,并分配它一个固定的时间片。当该运行进程用完规定的时间片,被迫释放处理机给下一个处于就绪队列中的第一个进程,分配给这个进程相同的时间片。每个运行完时间片的进程,当为遇到任何阻塞时,就回到就绪队列的尾部,并等待下次轮到它时再投入运行。
    • 当某个正在运行的进程的时间片尚未用完,而此时由于进程需要的I/O请求受到阻塞,这种情况下就不能把该进程送回就绪队列的尾部,而应把它送到相应阻塞队列。只有等它所需要的I/O操作完毕之后,才能重新返回到就绪队列的尾部。
  • 多级反馈队列算法:时间片轮转算法和优先级算法的综合和发展,优点是为提高系统吞吐量和缩短平均周转时间而照顾短进程,为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程,不必估计进程的执行时间,动态调节。
    • 设置多个就绪队列,分别赋予不同的优先级,每个队列执行时间片的长度也不同,规定优先级越低则时间片越长
    • 新进程进入内存后,先投入队列1的末尾,按“时间片轮转”算法调度;若按队列1一个时间未能执行完,则降低投入到队列2的末尾,同样按“时间片轮转”算法调度;如此下去,降低到最后的队列,则按“FCFS”算法调度直到完成。
    • 仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。
      在这里插入图片描述

4. 死锁问题

4.1 基本概念

  • 死锁:如果一个进程集合中的每个进程都在等待只能由该进程集合中其他进程才能引发的事件,那么该进程集合就是死锁的。
  • 活锁
  • 饥饿

4.2 产生死锁的必要条件

  • 互斥:指进程对所分配到的资源进行排他性使用,即在一段时间内某资源只能有一个进程占用。
  • 不可剥夺:指进程已获得的资源,在未使用完之前不能被强制剥夺,只能在使用完时由自己释放。
  • 请求和保持:进程因未分配到新的资源而受阻,但对已占有的资源又不释放。
  • 环路等待:存在进程的循环等待链,前一进程占有的资源正是后一进程所需求的资源,结果就形成了循环等待的僵持局面。

4.3 进程-资源图/资源分配图

  • 主要标记及含义
    • 圆形:进程
    • 方形:资源
    • 从资源节点到进程节点的有向边:资源已被进程占用
    • 从进程节点到资源节点的有向边:进程正在请求该资源

在这里插入图片描述

  • 适合每类资源只有一个的死锁检测,按照资源请求和释放的序列对图进行操作,并在每步操作后检查是否存在环,可用作分析是否存在死锁的工具。

4.4 处理死锁的方法

4.4.1 允许死锁发生

  • 鸵鸟算法:无所作为,无视死锁。
  • 死锁检测:根据资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。死锁检测算法主要是检查是否有循环等待。
    • 基于资源分配图——每类一个资源:可见4.3
    • 基于资源向量计算——每类多个资源
      • E(存在资源向量):表示各类资源存在的总量
      • A(可用资源向量):表示当前未分配可使用的资源数。
      • C(当前分配矩阵):第i个行向量对应第i个进程已经分配到的各类资源数量。
      • R(请求矩阵):第i个行向量表示进程i所需的资源数量
      • 资源向量(矩阵)算法
        • 寻找进程Pi,要求其在R矩阵中对应的第i行小于等于A
        • 如果找到,将C矩阵的第i行加入A,标记该进程执行完毕,转到前一步
        • 如果找不到,结束。
        • 算法结束时,如存在未标记进程,则他们为死锁进程。
  • 死锁解除
    • 资源抢占法:挂起一些占有资源的进程,剥夺它们的资源以解除死锁,将资源分配给另一个死锁进程使其能够执行完毕,然后再激活被挂起的进程。
    • 杀死进程法:杀死一个或者若干进程,释放其资源,直到打破死循环。尽可能杀死重新执行无副作用的进程。
    • 回滚法:设置检查点,根据死锁时所需要的资源,将一个拥有资源的进程滚回到一个未占用资源的检查点状态,从而使得其他死锁进程能够获得相应的资源。
      • 定期创建检查点,保存存储镜像和资源获取的状态和需要占用存储资源。
      • 检测到死锁后,恢复到资源未分配时的检查点,将资源分配给其他进程,继续执行。

4.4.2 不允许死锁发生

  • 死锁预防(静态deadlock avoidance):死锁预防是排除死锁的静态策略,它使产生死锁的
    四个必要条件不能同时具备,从而对进程申请资源的活动加以限制,以保证死锁不会发生。

    • 打破互斥条件:即允许进程同时访问某些资源。但是有的资源是不允许被同时访问,像打印机等等,这是资源本身的属性,但比如可以通过可脱机技术将独占资源共享。
    • 打破保持和请求条件:每个程序在运行之前,必须预先提出自己所要使用的全部资源,调度程序在该程序所需要的资源未得到满足之前,不让它们投入运行,并且当资源一旦分配给某个进程之后,那么在该进程的整个运行期间相应资源一直被它占有。
      • 但这种策略也有一些缺点:(a)在许多情况下,由于进程在执行时是动态的,不可预测的,因此不可能直到它所需要的全部资源;(b)资源利用率低。无论资源何时用到,一个进程只有在占有所需的全部资源后才能执行。即使有些资源最后才被用到一次,但该进程在生存期间却一直占有。这显然是一种极大的资源浪费;©降低进程的并发性。因为资源有限,又加上存在浪费,能分配到所需全部资源的进程个数就必然少了。
    • 打破不可抢占条件:即允许进程强行从占有者那里夺取某些资源。由于资源的独占特性,这种预防死锁的方法实现起来困难。例如,把正在打印输出进程的打印机抢占,可能会导致打印异常。
    • 打破循环等待条件:实行资源有序分配策略。即把资源事先分类编号,所有进程对资源的请求必须严格按资源序号递增的顺序提出,使进程在申请,占用资源时不会形成环路,从而预防了死锁。
      • 例如某种输入设备为1,打印机为2,磁带机为3,磁盘机为4……所有进程都只能严格地按照编号递增的次序去请求资源。也就是说,只有低编号的资源要求满足后,才能对高编号资源提出要求;释放资源时,应按编号递减的次序进行。
      • 这种策略与前面的策略相比,资源的利用率和系统吞吐量都有很大提高,但存在以下缺点:(a)限制了进程对资源的请求,同时给系统中所有资源合理编号也是件困难事,并增加了系统开销;(b)为了遵循按编号申请的次序,暂不使用的资源也需要提前申请,从而增加了进程对资源的占用时间。
  • 死锁避免(动态deadlock prevention):死锁的避免是排除死锁的动态策略,它不限制进程
    有关资源的申请,而是对进程所发出的每一个申请资源命令加以动态地检查(需要事先知道进程请求的所有资源),并根据检查结果决定是否进行资源分配。

    • 安全序列:所谓系统是安全的,是指系统中的所有进程能够按照某一种次序分配资源,并
      且依次地运行完毕,这种进程序列{P1,P2,…,Pn}就是安全序列。

    • 安全状态:如果状态没有死锁发生,并且即使所有进程突然请求对资源的最大需求,也仍然存在某种调度次序能够使得每一个进程运行完毕,则称该状态是安全状态。

    • 银行家算法

      • 算法思想:银行家通过检测贷款的金额是否可以收回,决定是否发放相应数额的贷款。银行家可以将有限的基金贷款给多个客户,而且所有客户申请贷款的综合可以大于银行家实际拥有的资金总额度,但要求每个客户申请的个体贷款额度不超过银行家的资金总额。通过合理的控制,银行家可以安全地收回所有贷款。

      • 算法元素

        • 可利用资源向量Available:一个含有m个元素,其中每一个元素代表一类可利用的资源数目,其初值是系统中所配置的该类全部可用资源数目。如果Available[j]=k,表示系统中现有Rj类资源k个。
        • 最大需求矩阵Max:一个含有n*m的矩阵,定义了系统中n个进程中的每一个进程对m类资源的最大需求。如果Max(i,j)=k,表示进程i需要Rj类资源的最大数目为k。
        • 分配矩阵Allocation:一个含有n*m的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数。如果Allocation(i,j)=k,表示进程i当前已分得Rj类资源k个。
        • 需求矩阵Need:一个含有n*m的矩阵,表示每一个进程尚需的各类资源数。如果Need(i,j)=k,表示进程i还需要Rj类资源k个,方能完成其任务。Need(i,j)= Max(i,j)-Allocation(i,j)
      • 算法步骤:Request[i,j]表示了进程pi此次提出申请的rj资源数目

        1. 如果Request[i,j]<=Need[i,j],则转2,否则出错;

        2. 如果Request[i,j]<=Available[j],则转3,否则表示系统中尚无足够的资源,pi必须等待;

        3. 尝试把要求的资源分配给进程pi,并修改下面数据:

        ​ Available[j]=Available[j]-Request[i,j];

        ​ Allocation[i,j]=Allocation[i,j]+Request[i,j];

        ​ Need[i,j]=Need[i,j]-Request[i,j];

        1. 执行安全性检查,检查此次资源分配之后,系统是否处于安全状态,即:是否所有进程都可完成,并归还资源。若安全,则正式分配资源给进程pi,完成本次分配;否则,将作废此次试分配,恢复原来的资源分配状态,让进程pi等待。
      • 安全性检查:

        1. 设置两个数组,一个表示在当前m类可用资源中,每一类资源的可用数目W[j]和n个进程完成状态值F[j]。

        2. 赋初值W[j]=Available[j],j=1,2,……,m;F[i]=false,i=1,2,……,n;当进程pi得到全部资源时,则F[i]=true。

        3. 从进程集合中找到能满足下列条件的pi进程(i=1,2,……,n):

          F[i]=false && Need[i,j]<=W[j]

          若找到了,则执行步骤4,否则执行步骤5

        4. 当pi获得资源后,则可执行直到完成,并释放其所拥有的资源,执行如下操作:

          W[j]=W[j]+Allocation[i,j];

          F[i]=true;

          转到步骤3执行

        5. 如果所有进程的F[i]=true,则表明系统处于安全状态。否则,处于不安全状态。

          F[i]=false && Need[i,j]<=W[j]

          若找到了,则执行步骤4,否则执行步骤5

        6. 当pi获得资源后,则可执行直到完成,并释放其所拥有的资源,执行如下操作:

          W[j]=W[j]+Allocation[i,j];

          F[i]=true;

          转到步骤3执行

        7. 如果所有进程的F[i]=true,则表明系统处于安全状态。否则,处于不安全状态。

以上部分内容引自课件和《操作系统使用教程(第三版)》,如有侵权,请及时联系我删除!

猜你喜欢

转载自blog.csdn.net/NickHan_cs/article/details/106556063
今日推荐