目录
2.1 前趋图和程序执行
2.1.1 前趋图
2.1.2 程序的顺序执行及其特征
2.1.3 程序的并发执行及其特征
2.2 进程的描述
2.2.1 进程的定义及特征
2.2.2 进程的基本状态及转换
2.2.3 进程挂起操作和进程状态的转换
区分:挂起与阻塞。
2.2.4 进程管理中的数据结构
前趋图(Precedence Graph)是一个有向无循环图(DAG:Directed Acyclic Graph),用于描述进程之间执行的先后顺序。
1. 程序的顺序执行
我们用结点(Node)代表各程序段的操作,其中 I 代表输入操作,C 代表计算操作,P 代表打印操作,用箭头指示操作的先后次序。
即使是一个程序段,也可能存在着执行顺序问题,下面示出了一个包含了三条语句的程序段:
s1: a := x + y;
s2: b := a - 5;
s3: c := b + 1;
2. 程序顺序执行时的特征
1)顺序性:处理机的操作严格按照程序所规定的顺序执行。
2)封闭性:程序运行时独占全机资源,程序一旦开始执行,其执行结果不受外界因素影响。
3)可再现性:只要程序执行时的环境和初始条件相同,都将获得相同的结果。
(不论它是从头到尾不停顿地执行,还是 “走走停停” 地执行。)
1. 程序的并发执行
对于具有下述四条语句的程序段:
s1: a := x + 2;
s2: b := y + 4;
s3: c := a + b;
s4: d := c + b;
2. 程序并发执行时的特征
1)间断性:由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间,形成了相互制约的关系。相互制约将导致并发程序具有 “执行——暂停——执行” 这种间断性的活动规律。
2)失去封闭性:多个程序共享系统中的各种资源,即这些资源的状态将由多个程序来改变,致使程序的运行失去封闭性。
3)不可再现性:程序在并发执行时,由于失去了封闭性,导致不可再现性 。
举例
有两个循环程序 A 和 B 它们共享一个变量 N,假设 N 值为 n 。
程序 A 和 B 以不同的速度运行。
1)N=N+1 在 Print(N) 和 N=0 之前执行
N=N+1 // n+1
Print(N) // n+1
N=0 // 0
2)N=N+1 在 Print(N) 和 N=0 之后执行
Print(N) // n
N=0 // 0
N=N+1 // 1
3)N=N+1 在 Print(N) 和 N=0 之间执行
Print(N) // n
N=N+1 // n+1
N=0 // 0
上述情况说明,程序在并发执行时,由于失去了封闭性,其计算结果必将与并发程序的执行速度有关,从而使程序的执行失去了可再现性。换而言之,程序经过多次执行后,虽然它们执行时的环境和初始条件相同,但得到的结果却各不相同。
1. 进程的定义
典型的进程定义有:
1)进程是程序的一次执行。
2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3)进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。
2. 进程的特征
1)结构特征
为使程序能独立运行,应为之配置一个进程控制块,即 PCB(Process Control Block);而程序段、相关的数据段和 PCB 三部分便构成了进程实体。
所谓创建进程,实质上是创建进程实体中的 PCB;而撤消进程,实质上是撤消进程的 PCB 。
上述 “程序” 包含了程序段和数据段。
2)动态性
进程的实质是进程实体的一次执行过程。
因此,动态性是进程的最基本的特征。动态性表现为 “它由创建而产生,由调度而执行,由撤消而消亡”。可见,进程实体有一定的生命期。
程序是一组有序指令的集合,其本身并不具有运动的含义,因而是静态的。
3)并发性:是指多个进程实体同存于内存中,且能在一段时间内同时运行。
4)独立性:是指进程实体是一个能独立运行、独立分配资源和独立接受调度的基本单位。
5)异步性:是指进程按各自独立的、不可预知的速度向前推进,即进程实体按异步方式运行。
1. 进程的三种基本状态
无论进程处于三种基本状态的哪一种,其程序段和数据段都是在内存里的。
1)就绪状态(Ready):当进程已分配到除 CPU 以外的所有必要资源后,只要再获得 CPU,便可立即执行。
由进程调度算法来挑选下一个执行的进程。一般情况下,每个进程在加入就绪队列时就会比较优先级,每次调度时取位于就绪队列最前的进程即可。
2)执行状态(Running):进程已获得 CPU,其程序正在执行。
时间片完时,进程回到就绪队列的末尾或者同级别进程的末尾。
3)阻塞状态(Blocked):正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,把这种暂停状态称为阻塞状态,有时也称为等待状态。
如:需要从磁盘加载数据到内存中。现在笔记本的磁盘转速一般为 5400 转/min;转速越高,耗电越大。
2. 进程的五种基本状态
1)Ready:准备执行。
2)Running:占用处理机(单处理机环境中,某一时刻仅一个进程占用处理机)。
3)Blocked:等待某事件发生才能执行,如等待 I/O 完成等。
4)New:进程已经创建,但未被 OS 接纳为可执行进程,并且程序还在外存,PCB 在内存。
PCB 是直接在内存中创建的;当内存有空间时,才将程序段和数据段装载到内存中。
5)Exit:因停止或取消,被 OS 从执行状态释放。
阻塞队列
3. 进程的状态转换
处理机就是 CPU 。
1)空 → 新状态:新创建的进程首先处于新状态。
创建进程包括申请内存空间和创建 PCB 。
2)新状态 → 就绪状态:当系统允许增加就绪进程时,操作系统接纳新建状态进程,将它变为就绪状态,插入就绪队列中。
新状态是程序段和数据段与 PCB 的第一次分离,即程序段和数据段在外存,PCB 在内存。只有当内存有空间时,才会将其装载到内存,此时进程变为就绪状态。
3)就绪状态 → 执行状态:当处理机空闲时,将从就绪队列中选择一个进程执行,该选择过程称为进程调度,或将处理机分派给一个进程,该进程状态从就绪转变为执行。
4)执行状态 → 终止状态:执行状态的进程执行完毕,或出现诸如访问地址越界、非法指令等错误,而被异常结束,则进程从执行状态转换为终止状态。
5)执行状态 → 就绪状态:分时系统中,时间片用完,或优先级高的进程到来,将中断较低优先级进程的执行。进程从执行状态转变为就绪状态,等待下一次调度。
6)执行状态 → 阻塞状态:执行进程需要等待某事件发生。通常,会因为进程需要的系统调用不能立即完成,如读文件、共享虚拟内存、等待 I/O 操作、等待另一进程与之通信等事件而阻塞。
7)阻塞状态 → 就绪状态:当阻塞进程等待的事件发生,就转换为就绪状态。进入就绪队列排队,等待被调度执行。
4. 多个进程竞争内存资源
I/O 的速度比处理机的速度慢得多,可能出现全部进程阻塞等待 I/O 。如下图所示,一开始有四个进程处于就绪状态。处理机依次对各个进程进行处理,而这四个进程都需要等待 I/O 操作,因此最终都转换成了阻塞状态。又因为这四个进程占满了内存空间,故没有处于就绪状态的新的进程,从而导致处理机空闲。
解决方法:
1)采用交换技术:换出一部分进程到外存,以腾出内存空间。
首选换出处于阻塞状态的进程。
将内存中暂时不能运行的进程,或暂时不用的数据和程序,换出到外存,以腾出足够的内存空间;把已具备运行条件的进程,或进程所需要的数据和程序,换入内存。
进程被交换到外存,状态变为挂起状态。
2)采用虚拟存储技术:每个进程只能装入一部分程序和数据(存储管理部分)。
1. 进程的挂起状态
挂起状态:是指使执行的进程暂停执行,静止下来。
1)引入挂起状态的原因
负荷调节的需要:当实时系统中的工作负荷较重,把一些不重要的进程挂起,以保证系统能正常运行。参考上述例子。
操作系统的需要:操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。* 记账:比如租借算力或者显卡时需要计算费用。
2)被挂起进程的特征
可能是等待某事件发生:若是,则阻塞条件独立于挂起条件,即使阻塞事件发生,该进程也不能执行。* 阻塞条件独立于挂起条件:当进程处于挂起状态时,它所等待的事件依然可以处于处理中。但是即使所等待的事件发生了,该进程也不能被执行。
进程是否阻塞和是否挂起并不冲突,可以既是阻塞状态又是挂起状态。
4 种状态组合
3)进程挂起状态的转换
程序段和数据段在外存就是静止。
1. 进程控制块 PCB(process control block)
作用:是进程存在的唯一标志。
特点:常驻内存。
2. 进程控制块中的信息
不同 OS 中的 PCB 数据结构有所不同。
1)进程标识符
进程标识符用于唯一标识一个进程。一个进程通常有两种标识符:
① 内部标识符。为每一个进程赋予一个唯一的数字标识符。设置内部标识符主要是为了方便系统使用。
② 外部标识符。它由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用。
2)处理机状态
处理机状态信息主要是由处理机的各种寄存器中的内容组成:
① 通用寄存器
② 指令计数器
③ 程序状态字 PSW
④ 用户栈指针
3)进程调度信息
在 PCB 中还存放一些与进程调度和进程对换有关的信息,包括:
① 进程状态
② 进程优先级
③ 进程调度所需的其它信息
④ 事件,阻塞原因
4)进程控制信息
① 程序和数据的地址
② 进程同步和通信机制
③ 资源清单
④ 链接指针
3. PCB 的组织方式
1)线性方式
将系统中的所有 PCB 组织在一张线性表中,将该表的首址存放在内存的一个专用区域中。
2)链接方式
把具有相同状态进程的 PCB 分别通过 PCB 中的链接字链接成一个队列。这样,可以形成就绪队列、若干个阻塞队列和空白队列等。
/* 等待队列示例 */
struct wait_queue {
struct task_struct * task;
struct wait_queue * next;
};
3)索引方式
系统根据所有进程状态的不同,建立几张索引表。例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中。在每个索引表的表目中,记录具有相应状态的某个 PCB 在 PCB 表中的地址。