传统操作系统中,程序不能独立运行,作为资源分配和独立运行的基本单位都是 进程 。操作系统的四大特征(并发,共享,虚拟,异步)也都是基于进程形成的。所以,下面记录下关于进程的一些基本概念,信息来源:计算机操作系统(第三版)。
1.1进程的基本概念
程序的并发执行,导致了操作系统中引入了进程的概念。先简述下程序的 顺序执行 和并发执行。
1.1.1 程序的顺序执行及其特征
1.程序的顺序执行
通常可以把一个应用程序分成若干个程序段,在各程序段之间,必须按照某种先后次序顺序执行,仅当 前一操作(程序段)执行后,才能执行后续操作。
例如 :I 代表输入操作, C代表计算操作 ,P为打印操作。
2.程序书序执行时的特征
(1) 顺序性:处理机的操作严格按照程序所规定的顺序 执行,即 每一操作必须在上一个操作结束之后开始。
(2) 封闭性:程序是在封闭的环境下执行的,即程序运行时独占全机资源,资源的状态(除初始状态外)只有本程序能改变。程序一旦开始执行,其执行结果不受外界因素影响。
(3) 可再现性:只要程序执行时的环境和初始条件相同,当程序重复执行时,不论它是从头到尾不停顿的执行,还是“停停走走”地执行,都将获得相同的结果。
程序顺序执行时的特征,为程序员检测和校正程序的错误带来很大方便。
1.1.2 前趋图
前趋图(Precedence Graph)是一个有向无循环图,记为 DAG(Directed Acyclic Graph), 用于描述进程之间执行的前后关系。图中的每个结点可用于描述一个程序段或进程,乃至一条语句;结点间的有向边则用于表示两个结点之间存在的偏序(Partial Order,亦称偏序关系)或前驱关系(Precedence Relation)"→"。
→={(Pi ,Pj )| Pi must complete befor Pj may start }, 如果(Pi ,Pj)∈ →,可写成 Pi →Pj ,称 Pi 是Pj 的直接前驱,而称Pj 是 Pi 的直接后继。在前趋图中,把没有前驱的结点称为初始结点(Initial Node),把没有后继的结点称为终止结点(Final Node)。此外,每个结点还具有一个重量(Weight),用于表示该节点所含有的程序量或节点的执行时间。
1.1.3 程序的并发执行及其特征
程序并发执行的特征:
1)间断性 ;
2)失去封闭性: 当处理机这一资源已被某个程序占有时,另一程序必须等待;
3) 不可再现性:程序在并发执行时,由于失去了封闭性,其计算结果已与并发程序的执行速度有关,从而使程序的执行失去了可再现性,亦即,程序经过多次执行后,虽然它们执行时的环境和初始条件相同,但是得到的结果却各不相同。
1.1.4 进程的特征与状态
1.进程的特征和意义
在多道程序环境下,程序的执行属于并发执行,此时它们将失去封闭性,并具有间断性和不可再现性的特征。这决定了通常的程序是不能参与并发执行的,为了程序能并发,且为了对并发执行的程序加以描述和控制,引进了 进程 的概念。那么进程的特征如下:
1)结构特征
通常的程序是不能并发执行的,为使程序(含数据)能独立运行,应为之配置一进程控制块,即PCB(ProcessControl Block);而由程序段、相关的数据 和PCB 三部分便构成了 进程实体。
2)动态性
进程的实质是进程实体的一次执行,因此,动态性 是进程的最基本特征 。动态性还表现在:“它由创建而产生,由调度而执行,由撤销而消亡”。
3)并发性
这是指 多个进程实体同存于内存中,且能在一段时间内同时运行。并发性是进程的重要特征,同时也成为OS的重要特征。引入进程的目的也正是为了使其进程实体能和其他进程实体 并发执行;而程序(没有建立PCB)是无法并发执行的。
4)独立性
在传统的OS中,独立性是指进程实体是一个能独立运行、独立分配资源、和独立接受调度的基本单位。但凡建立PCB的程序都不能作为一个独立的单位参与运行。
5)异步性
进程按各自独立的、不可预知的速度向前推进,或者说进程实体按异步方式运行。
进程的定义:
(1)进程是程序的一次执行
(2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动
(3)进程是程序在一个数据集合上运行的过程,他是系统进行资源分配和调度的一个独立单位。
在引入进程实体的概念后,我们可以把传统OS中的进程定义为:“进程是进程实体的运行过程,是系统资源分配和调度的一个独立单位”。
2.进程的三种基本状态
1)就绪(Ready)状态
当进程已分配到除CPU以外的所有必要资源后,只要再获得CPU,便可立即执行,进程这时的状态成为就绪状态。在一个系统中处于就绪状态的进程可能有多个,通常将它们排成一个队列,成为就绪队列。
2)执行状态
进程已获得CPU,其程序正在执行。在单机处理系统中,只有一个进程处于执行状态;在多处理机系统中,则有多个进程处于执行状态。
3)阻塞状态
正在执行的进程由于发生某事件而暂时无法继续执行时,便放弃处理机而处于暂停状态,亦即进程的执行受到阻塞,把这种暂停状态成为阻塞状态,有时也称为等待状态或封锁状态。致使进程阻塞的典型事件有:请求I/O,申请缓冲空间等。
3. 挂起状态
1)引入挂起状态的原因
在不少系统中,进程又有上述三种状态,但在另一些系统中,又增加了一些新状态,最重要的就是挂起状态。引入挂起状态的原因有:
(1)终端用户的请求。 当终端用户在自己的程序运行期间发现有可疑的问题时,希望暂时使自己的程序静止下来。亦即,使正在执行的进程暂停执行;若此时用户进程正处于就绪状态而未执行,则该进程暂时不接受调度,以便于用户研究其执行情况或对程序进行修改。我们把这种静止状态称为 挂起状态 。
(2)父进程的请求。
(3)负荷调节的需要。当实时系统中的工作负荷较重,已可能影响到对实时任务的控制时,系统会把一些不重要的进程挂起,以保证系统能正常运行。
(4)操作系统的需要。操作系统有时希望挂起某些进程,以便检查运行中的资源使用情况或进行记账。
2)进程状态的转换
在引入挂起状态后,又将增加从挂起状态(又称为静止状态)到非挂起状态(又称为活动状态)的转换,或者相反。可能有以下几种情况:
(1)活动就绪→静止就绪。 当进程处于未被挂起的就绪状态时,称此为活动就绪状态,表示为Readya,当用挂起原语Suspend 将该进程挂起后,该进程便转变为静止就绪状态,表示为Readys,处于Readys状态的进程不再被调度执行。
(2)活动阻塞→静止阻塞。 当进程处于未被挂起的阻塞状态时,称它是处于活动阻塞状态,表示为Blockeda。 当用Suspend原语将它挂起后,进程便转变为静止阻塞状态,表示为Blockeds。处于该状态的进程在其所期待的事件出现后,将从静止阻塞变成静止就绪。
(3)静止就绪→活动就绪。 处于Readys状态的进程,若用激活原语Active激活后,该进程的状态转变为Readya。
(4)静止阻塞→活动阻塞。处于Blockeds状态的进程,若干用激活原语Active激活后,该进程状态将转变为Blockeda。
4. 创建状态和终止状态
在目前实际的系统中,为了管理的需要,还存在着两种比较常见的进程状态,即创建状态和终止状态。
1)创建状态
创建一个进程一般需要通过两个步骤:首先,为一个新进程创建PCB(这是啥? Progress Control Block),并填写必要的管理信息;其次,把该进程转入就绪状态并插入就绪队列之中。当一个新进程被创建时,系统已为其分配了PCB,填写了进程标识等信息,但由于该进程所必须的资源或其他信息,如主存资源尚未分配等,一般而言,此时的进程已拥有了自己的PCB,但进程自身还未进入主存,即创建工作尚未完成,进程还不能被调度运行,其所处的状态就是创建状态。
引入创建状态,是为了保证进程的调度必须在创建工作完成后进行,以确保对进程控制块操作的完整性。同时引入创建状态的引入,也增加了管理的灵活性,操作系统可以根据系统性能或主存容量的限制,推迟创建状态进程的提交。对于处于创建状态的进程,获得了其所必需的资源,以及对其PCB初始化工作完成后,进程状态便可由创建状态转入就绪状态。
2)终止状态
进程的终止需要通过两个步骤:首先等待操作系统进行善后处理,然后将其PCB清零,并将PCB空间返还系统。当一个进程达到了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终止权的进程所终结,他将进入终止状态。进入终止状态的进程以后不能再执行,但在操作系统中依然保留了一个记录,其中保存状态码和一些计时统计数据,供其他进程收集。 一旦其他进程完成了对终止状态进程的信息提取后,操作系统将删除该进程。
下图给出了加入创建状态和终止状态后,状态衍变图:
增加了创建状态和终止状态后,具有挂起状态的进程状态及转换图:
1.1.5 进程控制块
1. 进程控制块的作用
为了描述和控制进程的运行,系统为每个进程定义了一个数据结构——进程控制块PCB(Process Control Block),它是进程实体的一部分,是操作系统中最重要的记录型数据结构。PCB中记录了操作系统所需要的、用于描述进程的当前情况下以及控制进程运行的全部信息。
进程控制块的作用是 :使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其他进程并发执行的过程。或者说,OS是根据PCB来对并发执行的进程进行控制和管理的。 在进程的整个生命周期中,系统总是通过PCB对进程进行控制的,亦即,系统时根据进程的PCB而不是任何别的而感知该进程存在的。所以说,PCB是进程存在的唯一标志。
当系统创建一个新进程时,就为它创建了一个PCB;进程结束时又回收其PCB,进程于是随之消亡。PCB可以被操作系统中的多个模块读或修改,因为PCB经常被系统访问,尤其是被运行频率高的进程及分派程序访问,故PCB应常驻内存。系统将所有的PCB组织成若干个链表(或队列),存放在操作系统中专门开辟的PCB区内。 例如:Linux系统:用task_struct数据结构描述进程控制块;Windows系统:用执行体进程块(EPROCESS)来表示进程对象属性。
2. 进程控制块中的信息
主要包含四方面信息:
1)进程标识符
进程标识符用于唯一地标识一个进程。一个进程通常有两种标识符:
(1)内部标识符。在所有的操作系统中,都为没一个进程赋予了一个唯一的数字标识符,它通常是一个进程的序号。设置内部标识符主要是为了方便系统使用。
(2)外部标识符。它由创建者提供,通常是由字母、数字组成,往往是由用户(进程)在访问该进程时使用,为了描述进程的家族关系,还应该设置父进程标识及子进程标识。还可以设置用户标识,以指示该进程的用户。
2)处理机状态
处理机状态信息主要是由处理机的各种寄存器中的内容组成。处理机在运行时,许多信息都放在寄存器中。当处理机被中断时,所有这些信息都必须保存在PCB中,以便在该进程重新执行时,能从断点继续执行。
这些寄存器包括:① 通用寄存器,又称用户可视寄存器。它们是 用户程序可以访问的,用于暂存信息,在大多数处理机中,有8~32个通用寄存器,在RISC机构的计算机中可超过100个;
②指令计数器,其中存放了要访问的下一条指令的地址。 ③ 程序状态字PSW,其中含有状态信息,如条形码、执行方式、中断屏蔽标志灯; ④用户栈指针,指每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数以及调用地址,栈指针指向该栈的栈顶。
3)进程调度信息
在PCB中还存放一些与进程调度和进程对换有关的信息,包括: ①进程状态,指明进程的当前状态,作为进程调度和对换时的依据; ② 进程优先级,用于描述进程使用处理机的优先级别的一个整数,优先级高的进程应优先获得处理机; ③进程调度所需的其他信息,它们与所采用的进程调度算法有关,比如进程已等待CPU的时间总和、进程已执行的时间总和等; ④事件,指进程由执行状态转变为阻塞状态所等待的事件,即阻塞原因。
4)进程控制信息
包括:①程序和数据的地址,指进程的程序和数据所在的内存或外存地址,以便再调度到该程序执行时,能从PCB中找到其程序和数据; ② 进程同步和通信机制,指实现进程同步和进程通信时必需的机制,如消息队列指针、信号量等,他们可能全部或部分地放在PCB中; ③ 资源清单,即一张列出了除CPU以外的进程所需的全部资源及已经分配到该进程的资源的清单; ④ 链接指针,给出本进程(PCB)所在队列中的下一个进程的PCB的首地址。
3. 进程控制块的组织方式
在一个系统中,通常可拥有数十个、数百个乃至数千个PCB。为了能对他们加以有效的管理,应该用适当的方式将这些PCB组织起来。目前常用的组织方式有以下两种:
1)链接方式
把具有同一状态的PCB,用其中的链接字 接成一个队列,这样,可以形成就绪队列、若干个阻塞队列和空白队列等。对其中的就绪队列常按进程优先级的高低排序,把优先级高的进程的PCB排在队列前面。此外,也可根据阻塞原因的不同把处于阻塞状态的进程的PCB排成等待I/O 操作完成的队列和等待分配内存的队列等。
2)索引方式
系统根据所有进程的状态建立几张索引表。例如,就绪索引表、阻塞索引表等,并把各索引表在内存的首地址记录在内存的一些专用单元中,在每个索引表中,记录具有相应状态的某个PCB在PCB表中的地址。
没了,这节就到这了。
====================================================转载不标记出处,七星瓢虫的会钻进你得水杯=====================================