第二章 进程管理
2.1进前趋图和程序执行
2.1.1前趋图
前趋图(Precedence Graph)是一个有向无循环图,记为 DAG(Directed Acyclic Graph),用 于描述进程之间执行的前后关系。
2.1.2程序的顺序执行
仅当前一操作(程序段)执行完后,才能执行后继操作。例如,在进行计算时,总须先输入用户的程序和数据,然后进行计算,最后才能打印计算结果。
程序顺序执行时的特征 :
(1)顺序性;
(2)封闭性;
(3)可再现性
2.1.3程序的并发执行
在对一批程序进行处理时,可使它们并发执行。例如,输入程序在输入第一个程序后,在计算程序对该程序进行计算的同时,可由输入程序再输入第二个程序,从而 使第一个程序的计算操作可与第二个程序的输入操作并发执行。一 般来说,输入程序在输入 第 i+1 个程序时,计算程序可能正在对第 i 个程序进行计算,而打印程序正在打印第 i-1 个程序的计算结果。
程序并发执行时的特征 :
(1)间断性;
(2)失去封闭性;
(3)不可再现性;
2.2进程的描述
2.2.1进程的定义和特征
**定义:**进程是程序的一次执行。
进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
行为的规则叫程序,程序在处理机上执行时的活动称为进程。
进程的特征:
- 动态性
- 并发性
- 独立性
- 异步性
2.2.2进程的三种基本状态
1) 就绪(Ready)状态
当进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行,进程这时的状态称为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,称为就绪队列。
2) 执行状态
进程已获得 CPU,其程序正在执行。在单处理机系统中,只有一个进程处于执行状态;
在多处理机系统中,则有多个进程处于执行状态。
3) 阻塞状态
正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态, 亦即进程的执行受到阻塞,把这种暂停状态称为阻塞状态,有时也称为等待状态或封锁状态。 致使进程阻塞的典型事件有:请求 I/O,申请缓冲空间等。通常将这种处于阻塞状态的进程也 排成一个队列。有的系统则根据阻塞原因的不同而把处于阻塞状态的进程排成多个队列。
2.2.3进程控制块
1、进程控制块的作用
PCB是操作系统对并发执行的进程进行控制和管理的重要数据结构。 一个PCB对应一个进程。
2、进程控制块的内容
(1)进程标识符
(2)处理机状态
通用寄存器、指令计数器、程序状态字…
(3)进程调度信息
进程状态、进程优先级…
(4)进程控制信息
程序地址、数据地址、资源清单
3、PCB中的信息
4、PCB的组织方式
1)链接方式
把具有同一状态的 PCB,用其中 的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列 等。对其中的就绪队列常按进程优先级的 高低排列,把 优 先 级 高 的进程的 PCB 排在 队列前面。此外,也可根据阻塞原因的不 同而把处于阻塞状态的进程的 PCB 排成等待 I/O 操作完成的队列和等待分配内存的队列等
2)索引方式
系统根据所有进程的状态建立几张索引表。例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具 有相应状态的某个 PCB 在 PCB 表中的地址。
5、进程控制块在上下文切换中的作用
2.2.4进程调度
1、操作系统中有多个队列:
- 作业队列
- 就绪队列: 存储所有准备执行的进程集合。
- 设备队列: 等待某I/O设备的进程集合。每个设备拥有一个设备状态。
在进程的执行过程中,进程会在不同队列间迁移。
2、调度器
长程调度,也称为作业调度– 选择哪个进程允许进入系统。
短程调度,也称为CPU调度–选择哪个进程将被执行,并给它分配CPU。
中程调度 – 选择哪个被换出的进程应该被 换入内存。
- 短程调度器被调用的频率非常高 (milliseconds) à短程调度器执行速度必须非常快。
- 中程调度器被调用的频率较高 à中程调度器执行速度应该相对快。
- 长程调度器调用的频率较低(seconds, minutes) à 一般执行的比较慢。
- 长程调度器负责控制系统的并发度。
- 需要保证I/O约束进程和CPU约束进程达到一个较好的混合比例。
- I/O约束进程 – 花较多的时间做 I/O 而不是计算, 包含许多短CPU执行时间段。
- CPU约束进程– 花较多的时间做计算而不是I/O, 包含少量的较长的CPU执行时间段。
2.3进程控制
进程控制的主要任务是创建和撤消进程以及实现进程的状态转换。它具有以下功能:创建一个新进程,撤消一个已经运行完的进程,改变进程状态,实现进程间的通信,这就是操作系统内核(kernel)的功能。
原语(primitive)是指由机器指令构成的可完成特定功能的程序段。它是一个机器指令的集合,在执行时不能中断,是一个不可分割的整体。
在现代操作系统中,原语的执行多采用屏蔽中断的方法。随着计算机硬件的发展,还可以将原语固化。
2.3.1创建进程
通常有两种方式来创建进程
- 在系统生成时就建立起一些系统进程,例如系统调度进程;
- 经创建原语产生进程,这样的进程是非常驻的系统进程和用户进程。
当一个进程要完成规定任务时,它可以创建若干个子进程使其负担要完成任务中的部分功能。子进程同样可以创建自己的子进程,从而形成了进程家族。
进程创建原语的具体步骤如下:
1.系统为进程分配一个空白PCB,产生一个唯一的进程标识。
2.为进程映像分配地址空间。如果该进程有父进程,操作系统会根据父进程提供的要求为其进行分配;如果此进程共享已存在的地址空间,则应建立相应的链接。
3.PCB初始化。初始化PCB的参数(如进程标识名,初始CPU状态,优先数以及资源清单等),新进程的初始化状态一般为就绪态。
4.设置相应的链接,将该进程插入进程的就绪队列和家族队列中。
2.3.2终止进程
1、引起进程终止的事件
- 正常结束
表示进程的任务已经完成,准备退出运行。
- 异常结束
进程在运行时发生了某种异常事件,使程序无法继续运行。如:越界错、非法指令、算术运算错…
- 外界干预
应外界的请求而终止运行。如:操作员硬性终止、父进程请求子进程终止、父进程本身终止导致子进程终止…
2、终止进程的过程
- 根据被终止进程的标识符,从PCB集合中检索出该进程的PCB,从中读出该进程的状态。
- 若被终止进程正处于执行状态,应立即终止该进程的执行,并置调度标志为真,用于指示该进程被终止后应重新进行调度。
- 若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控的进程。
- 将被终止进程所拥有的全部资源,或者归还给其父进程, 或者归还给系统。
- 将被终止进程(它的PCB)从所在队列(或链表)中移出, 等待其他程序来搜集信息。
2.3.3进程的阻塞与唤醒
1、起进程阻塞和唤醒的事件
- 系统请求共享资源失败
- 等待某种操作的完成
- 新数据尚未到达
- 等待新任务的到达
2、进程阻塞过程
- 发现上述某事件时,由于无法继续执行,于是进程便通过调用阻塞原语block把自己阻塞。
- 立即停止执行,把进程控制块中的现行状态由“执行”改为阻塞,并将PCB插入阻塞队列。
- 将处理机分配给另一就绪进程,进行上下文件切换。
3、进程唤醒过程
- 把被阻塞的进程从等待该事件的阻塞队列中移出。
- 将其PCB中的现行状态由阻塞改为就绪
- 将该PCB插入到就绪队列中。
2.4进程通信
1、进程通信的类型
- 共享存储器系统(Shared-Memory system)
- 消息传递系统(Message passing system)
- 管道(pipe)通信
- 客户机-服务器系统(Client-Server system)
2、消息传递通信的实现方法
(1)直接通信方式
这种方式是利用send原语和receive原语实现通信的:
- send(P,message):把消息message传递到进程P。
- receive(P,message):从进程P接收消息message。
(2)间接通信方式
这种方式是利用信箱为媒介进行消息传递的。信箱是一个用来对一定数量的消息进行缓存的地方。信箱是一段存储区,每一个信箱用标识符加以区分,由信箱头和信箱体两部分组成。信箱头存放控制信息,信箱体存放消息内容。一个信箱可以被多个进程共享,这就实现了消息的广播发送。间接通信方式的send原语和receive原语如下:
- send(X,mail):邮件mail送到信箱X中。
- receive(X,mail):接收信箱X中的邮件mail。
3、管道
管道(pipe)通信是一种共享文件模式,它基于文件系统,连接于两个通信进程之间,以先进先出的方式实现消息的单向传送。管道是一个特殊文件,在内核中通过文件描述符表示。
在UNIX系统中,管道的创建是利用函数pipe()实现的。管道创建完毕后,返回两个分别用于读、写操作的文件描述符fd[0]、fd[1]。读管道时调用read()函数,利用参数fd[0]从管道中读取字节。对管道执行写操作的进程调用write()函数,利用参数fd[1]向管道写入信息。
2.5进程同步
进程同步:
指对多个相关进程在执行次序上的协调。这些进程相互合作,在一些关键点上可能需要互相等待或互通消息。
进程同步的主要任务:
使并发执行的诸进程间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
2.5.1 进程同步的基本概念
1、两种形式的制约关系(并发进程间的关系)
- 资源共享关系(间接相互制约)
进程间彼此无关,进程同步要确保诸进程互斥的访问临界资源。
- 相互合作关系(直接相互制约)
进程间存在先后次序关系,进程同步要确保诸进程在执行次序上的协调,时间上无差错。
2、临界资源
一段时间内只允许一个进程访问的资源;临界资源要求互斥的被访问。
3、临界区
各进程中访问临界资源的程序代码称为临界区。
Repeat entry section(进入区) critical section(临界区) exit section(退出区) remainder section(剩余区) until false
4、同步机制应遵循的准则
(1) 空闲让进。当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。
(2) 忙则等待。当已有进程进入临界区时,表明临界资源正在被访问,因而其它试图进入临界区的进程必须等待,以保证对临界资源的互斥访问。
(3) 有限等待。对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区, 以免陷入“死等”状态。
(4) 让权等待。当进程不能进入自己的临界区时,应 立 即 释 放 处理机,以 免 进程陷入“忙 等”状态。
2.5.2信号量机制
1、整型信号量
1965年荷兰学者Dijkstra提出信号量机制,定义一个整型信号量表示资源数目。通过两个标准的原子操作:wait(S)和signal(S)来访问。这两个操作一般被分别称为P、V操作。
P操作:记为P(S),其中S为某一信号量。则
S=S-1;
若S>=0,则进程继续运行;
若S < 0,则该进程被阻塞,并将它插入该信号量的等待队列;
**V操作:**记为V(S),其中S为某一信号量。则
S=S+1;
若S > 0,则进程继续运行;
若S<=0,则从该信号量的等待队列中移出一个进程,使其变为就绪态,然后,再返回原进程继续执行;
2、记录型信号量
整型信号量机制:
- 未遵循“让权等待”的准则;
- 进程可能处于“忙等”的状态。
记录型信号量机制:
- 整型变量value:代表资源数目;
- 进程链表指针L:链接等待该资源的进程。
(1)S.value的初值表示系统中某类资源的数目, 因而又称为资源信号量,每次wait操作意味着进程请求一个单位的该类资源,S.value:=S.value-1 。
(2)当S.value<0时,进程自阻塞,S.value的绝对值表示在该信号量链表中已阻塞进程的数目。
(3)该机制遵循了“让权等待”准则。
(4)如果S.value的初值为1,表示只允许一个进程访问临界资源,此时的信号量转化为互斥信号量。
3、AND型信号量
AND同步机制的基本思想是:
(1)将进程所有资源,一次性地全部分配给进程或者回收。
(2)采取原子操作方式:要么全部分配到进程,要么一个也不分配。
(3)在wait操作中,增加了一个“AND”条件,故称为AND同步,或称为同时wait操作
4、信号量集
(1)在记录型信号量机制中,每次只能获得或释放一个单位的临界资源。因此,当一次需N个某类临界资源时,便需要N次wait操作,显然这是低效的。
(2)在有些情况下,当资源数量低于某一下限值时,便不予以分配。因此,在每次分配之前,都必须测试该资源的数量是否大于测试值。
(3)基于上述两点,可以对AND信号量机制进行扩充,形成一般化的“信号量集”机制。
一般“信号量集”的几种特殊情况:
(1) Swait(S, d, d)。 此时在信号量集中只有一个信号量S, 但允许它每次申请d个资源,当现有资源数少于d时,不予分配。
(2) Swait(S, 1, 1)。 此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
(3) Swait(S, 1, 0)。这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。
5、信号量的应用
- 利用信号量实现进程互斥
- 利用信号量实现前趋关系
6、管程机制
1)管程的基本思想
系统中各种硬件资源和软件资源,均采用数据结构加以抽象的描述,即用少量信息和对该资源所执行的操作来表征资源,而忽略它们的内部结构和实现细节。
资源管理程序可用对该数据结构进行操作的一组过程表示,并实现对资源的管理。
2)管程的定义
把表征某种资源的一个数据结构和实现资源管理的相关过程一并称为管程。即:一个管程定义了一个数据结构和能为并发进程所执行的一组操作,这组操作能同步进程和改变管程中的数据。
2.6线程的基本概念
2.6.1线程的引入
- 引入进程是为了程序间的并发执行,以改善资源的利用率,提高系统吞吐量。
- 传统进程既是资源分配的基本单位,又是调度分派的基本单位,这使的系统在进程管理调度时的时空开销较大,速度较低。
- 引入线程将资源分配与调度分派分开,进一步提高系统的并发程度,提高系统的吞吐率和资源利用率。
2.6.2线程的特点
- 线程是进程的一个实体,是比进程更小的能被系统独立调度和分派的基本单位。
- 线程基本上不拥有系统资源,但可以与同一进程的其它线程共享该进程的全部资源。
- 同一进程的多个线程间可并发执行,它们之间可存在创建与被创建关系。
- 线程同进程一样,有就绪、阻塞、执行三种基本状态。