三、进程描述和控制
3.1进程
为什么需要进程这样一个东西?
-
操作系统必须交替执行多个进程,在合理的响应时间范围内使处理器的利用率达到最高
-
按照特定策略给进程分配资源,同时避免被死锁
-
支持程序间的通信和用户创建进程
3.1.1 背景
-
1.计算机平台由一组硬件资源组成,如处理器、内存、I/O设备、定时器和磁盘驱动器等等
-
2.计算机程序是用来执行某些任务而开发的
-
3.直接根据给定的硬件平台写应用程序效率是相当低下的,因此开发操作系统是为了给应用程序提供一个方拜年、安全和一致的接口。
- 4.操作总系统提供资源的统一抽象表示,可被应用程序请求和访问。
同时呢,操作系统也具有以下一些目标:
- 资源对多个应用程序是可用的
- 物理处理器在多个应用程序之间切换执行,提供并发处理能力
程序顺序执行特点:顺序性、封闭性、可再现性
程序并发设计:1.无论是操作系统程序还是用户程序,通常总是存在一些相对独立的、但又能并发执行的程序段。2.由于这些程序段可以被多个用户作业调用,一次可在同一时间间隔之内发生。这样一来,某个程序段可能对应多个”计算”已不具有一一对应关系。
程序并行执行的特点:1.间断性、2.失去封闭性(一个程序的执行会收到其他程序的影响)、3.不可再现性、外界环境在程序的两次执行期间发生变换,失去原有的可重复特征。
- 处理器和I/O设备得到充分的利用
3.1.2进程和进程控制块
进程的概念:
- 一个正在执行的程序
- 一个正在计算机上执行的程序
- 能分配给处理器并由处理器执行的实体
- 一个具有以下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系统资源集合。
也可以将进程视为由一组元素组成的实体,进程的两个基本元素是程序代码和与代码相关联的数据集。程序执行的任意时刻都可由表征进程的要素来表示。(比如:表示符、状态、优先级、程序计数器、内存指针、内存指针等等)上面这些内容存放在一个叫做进程控制块(PCB)的数据结构中。
PCB包括进程的各个要素、是对于进程的描述,是进程描述的数据结构,一个PCB可以代表一个进程。
意义在于:进程控制块中包含了足量的信息,因此可以终端一个进程的执行,并在后来恢复进程的执行,就好像没有中断过一样。
程序:完成某个功能的指令的集合。(静态)
作业:用户要求计算机给予计算的一个任务。(静态)
进程:是一个程序及其数据在处理机上顺序执行时所发生的活动。(动态)
以上三者是多对多的关系,也可以是一对多,多对一的关系。
程序与进程的区别:
- 进程是程序的执行,故进程属于动态概念,而程序是一组指令的集合,属于静态的概念
- 进程既然是程序的执行,因而有生命过程,因此它的存在是暂时的,然而程序的存在是永久的。
因此我们可以说进程是由程序代码和相关数据及进程控制块组成的
进程的特征(注意和程序的对比)
动态性:有一定的生命期。
并发性:多个进程实体,同存于内存中,能在一段时间内同时运行。
独立性:进程实体是一个能独立运行的基本单位,同时也是系统中独立获取资源和独立调度的基本单位。
异步性:进程按各自独立的、不可预知的速度向前推进,也急进程按异步方式运行。
结构特征:进程实体室友程序段、数据段及进程控制段块等部分组成——进程影像。
3.2进程状态
3.2.1 进程轨迹
从处理器的角度,它在指令序列中按照某种顺序执行指令,这样的指令序列,称为进程的轨迹。
其中,分派器(Dispatcher)即是调度器是处理器从一个进程切换到另一个进程。
3.2.2 两状态进程模型
进程可以处在两种状态之一:运行态或未运行态
3.2.3 三状态模型
-
该模型中每个状态可以分为三个状态:
-
就绪态:比如等待I/O设备的进程
-
运行态:准备就绪的程序
-
阻塞态:正在运行的程序
3.2.4 五状态模型
-
运行态:该进程正在执行
-
就绪态:正等待处理器调度执行。
-
阻塞态:等待某事件,比如I/O操作完成
-
新建态:刚刚创建,还未加入可执行组,通常是进程控制块已经创建但是还没有加载到主存中的新进程。(创建PCB加入队列)
-
退出态:操作系统从可执行进程组释放出的进程,或者是因为它本身自身停止了,或只是因为某种原因被取消。(回收PCB)
注意:由退出态的描述我们可以开出来,退出态应该是有三种来源,分别是就绪态、阻塞态和运行态,但是由图组中的表达我们可以清晰的看出来,我们的退出态只能由运行态得到。真实情况是这样的,为了清楚起见,状态图中没有表示两种变化。我们举个例子,在某些系统中,父进程可以任何时刻终止一个子进程。如果父进程终止。那么该父进程相关的子进程都将终结。
五状态模型中,我们还会将事件的”“阻塞”“原因分类,并将阻塞队列分为多个队列:
3.2.5进程挂起
处理器比I/O设备快的多,所以所有进程都在等在I/O的情况也很正常。为了释放更多的内存空间,可以将阻塞进程写入到磁盘暂时保存。当交换到磁盘上时,阻塞状态变为挂起状态。因此可以增加两个新的状态:
- 阻塞挂起:处于挂起状态,等待的事件未发生。
- 就绪挂起:处于挂起状态,等待的事件已经发上。
3.3 进程描述
这里我们来关注一个问题:要控制进程并管理资源,操作系统需要哪些信息?
3.3.1操作系统的控制结构
OS通过四种类型的实体表来记录每个进程的当前状态信息:
-
内存表
-
I/O表
-
文件表
-
进程表
**1.内存表**:用于跟踪内(实)存和外(虚)存。内存的某些部分为操作系统保存,剩余部分供进程使用,外存中保存的进程使用某种虚存或者简单的交互机制。内存表必须包换以下信息:
- 分配给进程的内存。
- 分配给进程的外存。
- 内存块或虚拟内存的任何保护属性,如哪些进程可以访问某些共享内存区域。
- 管理虚存所需要的任何信息。
(该部分会在7、8章详细展开)
2.I/O表:OS使用I/O表管理计算机系统中的I/O设备和通道。包含:
-
I/O设备的分配情况
-
I/O设备的状态信息
-
I/O设备数据传输时对应的主存位置
(该部分将在12章详细展开)
3.文件表:提供了文件是否存在、文件在外存中的位置、当前位置和其他属性的信息。(详细见12章)
**4.进程表**:本章着重讲这个part。
attention:虽然我们上面讲了四种表,但是这些表必须一某种方式连接起来或者交叉引用。
3.3.2进程控制结构
进程位置:在处理进程位置和属性的问题之前,我们需要去解决一个更为基本的问题,那就是进程的物理位置。
进程至少含有一个或者一组被执行的数据,而与这些程序相关联的是一些数据单元。因此一个进程至少应该需要一定的内存空间来保存其程序还有相关的数据。此外程序执行还需要用于参数传递的栈。最后还会有很多与进程相关的许多属性储存在**进程控制块**中。这样,程序、数据、栈、和属性的集合就被称为**进程映像**。
进程属性:进程控制块信息可以分为三部分:
-
进程标示信息(进程标示符,进程标示符可以简单的标示为主进程表中的一个索引,OS通过进程标示符来定位相应的表;内存表就组织起来提供一个内存映射,用来说明内存的哪个区域分配给了哪个进程。
进程标示符——》内存表——》内存上的位置、此外还有用户标示符,用来说明哪个用户拥有这个程序)
-
进程状态信息
-
进程控制信息
处理器状态信息:其上包括了处理器上寄存器的内容和程序状态字(标记现在处于用户态还是系统态)。
PCB(进程控制块)的组织管理:
- 线性方式:将所有的PCB部分状态组织在一个连续表中(PCB)中。该方法的优点是简单、适用于1数目不多的系统。缺点是调度起来需要扫描整个表。
- 索引方式:对于具有相同状态的进程,分别设置各自的PCB表索引表,表目为PCB在PCB表(线性表)的位置,分为了就绪索引表和等待索引表。
- 链接方式:对于具有相同状态的进程的PCB,按照进程的优先级排成一个队列,也称为PCB链。队首由固定单元中相应的队列指针表示。如此就形成了就绪队列和等待队列。这个时候PCB中就会增加存放指针的若干表目。
链式具体实现时:
- 等待队列可以有多个,他们对应着不同类型的等待原因。
- 就绪队列的排序原则跟调度策略有关,可以按照优先数排队,也可以按照”先进先出”原则排队,
3.4进程控制
3.4.1执行模式
- 用户模式,该模式下执行用户程序,权限较低
- 内核模式(控制模式、系统模式),权限更高一些。
3.4.2进程创建
- 为新的进程分配一个唯一的进程表示符。(这时主进程表中会添加一个新表项。)
- 为进程分配空间。
- 初始化PCB
- 设置正确的链接(PCB的组织管理方式)
- 创建或者扩充其他数据结构。
3.4.3进程切换
进程切换,操作系统中断一个正在进行的进程,将另一个进程至于运行的模式,并将控制权交给后者。
**合适切换进程**:首先考虑系统中断,系统中断分为两种情况:一种称为中断,一种称为陷阱。前者与当前正在运行的程序无关的某种外部事件有关,后者与当前正在运行的进程产生的错误或异常条件有关。
- 中断:
- 时钟中断:操作系统确定当前正在运行进程的执行进程是否已超过最大的允许时间(时间片),如果超过了进程就切换到就绪状态上,并且调入另一个进程。
- I/O中断:操作系统确定是否已发生I/O活动。若I/O活动是一个或者多个进程正在等待的事件,则操作系统就把所有处于阻塞态的进程转换为就绪态。
- 内存失效:处理遇到一个引用不在内存里的地址时,操作系统就必须从外存把包含这一应用的内存块掉入内存中。
- 陷阱:
- 操作系统会判断陷阱是否致命。致命时,当前正运行进程置为退出态,并切换进程。
- 不致命的话,操作系统可能会尝试恢复程序,或者简单的通知用户等等。
- 最后,操作系统可被正在执行程序的系统调用激活。调用会转移到一段操作系统代码,使用系统调用会将用户进程设置为阻塞态。
**模式切换**:(只将模式切换与进程切换的区别)
- 模式切换:指用户态和内核态之间转变,只有操作系统才有权执行模式切换指令。切换后,指令特权发生变换。
- 进程切换:指进行进程调度。
进程状态的变化:
- 保存处理器的上下文,包括程序计数器和其他寄存器。
- 更新当前处于运行状态的PCB,(包括把标记状态信息改编为另一种状态,就绪状态、阻塞状态等等)
- 把就绪状态移到相应队列中
- 选择另一个进程执行。(这个选择机制会在后面讲到)
- 更新所选进程的进程控制块,包括进程状态的修改
- 更新内存数据结构。是否需要更新取决于管理地址转换的方式。(在将内存的时候会详细展开)
- 载入程序计数器和其他寄存器中的数值。将处理器的上下文恢复到原来的状态。