• 计算机操作系统 第二章:进程 的描述与控制(2)


    目录

    2.3  进 程 控 制

    2.3.1  操作系统内核

    2.3.2  进程的创建

    2.3.3  进程的终止

    2.3.4  进程的阻塞与唤醒

    2.3.5  进程的挂起与激活

    2.4 进 程 同 步

    2.4.1 进程同步的基本概念

    2.4.2  硬件同步机制

    2.4.3 信号量机制

    2.4.4 信号量的应用

    2.4.5 管程机制


    2.3  进 程 控 制

      进程控制是进程管理中最基本的功能,主要包括创建新进程、终止已完成的进程、将因发生异常情况而无法继续运行的进程置于阻塞状态、负责进程运行中的状态转换等功能。如当一个正在执行的进程因等待某事件而暂时不能继续执行时,将其转变为阻塞状态,而在该进程所期待的事件出现后,又将该进程转换为就绪状态等。进程控制一般是由OS的内核中的原语来实现的。

    2.3.1  操作系统内核

    1. 支撑功能
      (1) 中断处理。
      
    (2) 时钟管理。
      
    (3) 原语操作。 

    2. 资源管理功能
      (1) 进程管理。
      
    (2) 存储器管理。
      
    (3) 设备管理。

    2.3.2  进程的创建

    1. 进程的层次结构
      在OS中,允许一个进程创建另一个进程,通常把创建进程的进程称为父进程,而把被创建的进程称为子进程。子进程可继续创建更多的孙进程,由此便形成了一个进程的层次结构。如在UNIX中,进程与其子孙进程共同组成一个进程家族() 

    2. 进程图
      为了形象地描述一个进程的家族关系而引入了进程图(Process Graph)。所谓进程图就是用于描述进程间关系的一棵有向树,如图2-13所示。

    3. 引起创建进程的事件
      为使程序之间能并发运行,应先为它们分别创建进程。导致一个进程去创建另一个进程的典型事件有四类:
      
    (1) 用户登录。
      
    (2) 作业调度。
      
    (3) 提供服务。
      
    (4) 应用请求。

    4. 进程的创建(Creation of Process)
      在系统中每当出现了创建新进程的请求后,OS便调用进程创建原语Creat按下述步骤创建一个新进程:
      
    (1) 申请空白PCB,为新进程申请获得唯一的数字标识符,并从PCB集合中索取一个空白PCB
      
    (2) 为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等。
      
    (3) 初始化进程控制块(PCB)
      
    (4) 如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列。

    2.3.3  进程的终止


    1. 引起进程终止(Termination of Process)的事件
      (1) 正常结束
      
    (2) 异常结束
      
    (3) 外界干预

    2. 进程的终止过程
      如果系统中发生了要求终止进程的某事件,OS便调用进程终止原语,按下述过程去终止指定的进程:
      
    (1) 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;
      
    (2) 若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度;

     (3) 若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程;
      
    (4) 将被终止进程所拥有的全部资源或者归还给其父进程,或者归还给系统;
      
    (5) 将被终止进程(PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息。

    2.3.4  进程的阻塞与唤醒


    1. 引起进程阻塞和唤醒的事件
      有下述几类事件会引起进程阻塞或被唤醒:
      
    (1) 向系统请求共享资源失败。
      
    (2) 等待某种操作的完成。
      
    (3) 新数据尚未到达。
      
    (4) 等待新任务的到达。

    2. 进程阻塞过程
      正在执行的进程,如果发生了上述某事件,进程便通过调用阻塞原语block将自己阻塞。可见,阻塞是进程自身的一种主动行为。进入block过程后,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态,按新进程的PCB中的处理机状态设置CPU的环境。

    3. 进程唤醒过程
      当被阻塞进程所期待的事件发生时,比如它所启动的I/O操作已完成,或其所期待的数据已经到达,则由有关进程(比如提供数据的进程)调用唤醒原语wakeup,将等待该事件的进程唤醒。wakeup执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。

    2.3.5  进程的挂起与激活


      1. 进程的挂起
      
    2. 进程的激活过程

    2.4 进 程 同 步



      在OS中引入进程后,一方面可以使系统中的多道程序并发执行,这不仅能有效地改善资源利用率,还可显著地提高系统的吞吐量,但另一方面却使系统变得更加复杂。如果不能采取有效的措施,对多个进程的运行进行妥善的管理,必然会因为这些进程对系统资源的无序争夺给系统造成混乱。致使每次处理的结果存在着不确定性,即显现出其不可再现性。

    2.4.1 进程同步的基本概念


    1. 两种形式的制约关系
      1) 间接相互制约关系
      
    2) 直接相互制约关系

    2. 临界资源(Critical Resouce)
      在第一章中我们曾经介绍过,许多硬件资源如打印机、 磁带机等,都属于临界资源,诸进程间应采取互斥方式,实现对这种资源的共享。

           举例:生产者-消费者问题。

    3. 临界区(critical section)
      由前所述可知,不论是硬件临界资源还是软件临界资源,多个进程必须互斥地对它进行访问。人们把在每个进程中访问临界资源的那段代码称为临界区(critical section)

    4. 同步机制应遵循的规则
      为实现进程互斥地进入自己的临界区,可用软件方法,更多的是在系统中设置专门的同步机构来协调各进程间的运行。所有同步机制都应遵循下述四条准则:
      
    (1) 空闲让进。
      
    (2) 忙则等待。
      
    (3) 有限等待。
      
    (4) 让权等待。

    2.4.2  硬件同步机制


      虽然可以利用软件方法解决诸进程互斥进入临界区的问题,但有一定难度,并且存在很大的局限性,因而现在已很少采用。相应地,目前许多计算机已提供了一些特殊的硬件指令,允许对一个字中的内容进行检测和修正,或者是对两个字的内容进行交换等。可利用这些特殊的指令来解决临界区问题。

    1. 关中断
      关中断是实现互斥的最简单的方法之一。在进入锁测试之前关闭中断,直到完成锁测试并上锁之后才能打开中断。这样,进程在临界区执行期间,计算机系统不响应中断,从而不会引发调度,也就不会发生进程或线程切换。由此,保证了对锁的测试和关锁操作的连续性和完整性,有效地保证了互斥。但是,关中断的方法存在许多缺点:① 滥用关中断权力可能导致严重后果;② 关中断时间过长,会影响系统效率,限制了处理器交叉执行程序的能力;③ 关中断方法也不适用于多CPU 系统,因为在一个处理器上关中断并不能防止进程在其它处理器上执行相同的临界段代码。

    2. 利用Test-and-Set指令实现互斥
      这是一种借助一条硬件指令——“测试并建立”指令TS(Test-and-Set)以实现互斥的方法。在许多计算机中都提供了这种指令。

    3. 利用Swap指令实现进程互斥
      该指令称为对换指令,在Intel 80x86中又称为XCHG指令,用于交换两个字的内容。

    2.4.3 信号量机制


    1. 整型信号量
      最初由Dijkstra把整型信号量定义为一个用于表示资源数目的整型量S,它与一般整型量不同,除初始化外,仅能通过两个标准的原子操作(Atomic Operation) wait(S)signal(S)来访问。很长时间以来,这两个操作一直被分别称为PV操作。

    2. 记录型信号量
      在整型信号量机制中的wait操作,只要是信号量S≤0,就会不断地测试。因此,该机制并未遵循“让权等待”的准则,而是使进程处于“忙等”的状态。记录型信号量机制则是一种不存在“忙等”现象的进程同步机制。但在采取了“让权等待”的策略后,又会出现多个进程等待访问同一临界资源的情况。为此,在信号量机制中,除了需要一个用于代表资源数目的整型变量value外,还应增加一个进程链表指针list,用于链接上述的所有等待进程。

    3.  AND型信号量
      前面所述的进程互斥问题针对的是多个并发进程仅共享一个临界资源的情况。在有些应用场合,是一个进程往往需要获得两个或更多的共享资源后方能执行其任务。假定现有两个进程AB,它们都要求访问共享数据DE,当然,共享数据都应作为临界资源。

    4. 信号量集
      在前面所述的记录型信号量机制中,wait(S)signal(S)操作仅能对信号量施以加1或减1操作,意味着每次只能对某类临界资源进行一个单位的申请或释放。当一次需要N个单位时,便要进行Nwait(S)操作,这显然是低效的,甚至会增加死锁的概率。此外,在有些情况下,为确保系统的安全性,当所申请的资源数量低于某一下限值时,还必须进行管制,不予以分配。因此,当进程申请某类临界资源时,在每次分配之前,都必须测试资源的数量,判断是否大于可分配的下限值,决定是否予以分配。

    2.4.4 信号量的应用


    1. 利用信号量实现进程互斥
      为使多个进程能互斥地访问某临界资源,只需为该资源设置一互斥信号量mutex,并设其初始值为1,然后将各进程访问该资源的临界区CS置于wait(mutex)signal(mutex)操作之间即可。

    2. 利用信号量实现前趋关系
      还可利用信号量来描述程序或语句之间的前趋关系。设有两个并发执行的进程P1P2P1中有语句S1P2中有语句S2。我们希望在S1执行后再执行S2。为实现这种前趋关系,只需使进程P1P2共享一个公用信号量S,并赋予其初值为0,将signal(S)操作放在语句S1后面,而在S2语句前面插入wait(S)操作,即
      在进程
    P1中,用S1signal(S)
      在进程
    P2中,用wait(S)S2

    由于S被初始化为0,这样,若P2先执行必定阻塞,只有在进程P1执行完S1signal(S);操作后使S增为1时,P2进程方能成功执行语句S2。同样,我们可以利用信号量按照语句间的前趋关系(见图2-14),写出一个更为复杂的可并发执行的程序。

    2.4.5 管程机制


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

    由上述的定义可知,管程由四部分组成:① 管程的名称;② 局部于管程的共享数据结构说明;③ 对该数据结构进行操作的一组过程;④ 对局部于管程的共享数据设置初始值的语句。图2-15是一个管程的示意图。

     2. 条件变量
      在利用管程实现进程同步时,必须设置同步工具,如两个同步操作原语waitsignal。当某进程通过管程请求获得临界资源而未能满足时,管程便调用wait原语使该进程等待,并将其排在等待队列上,如图2-13所示。仅当另一进程访问完成并释放该资源之后,管程才又调用signal原语,唤醒等待队列中的队首进程。

  • 相关阅读:
    数据库tps的思考
    unity 使用声网(Agora)实现语音通话
    【送书活动】网络安全(黑客)自学
    【优化模型】航空公司的预订票策略
    个人PC安装软件
    django-admin登录窗口添加验证码功能-(替换原有的login.html)captcha插件
    开源相机管理库Aravis例程学习(五)——camera-api
    思维导图学《On Java》基础卷 + 进阶卷
    【微服务|Nacos】Nacos版本相关问题一览
    DBCO-Maleimide(1395786-30-7)作为巯基反应连接剂有哪些特性!
  • 原文地址:https://blog.csdn.net/weixin_53342789/article/details/126063252