• 第二章 进程的描述与控制(一)


     2.1  前趋图和程序执行

    2.1.1  前趋图

      所谓前趋图指一个有向无循环图,可记为DAG,它用于描述进程之间执行的先后顺序。每个结点可用来表示一个进程或程序段,乃至一条语句,结点间的有向边则表示两个结点之间存在的偏序或前趋关系。进程(或程序)之间的前趋关系可以用”——>“来表示。

      把没有前趋的结点(入度为0的结点)称为初始结点,没有后继的结点(出度为0的结点)称为终止结点。每个结点还具有一个重量,用于表示该节点所含有的程序量或程序的执行时间。

    2.1.2  程序顺序执行

    1.  程序的顺序执行

    通常,一个应用程序由若干个程序段组成,每一个程序段完成特定的功能,它们在执行时,都需要按照某种先后次序顺序执行,仅当前一程序段执行完后,才运行后一程序段。

    例如,在进行计算时,应

    • 先运行输入程序,用于输入用户的程序和数据;

    • 然后运行计算程序,对所输入的数据进行计算;

    • 最后才是运行打印程序,打印计算结果。用结点(Node)代表各程序段的操作(圆圈表示),其中 I 代表输入操作,C代表计算操作, P为打印操作用箭头指示操作的先后次序。

    2.  程序顺序执行时的特征

    (1)顺序性:指处理机严格地按照程序所规定的顺序执行,即每一操作必须在 下一个操作开始之前结束;

    (2)封闭性:指程序在封闭的环境下运行,即程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序才能改变它,程序一旦开始执行,其执行结果不受外界因素影响;

    (3)可再现性:指只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿地执行,还是"停停走走"地执行,都可获得相同的结果。程序顺序执行时的这种特性,为程序员检测和校正程序的错误带来 了很大的方便。

    2.1.3  程序并发性

    1.  程序的并发执行

    输入程序、计算程序和打印程序三者之间,存在着 I ——> C ——> P i  这样的前趋关系,以至对一个作业的输入、计算和打印三个程序段必须顺序执行

    但若对一批作业进行处理时,每道作业的输入、计算和打印程序段的执行情况如图所示

    注:程序语句也可以并发执行,彼此互不依赖

    2.  程序并发执行时的特征

      提高了系统的吞吐量和资源利用率,由于他们共享系统资源,以及它们为完成同一项任务而相互合作,致使在这些并发执行的程序之间必将形成相互制约的关系,由此会给程序并发执行带来新的特征。

    • 间断性
    • 失去封闭性
    • 不可再现性

    例如:有两个程序 A 和 B并发执行,它们共享一个变量N

    程序 A:N=N+1;    程序 B:print(N); N=0;

    程序 A 和 B以不同的速度运行(失去了封装性,导致不可再现性)----->此题产生了三种情况。

    2.2  进程的描述

    2.2.1  进程的定义和特征

    1.  进程的定义

      在多道程序环境下,程序的执行属于并发执行,此时他们将失去其封闭性,并具有间断性,以及其运行结果不可再现性的特征。为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,引入“进程”的概念。引入数据结构PCB(结构体),"程序段(代码段/指令段)+数据段+PCB " 构成进程实体。

      对于进程的定义,从不同角度可以有不同的定义,其中较典型的定义有:

    (1)进程是程序的一次执行

    (2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。

    (3)进程时具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度(线程)的一个独立单位

    2.  进程的特点

      进程和程序是两个截然不同的概念,处理进程具有程序所没有的PCB结构外,还具有下面一些特征:

    • 动态性
    • 并发性
    • 独立性
    • 异步性

    3.  进程与程序的比较

    (1)进程是动态的,程序是静态的:程序是有序代码的集合;进程是程序的执行。通常进程不可在计算机之间迁移,而程序通常对应着文件、静态和可以复制进行迁移。

    (2)进程是暂时的,程序的永久的:进程是一个状态变化的过程,程序可长久保存(当然可卸载)

    (3)进程与程序的组成不同:进程的组成包括程序、数据和进程控制块( 即进程状态信息)

    (4)进程与程序的对应关系:通过多次执行,一个程序可对应多个进程;通过调用关系,一个进程可包括多个程序

    2.2.2  进程的基本状态及转换(重点)

    每一个进程至少应处于三种基本状态的其中一个。

    1.  进程的三种基本状态

    (1)就绪状态:什么都不缺,就缺CPU

    (2)执行状态:查看CPU利用率

    (3)阻塞(Block)状态:除了CPU之外,还差一些东西(一般I/O)

    注:这三者循环,其中就绪状态和执行状态可以双向,执行状态到就绪状态:时间片、优先级

    2.  三种基本状态的转换

      处于就绪状态的进程,在调度程序为之分配了处理机之后便可执行,相应地,其状态就由就绪态转变为执行态;正在执行的进程(当前进程),如果因分配给它的时间片已完而被剥夺处理机暂停执行时,其状态便由执行转为就绪;如果因发生某事件,致使当前进程的执行受阻(例如进程访问某临界资源,而该资源正被其它进程访问时),使之无法继续执行,则该进程状态将由执行转变为阻塞。

    注:与任务管理器中的执行区分开

    3.  创建状态和终止状态

    (1)创建状态

    • 首先由进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息;

    • 为该进程分配运行时所必须的资源;

    • 把该进程转入就绪状态并插入就绪队列之中

    注:如果进程所需的资源尚不能得到满足,比如系统尚无足够的内存使进程无法装入其中,此时创建工作尚未完成,进程不能被调度运行,于是把此时进程所处的状态称为创建状态


    (2)终止状态

      等待操作系统进行善后处理,最后将其PCB清零,并将PCB空间返还系统

      解释:

        当一个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,它将进入终止状态。

        进入终止态的进程以后不能再执行,但在操作系统中依然保留一个记录,其中保存状态码和一些计时统计数据,供其他进程收集。

        一旦其他进程完成了对其信息的提取之后,操作系统将删除进程,即将其PCB清零,并将该空白PCB返还系统

     

     

     2.2.3  挂起操作和进程状态的转换

    1.  挂起操作:将主存的一部分移到外存中。

      引入挂起操作的原因,是基于系统和用户的如下需要:

    • 终端用户的需要
    • 父进程请求
    • 负荷调节的需要
    • 操作系统的需要

     

    2.  引入挂起原语操作后三个进程状态的转换

      在引入挂起原语 suspend 和 激活原语active,在它们作用下,进程将可能发生一下几种状态

    • 挂起:
      • 活动就绪 -——> 静止就绪 
      • 活动阻塞 -——> 静止阻塞
    • 激活:
      • 静止就绪 ——> 活动就绪
      • 静止阻塞 ——> 活动阻塞

    注:

      (1)在主存里称为----活动(CPU可以写指令访问)

      (2)在外存里称为----静止(CPU写太麻烦)

      (3)原语就是一段代码,执行后就不能中断

     

    3.  引入挂起操作后五个进程状态的转换

      引进创建和终止状态后,在进程状态转化时,要增加考虑下面几种情况:

    • NULL——> 创建

    • 创建——>活动就绪

    • 创建——>静止就绪

    • 执行——>终止

     

     注:408没考过,自主命题emmmm看吧

     

    2.2.4  进程管理的数据结构(PCB里面的东西)

    1.  操作系统中用于管理控制的数据结构

      在计算机系统中,对于每个资源和每个进程都设置了一个数据结构,用于表征其实体,我们称之为资源信息表或进程信息表(由PCB构成)。

      包含了资源或进程的标识、描述、状态等信息以及一批指针。通过这些指针,可以将同类资源或进程的信息表,或者同一进程所占用的资源信息表分类链接成不同的队列,便于操作系统进行查找。

      OS管理的这些数据结构一般分为四类:内存表设备表文件表和用于进程管理的进程表,通常进程表又被称为进程控制块PCB

      进程控制块(Processing Control Block),是操作系统核心中一种数据结构,主要表示进程状态。其作用是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位或与其它进程并发执行的进程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。 PCB通常是系统内存占用区中的一个连续存区。

     

     

    2.  进程控制块PCB的作用

    • 作为独立运行基本单位的标志

    • 能实现间断性运行方式

    • 提供进程管理所需要的信息

    • 提供进程调度所需要的信息

    • 实现与其他进程的同步与通信

     

    3.  进程控制块中的信息

    (1)进程标识符:用于唯一地标识一个进程

    • 外部标识符:用户;
    • 内部标识符:OS;进程杀死后,其编号(数字)可以重复使用

     

    (2)处理机状态(逻辑CPU)

      处理机状态信息也称为处理机的上下文,主要是由处理机的各种寄存器中的内容组成的。

    • 通用寄存器:是用户程序可访问的,暂存信息

    • 指令计数器存:放了下一条指令的地址;

    • 程序状态字PSW:含有状态信息,如条件码、执行方式、中断屏蔽标志等 ;

    • 用户栈指针:存放过程和系统调用参数及调用地址。栈指针指向该栈的栈顶

     

    (3)进程调度信息

    • 进程状态,指明进程的当前状态,它是作为进程调度和对换时的依据;

    • 进程优先级,是用于描述进程使用处理机的优先级别的一个整数,优先级高的进程应优先获得处理机;

    • 进程调度所需的其它信息,它们与所采用的进程调度算法有关,比如,进程已等待CPU的时间总和、进程已执行的时间总和等;

    • 事件,是指进程由执行状态转变为阻塞状态所等待发生的事件,即阻塞原因

     

    (4)进程控制信息(资源放在什么地方)

      是指用于进程控制所必须的信息,它包括:

    • 程序和数据的地址,进程实体中的程序和数据的内存或外存地(首)址,以便再调度到该进程执行时,能从PCB中找到其程序和数据;

    • 进程同步和通信机制,这是实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等,它们可能全部或部分地放在PCB中;

    • 资源清单在该清单中列出了进程在运行期间所需的全部资源(CPU以外),另外还有一张已分配到该进程的资源的清单;

    • 链接指针,它给出了本进程(PCB)所在队列中的下一个进程的 PCB 的首地址。

     

    4.  进程控制块的组织方式

      目前常用的组织方式有以下三种。

    (1)线性方式,即将系统中所有的 PCB 都组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。该方式实现简单、开销小,但每次查找时都需要扫描整张表,因此适合进程数目不多的系统

    (2)链接方式,即把具有相同状态进程的 PCB 分别通过 PCB 中的链接字链接成一个队列。(单个CPU只有1个执行状态的进程,没有执行队列)形成就绪队列、若干个阻塞队列和空白队列等。对就绪队列而言,往往按进程的优先级将PCB从高到低进行排列,将优先级高的进程PCB排在队列的前面。把处于阻塞状态进程的PCB根据其阻塞原因的不同,排成多个阻塞队列,如等待I/O操作完成的队列和等待分配内存的队列等。

    (3)索引方式,即系统根据所有进程状态的不同,建立几张索引表,例如就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的标目中,记录具有相应状态的某个 PCB 在 PCB 表中的地址

     

    2.3  进程控制

      进程控制是进程管理中最基本的功能,主要包括创建新进程、终止已完成的进程、将因发生异常情况而无法继续运行的进程置于阻塞状态、负责进程运行中的状态转换等功能。

      当一个正在执行的进程因等待某事件而暂时不能继续执行时,将其转变为阻塞状态,而在该进程所期待的事件出现后,又将该进程转换为就绪状态等。进程控制一般是由OS的内核中的原语来实现的。

    概念补充(特权指令、处理机的执行状态、中断、异常)

    1.  特权指令:有少数指令是为编制系统管理程序专门设置的。如果用户误用这些特权指令,称为非法指令,将引发故障中断。

    2.  处理机的执行状态:为了保护系统程序

    • 核心态(管态、系统态):系统管理程序执行时的状态。具有较高的特权,能执行一切指令,访问所有寄存器和存储器

    • 用户态(目态):以后程序执行时的状态。具有较低的特权,只能执行规定指令,访问指定的寄存器和存储区

    用户态到内核态 ——> 访管指令

    内核态到用户态 ——> 修改PSW状态位

    3.  中断、异常(大的概念)

    中断(外部中断) :是指处理机对系统中或系统外发生的异步事件的响应。异步事件是指无一定时序关系的随机发生的事件,如外部设备完成了数据传输任务,某一实时控制设备出现情况等。

    异常:分为故障、陷入(陷阱trap,实际上就是系统调用)和中止;是指由系统发起的一次确定的服务过程(有些地方也称为软中断)

     

     2.3.1  操作系统内核

     1.  支撑功能

    (1)中断处理

    (2)时钟管理

    (3)原语操作

      原语(Primitive)是由若干条指令组成的,用于完成一定功能的一个过程。

      与一般过程的区别在于:它们是"原子操作(ActionOperation)"。所谓原子操作,是指一个操作中的所有动作要么全做,要么全不做。换言之,它是一个不可分割的基本单位,因此,在执行过程中不允许被中断原子操作在管态(内核态)下执行,常驻内存。

    2.  资源管理功能

    (1)进程管理

    (2)存储器管理

    (3)设备管理

    2.3.2  进程的创建

    1.  进程的层次结构

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

     

    2.  进程图(了解为主)

      为了形象描述一个进程的家族关系而引入进程图,进程图是用于描述进程间关系的一棵有向树

    3.  引起创建进程的事件(重点)

      为使程序之间能并发运行,应先为它们分别创建进程导致一个进程去创建另一个进程的典型事件有四类:

    • 用户登录
    • 作业调度:外存转移到内存开始执行
    • 提供服务
    • 应用请求

    4.  进程的创建(Creation of Process)

      在系统中每当出现了创建新进程的请求后,OS便调用进程创建原语 Creat 按下述步骤创建一个新进程:

    (1)申请空白 PCB,为新进程申请获得唯一的数字标识符(内部标识符),并从PCB集合中索取一个空白PCB。

    (2)为新进程分配其运行所需的资源,包括各种物理和逻辑资源,如内存、文件、I/O设备和 CPU 时间等。

    (3)初始化进程控制块(PCB)。----->创建进程的主要标志PCB

    (4)如果进程就绪队列能够接纳新进程,便将新进程插入就绪队列

    2.3.3  进程的终止

    1.  引起进程终止的事件

    • 正常结束

    • 异常结束

    • 外界干预

    2.  进程的终止过程

      如果系统中发生了要求终止进程的某事件,OS便调用进程终止原语,按下述过程去终止指定的进程:

    (1)根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态;

    (2)若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度;

    (3)若该进程还有子孙进程,还应将其所有子孙进程也都予以终止,以防它们成为不可控的进程;

    (4)将被终止进程所拥有的全部资源或者归还给其父进程,或者归还给系统;

    (5)将被终止进程(PCB)从所在队列(或链表)中移出,等待其它程序来搜集信息。

    2.3.4  进程的阻塞与唤醒

    1.  引起进程阻塞和唤醒的事件

    • 向系统请求共享资源失败(PV操作)

    • 等待某种操作的完成(I/O操作)

    • 新数据尚未到达

    • 等待新任务的到达

    2.  进程阻塞过程

      正在执行的进程,如果发生了上述某事件,进程便通过调用阻塞原语block将自己阻塞。可见, 阻塞是进程自身的一种.主动行为

      进入block过程后,由于该进程还处于执行状态,所以应先立即停止执行,把进程控制块中的现行状态由"执行"改为阻塞,并将PCB插入阻塞队列。如果系统中设置了因不同事件而阻塞的多个阻塞队列,则应将本进程插入到具有相同事件的阻塞队列。最后,转调度程序进行重新调度,将处理机分配给另一就绪进程,并进行切换,亦即,保留被阻塞进程的处理机状态按新进程的PCB中的处理机状态设置 CPU 的环境。

    3.  进程唤醒过程

      当被阻塞进程所期待的事件发生时,比如它所启动的I/O操作已完成,或其所期待的数据已经到达,则由有关进程(比如提供数据的进程)调用唤醒原语wakeup,将等待该事件的进程唤醒。

      wakeup执行的过程是:首先把被阻塞的进程从等待该事件的阻塞队列中移出,将其PCB中的现行状态由阻塞改为就绪,然后再将该PCB插入到就绪队列中。

    2.3.5  进程的挂起与激活

    1.  进程的挂起

      当出现引起进程挂起的事件时,系统将利用挂起原语suspend( )将指定进程或处于阻塞状态的进程挂起

      suspend()原语的执行过程:首先检查被挂起进程的状态,若处于活动就绪状态,便将其改为静止就绪;对于活动阻塞状态的进程,则将之改为静止阻塞。(内存到外存)

    2.  进程的激活过程

      当发生激活进程的事件时,系统将利用激活原语active( )将指定进程激活

      active()原语执行过程激活原语先将进程从外存调入内存,检查该进程的现行状态,若是静止就绪,便将之改为活动就绪;若为静止阻塞便将之改为活动阻塞



    哪有什么胜利可言,坚持意味着一切
  • 相关阅读:
    大数乘法的几种算法分析及比较(2014腾讯南京笔试题)
    【经典数据结构】Trie
    [LeetCode] MaximumDepth of Binary Tree
    [LeetCode] Minimum Depth of Binary Tree
    二叉树相关题目总结
    python之函数基础总结
    python基础之文件处理总结
    利用for循环和range输出9 * 9乘法口诀表
    购物车程序作业
    字典练习
  • 原文地址:https://www.cnblogs.com/BY1314/p/12682406.html
Copyright © 2020-2023  润新知