文章目录
- 进程是操作系统中最基本、重要的概念。
- 是多道程序系统出现后,为了刻画系统内部出现的动态情况,描述系统内部各道程序的活动规律引进的一个概念。
- 所有多道程序设计操作系统都建立在进程的基础上
1、进程定义和属性
(1)可再入和可再用程序
- “可再入”程序(re-entrant)
- 能被多个程序同时调用的程序
- 是纯代码,即它在执行中自身不被改变;
调用它的各程序应提供工作区,因此,“可再入”程序可被多个程序同时调用。
- “可再用”程序
- 被调用过程中自身会被修改,在调用它的程序退出之前不允许其他程序来调用它。
(2)进程的定义
- 进程是程序的执行
- 并发程序称为进程
- 进程是可以和别的计算并发执行的计算
- 进程是一个数据结构及其上进行操作的程序
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
- 进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位(进程实体是由程序段、相关的数据段和进程控制块组成的)
进程是一个可并发执行的具有独立功能的程序关于某个数据集合的一次执行过程,也是操作系统进行资源分配和保护的基本单位。
(3)进程和程序的区别
- 进程(process)是一个动态的概念,而程序(program)是一个静态的概念
- 进程包含了一个数据集合和运行其上的程序
- 同一程序同时运行于若干不同的数据集合上时,它将属于若干个不同的进程,或者说,两个不同的进程也可以包含相同的程序
- 系统分配资源是以进程为单位的,所以只有进程才可能在不同的时刻处于几种不同的状态
- 既然进程是资源分配的单位,处理机也是按进程分配的,因此,从微观上看,进程是轮换占有处理机而运行的,从宏观上看,进程是并发地运行的;从局部上看,每个程序是串行执行的,从整体上看,多个进程是并发地执行的

(4)进程的六大特性
- 结构性
进程包含了数据集合和运行于其上的程序。每个进程至少包含三个组成要素:程序块、数据块和进程控制块 - 共享性
同一程序运行于不同数据集合上时,构成不同的进程。多个不同的进程可以共享相同的程序,所以进程和程序不是一一对应的
进程之间可以共享某些公用变量
进程的运行环境不再是封闭的 - 动态性
进程由创建而产生,由调度而执行,由撤销而消亡
程序是一组有序指令序列,作为一种系统资源是永久存在的 - 独立性
进程是系统中资源分配和保护的基本单位,也是系统调度的独立单位(单线程进程) - 制约性
并发进程之间存在着制约关系,进程在进行的关键点上需要相互等待或互通消息,以保证程序执行的可再现性和计算结果的唯一性 - 并发性
在一个单处理器系统环境下,各个进程轮流占用处理器
2、进程的状态和转换
(1)三态模型
一个进程从创建而产生至撤销而消亡的整个生命周期,可用一组状态加以刻划,按进程在执行过程中的状况至少定义三种不同的进程状态:
- 运行态(running):进程占有处理器正在运行
- 就绪态(ready):进程具备运行条件,等待系统分配处理器以便运行(进程已经获得了除cpu以外的所有资源后处的状态)
- 等待态(wait):又称为阻塞(blocked)态或睡眠(sleep)态,进程不具备运行条件,正在等待某个事件的完成

(2)五态模型
- 新建态:对应进程刚被创建的状态
为一个新进程创建必要的管理信息,它并没有被提交执行,而是在等待操作系统完成创建进程的必要操作 - 终止态:进程的终止
首先,等待操作系统进行善后处理
然后,退出主存
进入终止态的进程不再执行,但依然临时保留在系统中等待善后
一旦其他进程完成了对终止态进程的信息抽取之后,系统将删除该进程

(3)七态模型
进程增加的两个新状态:
- 挂起就绪态(ready suspend):表明进程具备运行条件但目前在辅助存储器中,当它被对换到主存才能被调度执行
- 挂起等待态(blocked suspend):表明进程正在等待某一个事件且在辅助存储器中

3、进程的描述和组成
(1)进程映像
某时刻进程的内容及其状态集合称为进程映像,主要包括:
- 进程程序块:即被执行的程序,规定了进程一次运行应完成的功能。通常它是纯代码,可被多个进程共享
- 进程数据块:即程序运行时加工处理的对象,包括全局变量、局部变量和常量等的存放区以及开辟的工作区,常常为一个进程专用
- 核心栈:每一个进程都将捆绑一个系统/用户堆栈,用来保存中断/异常现场,保存在函数调用的参数和返回地址
-
进程内存映像的四大基本要素:
- 程序块
- 堆栈块
- 数据块
- 进程控制块
- PCB: Process Control Block
- 进程存在的唯一标识
- 存储于操作系统空间内
(2)进程上下文
进程物理实体和支持进程运行的环境被合称为进程上下文(process context:
- 用户级上下文(user-level-context):
由用户进程的程序块、用户数据块(含共享数据块)和用户堆栈组成的进程地址空间 - 系统级上下文(system-level-context):
包括进程控制块(PCB)、内存管理信息、进程环境块,及系统堆栈等组成的进程地址空间 - 寄存器上下文(register-level-context):
由程序状态字(PSW)寄存器和各类控制寄存器、地址寄存器、通用寄存器、用户栈指针等组成
当系统调度新进程占有处理器时,新老进程随之发生上下文切换。进程的运行被认为是在上下文中执行
(3)进程控制块
- PCB 标志着进程的存在,是操作系统用于记录和刻划进程状态及有关信息的数据结构,也是操作系统掌握进程的唯一资料结构,是操作系统控制和管理进程的主要依据
- PCB 主要包含了进程执行时的情况,以及进程让出处理器后所处的状态、断点等信息
- 进程创建时建立进程控制块,进程撤销时回收进程控制块,进程控制块与进程一一对应
- PCB 主要包含三类信息:
进程的标志信息
现场信息
控制信息
(4)进程队列
将处于同一状态的所有PCB链接在一起的数据结构称为进程队列(Process Queues)
- 同一状态进程(就绪、等待、运行等)的PCB既可按先来先到FIFO的原则排成队列
- 也可按优先数或其它原则排成队列
- 等待态进程队列可以进一步细分,每一个进程按等待原因进入相应的等待队列
三种通用的队列组织方式:
- 线性方式
- 链接方式
- 索引方式
4、进程切换与模式切换
(1)进程切换
进程切换是让处于运行态的进程中断运行,让出处理器,这时要做一次进程上下文切换、即保存老进程状态而装入被保护了的新进程的状态,以便新进程运行
进程切换的实现步骤:
- 保存被中断进程的处理器现场信息
- 修改被中断进程PCB的有关信息,如进程状态等
- 把被中断进程的PCB加入相关队列
- 选择占有处理器运行的另一个进程
- 修改被选中进程的PCB的有关信息,如改为就绪态
- 修改被选中进程的地址空间,恢复存储管理信息
- 设置被选中进程的上下文信息来恢复处理器现场
(2)模式切换
当前进程从用户态到核心态或者从核心态到用户态的转换称为模式切换
- 当发生中断或者系统调用时,暂停正在运行的进程,把处理器从用户态切换到核心态,执行系统服务程序,这就是一次模式切换
- 发生模式切换时,进程仍在自己的上下文中执行
- 内核在被中断进程的上下文中进行处理
模式切换步骤:
- 保存被中断进程的处理器现场信息
- 处理器从用户态切换到核心态,以便执行系统服务程序或中断处理程序
- 如果处理中断,可根据所规定的中断级别设置中断屏蔽位
- 根据系统调用号或中断号,从系统调用表或中断入口地址标中找到系统服务程序或中断处理程序的地址
(3)四个活动范围
CPU上所执行程序在任何时刻必定处于四个活动范围:
- 进程正常运行:在用户空间中,处于进程上下文,用户进程在运行,使用用户栈
- 进程运行系统调用:在内核空间中,处于进程上下文,内核代表某进程在运行,使用核心栈(模式切换)
- 发生中断:内核空间中,处于中断上下文,与进程无关,中断服务程序正在处理特定的中断(模式切换)
- 周期性出现:内核空间中,内核线程(无用户地址空间的进程)运行于内核态
5、进程的控制和管理
(1)原语

和系统调用的区别和联系:
- 调用形式相同
原语和系统调用都使用访管指令实现 - 实现方式不同
原语由内核实现,系统调用通常由系统进程或系统服务器实现 - 运行方式不同
原语不可中断,系统调用执行时允许被中断,甚至有些操作系统中系统进程或系统服务器在用户态运行 - 服务的对象不同
通常情况下,原语提供给系统进程或系统服务器使用(反之决不会形成调用关系),系统进程或系统服务器提供系统调用给系统程序(和用户)使用,系统程序提供高层功能给用户使用
(2)进程创建

创建步骤:
- 在主进程表中增加一项,并从PCB池中取一个空白PCB
- 为新进程的进程映像分配地址空间。传递环境变量,构造共享地址空间
- 为新进程分配资源,除内存空间外,还有其他各种资源
- 初始化进程控制块(如状态、PSW、栈等),为新进程分配进程标识符
- 把进程加入就绪进程队列,或直接将进程投入运行
- 通知操作系统的某些模块,如性能监控程序
(3)进程撤销
- 正常撤销
分时系统中的注销
批处理系统中的撤离作业步 - 非正常撤销
程序运行过程中出现错误或异常
撤销步骤:
- 根据撤销进程标识号,从相应队列中找到它的PCB
- 将该进程拥有的资源归还给父进程或操作系统
- 若该进程拥有子进程,应先撤销它的所有子孙进程,以防它们脱离控制
- 撤销进程出队,将它的PCB归还到PCB池
(4)进程阻塞
- 进程阻塞是指一个进程让出处理器,去等待一个事件
- 通常,进程自己调用阻塞原语阻塞自己,所以,阻塞是自主行为,是一个同步事件。当一个等待事件结束时会产生一个中断,从而激活操作系统,在系统的控制之下将被阻塞的进程唤醒
- 进程的阻塞和唤醒是由进程切换来完成的
阻塞步骤:(主动行为)
- 停止进程执行,保存现场信息到PCB
- 修改PCB的有关内容,如进程状态由运行改为等待等
- 把修改状态后的PCB加入相应等待进程队列
- 转入进程调度程序调度其他进程运行
(5)进程唤醒
当进程期待的事件发生时,有关进程便调用唤醒原语wakeup把等待该事件的进程唤醒
唤醒步骤:(被动行为)
- 从相应等待进程队列中取出PCB
- 修改PCB有关信息,如进程状态改为就绪等
- 把修改后PCB加入有关就绪进程队列
(6)进程挂起和激活
- 挂起进程
系统资源不足
请求挂进指定进程(主动或被动) - 激活进程
主存资源充裕
请求激活指定进程(被动,具需有相应权限)
步骤:
- 挂起进程
检查要被挂起进程的状态,若处于活动就绪态就修改为挂起就绪,若处于阻塞态,则修改为挂起阻塞。被挂起进程PCB的非常驻部分要交换到磁盘对换区 - 激活进程
把进程PCB非常驻部分调进内存,修改它的状态,挂起等待态改为等待态,挂起就绪态改为就绪态,排入相应队列中。