《操作系统教程Linux实例分析孟庆昌第2章进程管理讲课教案》由会员分享,可在线阅读,更多相关《操作系统教程Linux实例分析孟庆昌第2章进程管理讲课教案(167页珍藏版)》请在金锄头文库上搜索。
1、第2章 进程管理,2.1 进程概念 2.2 线程 2.3 进程管理 2.4 进程间通信 2.5 经典进程同步问题 2.6 管程 2.7 进程通信 2.8 Linux进程管理 习题,2.1 进 程 概 念,2.1.1 程序的顺序执行 顺序程序活动有三个主要特点: (1) 程序所规定的动作在机器上严格地按顺序执行。 (2) 只有程序本身的动作才能改变程序的运行环境。 (3) 程序的执行结果与程序运行的速度无关。,图2-1列出了几个典型的顺序程序的示意图。 其中图(a)最简单, 一条条指令顺次做下去; 图(b)表示程序代码中出现循环的情况; 图(c)表示A程序在执行过程中调用B程序, B运行完, 返
2、回A, 继续执行A的情况。,图2-1 顺序程序示意图,图2-2 非多道技术下作业执行过程,采用多道程序技术来执行同样的作业A和B, 就能大大改进系统性能, 如图2-3所示。 作业A先运行, 它运行一秒后等待输入, 此时让B运行; B运行一秒后等待输入, 此时恰好A输入完, 可以运行了就这样在CPU上交替地运行A和B。 在这种理想的情况下, CPU不空转, 其使用率升至百分之百, 并且吞吐量也随之增加了。,图2-3 多道技术下作业执行过程,2.1.3 程序并发执行的特性 资源共享和程序的并发执行使得系统的工作情况变得非常复杂, 带来一系列新的问题, 特别表现在各种程序活动的相互依赖和制约关系方面
3、。 我们分析一下图2-4中几个程序并发执行的情况。,图2-4 并发程序的执行 (a) 并发执行的程序; (b) 并发程序的关系; (c) 有制约关系的并发程序,通过上述三个例子的分析, 可以得出并发程序的三个主要特征: (1) 没有封闭性。 有共享公共变量时, 其执行结果不可再现, 就是说, 结果与相关的并发程序的相对速度有关。 (2) 程序与计算不再一一对应。 “程序”是指令的有序集合, 是“静态”的概念。 (3) 并发程序在执行期间可以互相制约。,2.1.4 进程概念的引入和描述 “进程”是操作系统的最基本、 最重要的概念之一。 引进这个概念对于理解、 描述和设计操作系统都具有极其重要的意
4、义。 但是迄今为止, 对这个概念还没有形成统一的定义, 都是从不同的角度来描述它的各个基本特征。 下面列举出比较能反映进程实质的几种定义:,(1) 进程(或任务)是可以和别的计算并发执行的计算。 (2) 进程是程序的一次执行, 是在给定内存区域中的一组指令序列的执行过程。 (3) 所谓进程, 简单说来就是一个程序在给定活动空间和初始条件下, 在一个处理机上的执行过程。 (4) 进程可定义为一个数据结构和能在其上进行操作的一个程序。 (5) 进程是程序在一个数据集合上运行的过程, 它是系统进行资源分配和调度的一个独立单位。,进程和程序是两个不同的概念, 但又有密切的联系。 它们之间的主要区别是:
5、 (1) 程序是静态概念, 本身可以作为一种软件资源长期保存着; 而进程则是程序的一次执行过程, 它是动态概念, 有一定的生命期, 是动态地产生和消亡的。,(2) 进程是一个能独立运行的单位, 能与其他进程并发执行, 进程是作为资源申请和调度单位存在的; 而通常的程序段是不能作为一个独立运行的单位的。 (3) 程序和进程无一一对应关系。 一个程序可由多个进程共用; 另一方面, 一个进程在其活动中又可顺序地执行若干个程序。,(4) 各个进程在并发执行过程中会产生相互制约关系, 造成各自前进速度的不可预测性。 而程序本身是静态的, 不存在这种异步特征。 表2-1列出了进程和程序之间的主要区别。,表
6、2-1 进程和程序的对比,2.1.5 进程的状态及其变迁 进程是一个程序的执行过程, 有着走走停停的活动规律。 进程的动态性质是由其状态变化决定的。 如果一个事物始终处于一种状态, 那么它就不再是活动的, 就没有生命力了。 通常在操作系统中, 进程至少要有三种基本状态, 这些状态是处理机挑选进程运行的主要因素, 所以又称之为进程控制状态。 这三种基本状态是: 运行态、 就绪态和阻塞态(或等待态)。 如图2-5所示。,图2-5 进程状态及其变化,在很多操作系统中, 又添加了两种基本状态: 创建态和终止态。 创建态是指新进程正被创建时的状态, 当创建工作完成后它就进入到就绪态。 终止态是指进程正常
7、或非正常终止时所处的状态, 它的必然结局是从系统中消失。 上述五种进程状态及其变迁情况如图2-6所示。,图2-6 进程的五种基本状态,2.1.6 进程的组成 进程的活动是通过在CPU上执行一系列程序和对相应数据进行操作来体现的, 因此程序和它操作的数据是进程存在的实体。 但这二者仅是静态的文本, 没有反映出其动态特性。 为此, 还需要有一个数据结构, 用来描述进程当前的状态、 本身的特性等。 这种数据结构被称为进程控制块(PCB, Process Control Block)。,程序往往由一系列函数组成。 执行函数调用时要保存好调用者的现场信息, 以便被调函数完成后能恢复调用者的运行环境。 这
8、一系列现场信息要保存在堆栈中, 按“后进先出”方式管理。 为此, 系统要为每个进程设立一个或多个栈。 所以进程通常都由程序、 栈、 数据集合和PCB这四部分组成。 图2-7示出进程的物理结构。,图2-7 进程组成,2.1.7 进程控制块 进程控制块有时也称为进程描述块(Process Descriptor), 它是进程映像中最关键的部分, 其中含有进程的描述信息和控制信息, 是进程动态特性的集中反映, 它是系统对进程施行识别和控制的依据。 在不同的系统中, PCB的具体组成成分是不同的, 在简单操作系统中它较小; 而在大型操作系统中它很复杂, 设有很多信息项。 一般来说, 进程控制块应包括如下
9、内容, 如图2-8所示。,图2-8 PCB构成,(1) 进程名。 它是惟一标志对应进程的一个标志符或数字。 (2) 特征信息。 它包括是系统进程还是用户进程, 进程映像是否常驻内存等。 (3) 进程状态信息。 它表明该进程的执行状态, 是运行态、 就绪态还是阻塞态。 (4) 调度优先权。 这表示进程获取CPU的优先级别。,(5) 通信信息。 它反映该进程与哪些进程有什么样的通信关系, 如等待哪个进程的信号等。 (6) 现场保护区。 当对应进程由于某个原因放弃使用CPU时, 需要把它的一部分与运行环境有关的信息保存起来, 以便在重新获得CPU后能恢复正常运行。,(7) 资源需求、 分配和控制方面
10、的信息。 如进程所需要或占有的IO设备、 磁盘空间、 数据区等。 (8) 进程映像信息。 指出该进程的程序和数据的存储情况, 在内存或外存的地址、 大小等。 (9) 族系关系。 它反映父子进程的隶属关系。 (10) 其他信息。 如文件信息、 工作单元等。,2.1.8 PCB的组织方式 1. 线性表方式 如图2-9所示, 线性表的方式简单, 最容易实现。 操作系统预先确定整个系统中同时存在的进程最大数目, 比如是n, 静态分配空间, 把所有的PCB都放在这个表中。,图2-9 PCB线性表,2. 链接表方式 链接表方式是经常采用的方式。 其原理是: 按照进程的不同状态分别放在不同的队列中, 如图2
11、-10所示。,图2-10 PCB链接表,3. 索引表方式 索引表方式是利用索引表记载各种状态进程的PCB地址, 如就绪索引表中的表项指向就绪进程PCB的指针, 而阻塞表中的表项指向阻塞进程PCB的指针。 各索引表的起始地址放在专用的指针单元中, 运行进程的PCB由一个专用的运行指针指向。 图2-11示出PCB索引表方式。,图2-11 PCB索引表,2.2 线 程,2.2.1 线程概念 1. 线程 线程 是进程中执行运算的最小单位, 亦即执行处理机调度的基本单位。 如果把进程理解为在逻辑上操作系统所完成的任务, 那么线程表示完成该任务的许多可能的子任务之一。,2. Thread结构 每个线程有一
12、个Thread结构, 用于保存与线程有关的信息, 主要由以下几个基本部分组成: (1) 一个惟一的线程标识符。 (2) 描述处理器状态的一组状态寄存器的内容, 用于调度。 (3) 每个Thread结构有两个堆栈指针: 一个指向核心堆栈, 一个指向用户堆栈。 (4) 一个私有存储区, 存放现场保护信息及其他各种统计信息等。,图2-12 Thread结构,3. 带线程的进程模型 一个进程可以包含一个或者多个线程, 但至少要有一个线程。 在传统的进程中就只有一个线程。 当一个进程包含多个线程时, 各线程除自己有少量私有资源(如程序计数器、 寄存器和堆栈)外, 要共享所属进程的全部资源(如程序代码、
13、数据和文件等)。 图2-13示出单线程和多线程的进程模型。,图2-13 单线程式和多线程式的进程,4. 进程与线程的关系 从以上介绍中可以看出, 进程和它的线程有如下关系: (1) 一个进程可以有多个线程, 但至少要有一个线程。 (2) 进程是资源的拥有者, 是分配资源的独立单位; 而线程一般不拥有系统资源(仅有一点必不可少的资源), 同一进程的所有线程共享该进程的全部资源。 (3) 在支持线程的操作系统中, 线程是调度和分派的基本单位。,(4) 进程可以并发执行。 (5) 线程在执行过程中往往需要协作同步。 (6) 在实施创建、 撤消和切换等操作时, 进程的开销远大于线程的开销。 (7) 线
14、程和进程一样, 都是动态实体, 具有不同的状态, 如运行态、 就绪态、 阻塞态和终止态等。,2.2.2 线程的实现方式 1. 用户级线程 在这种方式下, 整个管理线程的线程库放在用户空间, 对线程从创建到撤消的全部管理工作都由应用程序完成。 核心对线程一无所知, 只对常规进程实施管理。 图2-14(a)示出用户级线程的实现方式。,图2-14 线程的实现方式,用户级线程实现方式具有以下三个优点: (1) 线程切换速度快。 (2) 调度算法可以是应用程序专用的, 不仅最适合自己的需求, 而且不干扰底层操作系统的进程调度。 (3) 用户级线程可运行在任何操作系统上, 包括不支持线程机制的操作系统。,
15、用户级线程方式也存在两个主要缺点: (1) 系统调用的阻塞问题。 当一个线程执行系统调用时, 不仅它自己被阻塞, 而且在同一进程内的所 有线程都将被阻塞。 (2) 这种方式下的多线程应用程序不具有多处理的优点。 因为核心只为每个进程一次分配一台处理机。,2. 核心级线程 在这种方式下, 核心知道线程的存在, 并对它们实施管理。 如图2-14(b)所示。 在核心空间中不仅有一个进程表, 而且有一个线程表, 其中记载系统中所有线程的情况。 这样, 就由核心统一管理系统中所有的线程。 核心进行调度时以线程为基本单位。,核心级线程的优点是: (1) 在多处理器系统中, 核心可以同时调度同一进程的多个线
16、程, 真正实现并行操作。 (2) 一个进程的某个线程阻塞了, 核心可以调度同一进程的另一个线程运行。 核心级线程方式也存在缺点, 主要是: (1) 线程切换速度慢, 控制转移开销大。 (2) 调度算法由核心确定, 应用进程无法影响线程的切换。,2.3 进 程 管 理,2.3.1 创建进程 1. 进程图(Process Graph) 与多数操作系统对进程的管理相似, UNIX系统中各个进程构成了树型的进程族系, 如图2-15所示。,图2-15 各个进程构成了树型的进程族系,2. 进程创建过程 父进程利用系统调用(如UNIX/Linux系统中的fork)来创建子进程, 其主要过程如下: (1) 申请一个空闲的PCB。 (2) 为新进程分配资源。 (3) 将新进程