操作系统 - 第 2 章 进程的描述与控制

2.0 进程   

    在传统的操作系统中,为了提高资源利用率和系统吞吐量,通常采用多道程序技术将多个程序同时装入内存,并让这些程序并发运行,传统意义上的程序将不再能独立运行。

    此时,进程是作为资源分配和独立运行的基本单位

    操作系统所具有的的四大特征也都是基于进程而形成的

    A. 并发

    B. 共享

    C. 虚拟

    D. 异步

2.1 前趋图和程序执行

2.1.1 前趋图

2.1.2 程序顺序执行

1. 程序的顺序执行

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

2.1.3 程序并发执行

1. 程序的并发执行

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

 2.2 进程的描述

2.2.1 进程的定义和特征

2.2.1.1 进程的定义

    在多道程序环境下,程序并发执行

    程序并发执行时的特征:间断性、失去封闭性、运行结果不可再现性

    程序并发执行时的特点,决定了通常(传统的、顺序执行)的程序不能参与并发执行,否则,程序的运行也就失去了意义(结果不可预测)

    为了能使程序并发执行同时可以对并发执行的程序加以描述和控制,引入了 “进程” 的概念

    进程控制块:

        为了使参与并发执行的每个程序(含数据)都能独立运行,在操作系统中必须为正在运行的程序配置一个专门的数据结构,称之为 “进程控制块

        进程控制块:Process Control Block ,PCB

        操作系统利用 PCB 来描述进程的基本信息和活动过程,从而控制和管理进程

    进程实体(进程映像)的三大组成部分:程序段 、相关数据段 、进程控制块(PCB)  

    常把进程实体简称为 “进程”

    创建进程,就是创建进程实体中的 PCB ;撤销进程,就是撤销进程的 PCB

    进程的典型定义:

        A. 进程是程序的一次执行

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

        C. 进程是具有独立功能的程序在一个数据集合上运行的过程

            进程是系统进行资源分配和调度的一个独立单位

        引入进程实体的概念后,可以把传统 OS 中的进程定义:进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位

2.2.1.2 进程的特征

    进程和程序是不同的概念,程序没有 PCB ,而进程具有 PCB ,除此之外,进程还有以下特点:

        A. 动态性

              进程的实质是进程实体的执行过程动态性是进程的最基本特征

              动态性的表现:进程由创建而产生,经调度而执行,被撤销而消亡

              进程实体有一定的生命期

              程序则只是一组有序指令的集合,存放于某种介质上,程序本身并不具有活动的含义,程序是静态的

        B. 并发性

              多个进程实体同时存在于内存中,并且能在一段时间内同时运行

              引入进程的目的正是为了使多个进程实体能并发执行

              并发性是进程的重要特征,也是 OS 的重要特征

              程序(没有建立 PCB)无法参与并发执行

        C. 独立性

              在传统的 OS 中,独立性是指 进程实体是一个能独立运行、独立获得资源、独立接受调度的基本单位

              未建立 PCB 的程序不能作为一个独立的单位参与运行

        D. 异步性

              进程是按异步方式运行的,即按各自独立的、不可预知的速度向前推进

              上面的原因导致了传统意义上的程序并发运行时,产生的结果不可再现

              为了使进程在并发运行时虽有异步性,但仍能保证进程并发执行的结果可再现,在系统中配置了相应的进程同步机制(必须)

2.2.2 进程的基本状态及转换

2.2.2.1 进程的三种基本状态

    由于多个进程在并发执行时共享系统资源,因而这些进程在运行时呈现间断性的运行规律,所以进程在自己的生命周期内可能具有多种状态

    一般而言,每一个进程至少应该处于以下三种基本状态之一:

    A. 就绪状态(Ready)

概念

进程处于已经准备好运行的状态,即

进程已经分配到除了 CPU 之外的所有必要资源,只要再获得 CPU ,便可立即执行

就绪队列如果系统中有多个处于就绪状态的进程,通常将这些就绪的进程按一定的策略(如优先级策略)排成一个队列,称之为 就绪队列

    B. 执行状态(Running)

概念进程已经获得所有资源包括 CPU,程序正在执行
注意

单处理机系统中的任一时刻,有且只有一个进程正在执行;

多处理机系统中的任一时刻,可能有多个进程正在执行

    C. 阻塞状态(Block)

          正在执行的进程由于发生某些事件(I/O请求、申请缓冲区失败等)暂时无法继续执行,即进程执行受阻

          说明:

          此时引起进程调度,OS 把处理机分配给另一个就绪进程,让受阻进程处于暂停状态

          一般将这种暂停状态称为 "阻塞状态" (等待状态 、封锁状态)

          系统将阻塞的进程排成一个队列(阻塞队列)

          在较大的系统中,为减少队列操作开销,提高系统效率,会根据不同阻塞原因而设置多个阻塞队列

2.2.2.2 三种基本状态的转换

          进程在运行过程中会经常发生状态的转换!!!

A. 就绪态 -> 运行态 :(调度程序给就绪进程分配 CPU)

B. 运行态 -> 就绪态 :(运行进程的时间片用完,被剥夺 CPU 使用权)

C. 运行态 -> 阻塞态 :( I/O 请求、当前进程欲访问某临界资源,而该资源正被其他进程访问)

D. 阻塞态 -> 运行态 :阻塞态不能直接转化为运行态,只有就绪态能转化为运行态

E. 阻塞态 -> 就绪态 :(I/O 请求完成)

F. 就绪态 -> 阻塞态 :就绪态只会正向转为运行态,不会回到阻塞态

2.2.2.3 创建状态和终止状态

    目的 :

        为满足 PCB 对数据和操作完整性要求,同时增强管理灵活性,会在系统中为进程引入(新增)两种常见状态:创建状态 、终止状态

    D. 创建状态 :

          进程由创建而产生,创建进程的过程很复杂,一般要通过多个步骤才能完成:

          (1).  进程向 OS 申请一个空白 PCB,OS 向 PCB 中填写用于控制和管理进程的信息

          (2). OS 为该进程分配运行时所必须的资源

          (3). OS 把该进程转入就绪状态并插入就绪队列中

          如果进程所需资源无法满足(比如系统内存不够从而导致进程无法装入内存),此时创建工作尚未完成,进程不能被调度

          此时,进程所处的状态称之为创建状态” (资源全部满足,只缺 CPU 的状态称为 “就绪状态”

          引入 “创建状态” 的目的:

          a. 保证进程的调度必须在创建工作完成后进行,从而确保对 PCB 操作的完整性

          b. 增加管理的灵活性,OS 可以根据系统性能或主存容量的限制,推迟将创建状态转为就绪状态

          c. 处于创建状态的进程,只有获得了所需的资源,同时完成了对 PCB 的初始化工作之后,才能从创建状态转为就绪状态

    E. 终止状态 :

          进程的终止也要通过两个步骤:

          A. 等待操作系统进行善后处理

          B. 将进程的 PCB 清零,同时将 PCB 空间还给系统

          进程进入 “终止状态” :

        (进程到达了自然结束点、出现了无法克服的错误、被操作系统所终结 、被其他有终止权的进程终结

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

          一旦其他进程收集完信息之后,操作系统会删除该进程(将其 PCB 清零,并将该空白 PCB 占用空间还给系统)

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

在许多系统中,进程除了 就绪 、运行 、阻塞三种最基本的状态之外,为了系统和用户进行观察和分析进程,还引入了一个对进程的重要操作 - "挂起操作"

当该操作作用于某个进程时,该进程将被挂起,意味着此时该进程处于 "静止状态" 。

  a. 如果进程正在执行,该进程将暂停执行

  b. 如果进程处于就绪状态,则该进程暂不接受调度

与挂起操作对应的操作是 "激活操作"

2.2.3.1 挂起操作的引入

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

  (1).  终端用户的需要

         当终端用户在自己的程序运行期间发现有可疑问题,希望暂停自己的程序运行,以便用户研究进程执行情况或对程序进行修改

  (2). 父进程请求

         有时父进程希望挂起自己的某个子进程,以便考查和修改该子进程,或者协调各子进程之间的活动

  (3). 负荷调节的需要

         当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,可由系统把一些不重要的进程挂起,以保证系统能正常运行

  (4). 操作系统的需要

         操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账

2.2.3.2 引入挂起操作后三种进程状态的转换

  在引入挂起原语 Suspend 和激活原语 Active 后,在它们的作用下,进程将可能发生以下几种状态的转换 :

  (1).  活动就绪 --> 静止就绪

         a. 当进程处于未被挂起的就绪状态时,称此状态为 "活动就绪状态" ,表示为Readya ,此时进程可以接受调度

         b. 当用挂起原语 Suspend 将该进程挂起后,该进程就转变为 "静止就绪状态" ,表示为 Readys ,处于 Readys 状态的进程不再被调度执行

  (2). 活动阻塞 --> 静止阻塞

         a. 当进程处于未被挂起的阻塞状态时,称此状态为 "活动阻塞状态" ,表示为 Blockeda

         b. 当用 Suspend 原语将该进程挂起后,进程便转变为 "静止阻塞状态" ,表示为 Blockeds

         c. 处于静止阻塞状态的进程,在其所期待的事件出现后,该进程将从静止阻塞状态变为静止就绪 Readys 状态

  (3). 静止就绪 --> 活动就绪

         a. 处于静止就绪状态的进程,若用激活原语 Active 激活后,该进程将转变为活动就绪状态

  (4). 静止阻塞 --> 活动阻塞

         a. 处于静止就绪状态的进程,若用激活原语 Active 激活后,进程将转变为活动阻塞状态

2.2.3.3 引入挂起操作后五种进程状态的转换

  下图增加了创建状态和终止状态后,具有挂起状态的进程状态及转换图

  引进创建和终止状态后,在进程状态转换时,与上图所示的进程状态转换相比较,要多考虑下面的情况

  (1).  NULL --> 创建 :

         一个新进程产生时,该进程处于创建状态

  (2). 创建 --> 活动就绪

         在当前系统的性能和内存容量均允许的情况下,完成对进程创建的必要操作后,相应的系统进程将 "进程的状态" 转换为活动就绪状态

  (3). 创建 --> 静止就绪

         考虑到系统当前资源状况和性能要求,不分配给新建进程所需资源(主要是主存),相应的系统进程将该进程状态转变为 "静止就绪状态" ,然后被安置在外存上,不参与调度,此时进程创建工作尚未完成

  (4). 执行 --> 终止

         当一个进程已完成任务时,或出现了无法克服的错误,或被 OS(其他进程)所终结,此时将进程的状态转变为终止状态

2.2.4 进程管理中的数据结构

(1). 为了便于对计算机中各类资源的使用和管理,OS 将这些资源抽象为相应的各种数据结构,以及提供一组对资源进行操作的命令

      用户可利用这些数据结构和操作命令来执行相关的操作,无需关心这些数据结构的实现细节

(2). OS 作为计算机资源的管理者,尤其为了协调各个用户对系统中共享资源的使用,OS 必须记录和查询各种资源的使用以及各个进程运行情况的信息

       OS 对于这些信息的组织和维护,也是通过建立和维护各种数据结构的方式来实现的

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

    在计算机系统中,对于每个资源和每个进程都设置了一个数据结构,用于表征其程序实体,称之为资源信息表或进程信息表;

    该信息表中包含了资源或进程的 标识 、描述 、状态 等信息以及一批指针;

    通过这些指针,可以将同类资源或进程的信息表,或者同一进程所占用的资源信息表,分类链接成不同的队列,便于 OS 进行查找

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

2.2.4.2 进程控制块 PCB 的作用

    为了便于系统描述和管理进程的运行,在 OS 的核心为每个进程专门定义了一个数据结构 -- 进程控制块 PCB(Process Control Block)

    PCB 作为进程实体的一部分,记录了操作系统所需的,用于描述进程当前情况以及管理进程运行的全部信息,是操作系统中最重要的记录型数据结构

    进程实体的三大部分:程序段 、相关数据段 、进程控制块

    PCB 的作用:使一个在多道程序环境下不能独立运行的程序(含数据)成为一个能独立运行的基本单位,一个能与其他进程并发执行的进程

    PCB 具体作用:

    (1).  作为独立运行基本单位的标志

            当一个程序(含数据)配置了 PCB 后,就表示该程序成为了一个能在多道程序环境下独立运行的、合法的基本单位;

            也就具有了取得 OS 服务的权利,如打开文件系统中的文件,请求获得系统中的 I/O 设备,与其他相关进程进行通信等

            当系统创建一个新进程时,就为该进程建立一个 PCB ;进程结束时,OS 回收该进程的 PCB ,进程随之消亡;

            系统是通过 PCB 感知进程的存在;

            事实上,PCB 是进程存在于系统中的唯一标志

    (2).  能实现间断性运行方式

            在多道程序环境下,程序采用停停走走间断性的方式运行的;

            间断性的表现:

            当进程因阻塞而暂停运行时,必须保留自己运行时的 CPU 现场信息,当再次被调度运行时,还需要恢复其 CPU 现场信息;

            在有了 PCB 后,OS 可将 CPU 现场信息保存在被中断进程的 PCB 中,供该进程再次被调度执行时恢复 CPU 现场时使用;

            由此,在多道程序环境下,作为传统意义上的静态程序,其不具有保护或保存自己运行现场的手段,

            无法保证其运行结果的可再现性,从而失去运行的意义

    (3).  提供进程管理所需的信息

            当调度程序调度到某进程运行时,只能根据该进程 PCB 中记录的程序和数据在内存或外存中起始地址指针,找到相应的程序和数据;

            在进程运行过程中,当需要访问文件系统中的文件或 I/O 设备时,也都需要借助 PCB 中的信息;

            另外,还可根据 PCB 中的资源清单了解到该进程所需的全部资源等

            可见,在进程的整个生命周期中,OS 总是根据 PCB 实施对进程的控制和管理

    (4).  提供进程调度所需的信息

            只有处于就绪状态的进程才能被调度执行,而在 PCB 中就提供了进程处于何种状态的信息;

            如果进程处于就绪状态,OS 便将该进程插入到进程就绪队列中,等待着调度程序的调度;

            另外在进行调度时,往往还需要了解进程的其他信息,如在优先级调度算法中,就需要直到进程的优先级;

            在有些较为公平的调度算法中,还需要知道进程的等待时间和已执行的时间等

    (5).  实现与其他进程的同步与通信

            进程同步机制是用于实现诸进程的协调运行;

            在采用信号量机制时,要求在每个进程中都设置相应的用于同步的信号量;

            在 PCB 中,还存在用于实现进程通信的区域或通信队列指针等

2.2.4.3 进程控制块中的信息

    在进程控制块中,主要包括下面 4 个方面的信息:

    (1). 进程标识符

        进程标识符用于唯一地标识一个进程;一个进程通常有两种标识符:

        a. 外部标识符

        为了方便用户(进程)对进程的访问,必须为每一个进程设置一个外部标识符;

        该外部标识符由创建者提供,通常由 字母 、数字 组成;为了描述进程的家族关系,还应设置父进程标识及子进程标识;

        此外,还可设置用户标识,来指示拥有该进程的用户;

        b. 内部标识符

        为了方便系统对进程的使用,在 OS 中又为进程设置了内部标识符,即赋予每一个进程一个唯一的数字标识符,通常是一个进程的序号

    (2). 处理机状态

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

        这些寄存器包括:

        (i).  通用寄存器:

               又称为用户可视寄存器,是用户程序可以访问的,用于暂存信息;

               在大多数处理机中,有 8 ~ 32 个通用寄存器,在 RISC 结构的计算机中,通用寄存器的个数可超过 100 个

        (ii). 指令寄存器:

               其中存放了要访问的下一条指令的地址

        (iii). 程序状态字 PSW:

                其中含有状态信息,如 条件码 、执行方式 、中断屏蔽标志等

        (iv). 用户栈指针:

                每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址;

                栈指针指向该栈的栈顶;

        处理机处于执行状态,正在处理的许多信息都是放在寄存器中;

        当进程被切换时,处理机状态信息都必须保存在相应的 PCB 中,以便在该进程重新执行时,能再从断点继续执行

    (3). 进程调度信息

           在 OS 进行调度时,必须了解进程的状态及有关进程调度的信息;

           这些调度信息包括:

           a. 进程状态:指明进程的当前状态,作为进程调度和对换时的依据

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

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

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

    (4). 进程控制信息

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

           a. 程序和数据的地址

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

           b. 进程同步和通信机制

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

           c. 资源清单

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

           d. 链接指针

               给出了本进程(PCB)所在队列中的下一个进程的 PCB 的首地址

2.2.4.4 进程控制块的组织方式

    在一个系统中,通常可拥有数十个 、数百个甚至数千个 PCB ;

    为了能有效管理这些 PCB ,应该用适当的方式将这些 PCB 组织起来;

    目前常用的组织方式有以下 3 种:

    (1). 线性方式

        将系统中所有的 PCB 组织在一张线性表中,将该表的首地址存放在内存的一个专用区域中;

        该方式实现简单,开销小,但每次查找时都必须扫描整张表,因此适合进程数目不多的系统;

    (2). 链接方式

        把具有相同状态进程的 PCB 分别通过 PCB 链接字,链接成一个队列;

        这样,就可以形成 "就绪队列" 、"若干个阻塞队列" 和 "空白队列" 等

        在就绪队列中,通常按进程的优先级将 PCB 从高到低进行排列,将优先级高的进程 PCB 排在队列的前面

        在阻塞队列中,把处于阻塞状态进程的 PCB 根据其阻塞原因不同,排成多个阻塞队列;

        如等待 I/O 操作完成的队列,等待分配内存的队列等;

    (3). 索引方式

        系统根据所有进程状态的不同,建立几张索引表;

        例如,就绪索引表 、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中;

        在每个索引表的目录中,记录具有相应状态的某个 PCB 在 PCB 表中的地址

2.3 进程控制

2.3.1 操作系统内核

1. 支撑功能

2. 资源管理功能

2.3.2 进程的创建

1. 进程的层次结构

2. 进程图

3. 引起创建进程的事件

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

2.3.3 进程的终止

1. 引起进程终止(Termination of Process)的事件

2. 进程的终止过程

2.3.4 进程的阻塞与唤醒

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

2. 进程阻塞过程

3. 进程唤醒过程

2.3.5 进程的挂起与激活

1. 进程的挂起

2. 进程的激活

2.4 进程同步

2.4.1 进程同步的基本概念

1. 两种形式的制约关系

2. 临界资源(Critical Resource)

3. 临界区(Critical Section)

4. 同步机制应遵循的规则

2.4.2 硬件同步机制

1. 关中断

2. 利用 Test-and-Set 指令实现互斥

3. 利用 Swap 指令实现进程互斥

2.4.3 信号量机制

1. 整型信号量

2. 记录型信号量

3. AND 型信号量

4. 信号量集

2.4.4 信号量的应用

1. 利用信号量实现进程互斥

2. 利用信号量实现前趋关系

2.4.5 管程机制

1. 管程的定义

2. 条件变量

2.5 经典进程的同步问题

2.5.1 生产者 - 消费者问题

1. 利用记录型信号量解决生产者 - 消费者问题

2. 利用 AND 信号量解决生产者 - 消费者问题

3. 利用管程解决生产者 - 消费者问题

2.5.2 哲学家进餐问题

1. 利用记录型信号量解决哲学家进餐问题

2. 利用 AND 信号量机制解决哲学家进餐问题

2.5.3 读者 - 写者问题

1. 利用记录型信号量解决读者 - 写者问题

2. 利用信号量集机制解决读者 - 写者问题

2.6 进程通信

2.6.1 进程通信的类型

1. 共享存储器系统(Shared-Memory System)

2. 管道(pipe)通信系统

3. 消息传递系统(Message Passing System)

4. 客户端-服务器系统(Client-Server System)

2.6.2 消息传递通信的实现方式

1. 直接消息传递系统

2. 信箱通信

2.6.3 直接消息传递系统实例

1. 消息缓冲队列通信机制中的数据结构

2. 发送原语

3. 接收原语

2.7 线程(Threads)的基本概念

2.7.1 线程的引入

1. 进程的两个基本属性

2. 程序并发执行所需付出的时空开销

3. 线程 -- 作为调度和分派的基本单位

2.7.2 线程与进程的比较

1. 调度的基本单位

2. 并发性

3. 拥有资源

4. 独立性

5. 系统开销

6. 支持多处理机系统

2.7.3 线程的状态和线程控制块

1. 线程运行的三种状态

2. 线程控制块 TCB

3. 多线程 OS 中的进程属性

2.8 线程的实现

2.8.1 线程的实现方式

1. 内核支持线程 KST(Kernel Supported Threads)

2. 用户级线程 ULT(User Level Threads)

3. 组合方式

2.8.2 线程的实现

1. 内核支持线程的实现

2. 用户级线程的实现

2.8.3 线程的创建和终止

1. 线程的创建

2. 线程的终止

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值