进程的概念和特征
进程的概念
- 为什么要引入进程?
在多道程序环境下,允许多个程序并发执行,此时它们将失去封闭性,并具有间断性及不可再现的特征。为此引入进程的概念,以便更好地描述和控制程序的并发执行,实现操作系统的并发性和共享性。
- 进程控制块(PCB)
为了使参与并发的程序能独立地运行,必须为之配置一个专门的数据结构,称为进程控制块(Process Control Block, PCB),PCB是进程存在的唯一标志。所谓创建进程,实质就是创建进程映像中的PCB,而撤销进程就是撤销进程的PCB。
- 进程映像(进程实体)
由程序段、相关数据段和PCB三部分构成了进程映像,又称进程实体。进程映像是静态的,而进程是动态的。
- 进程的定义
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
注:这里的系统资源指的是处理机、存储器和其他设备服务于某个进程的“时间”,例如把处理机资源理解为处理机的时间片才是准确的。即进程是时间片分配的独立单位,这就决定了进程的动态性和过程性。
进程的特征
- 动态性(最基本)
进程是程序的一次执行,具有生命周期。
- 并发性
多个进程实体同时存在于内存中,在一段时间内同时运行。
- 独立性
进程实体是一个独立运行、独立获取资源和接收调度的基本单位。
- 异步性
由于进程的相互制约,使得进程具有执行的间断性,即进程按各自独立的、不可预知的速度向前推进。
- 结构性
每个进程都配置一个PCB对其进行描述。
进程的状态与转换
进程有五种状态,前三种是进程的基本状态:
- 运行态
单处理机环境下,每个时刻至多一个进程处于运行态。
- 就绪态
进程获得了除处理机外的一切所需资源。
- 阻塞态(等待态)
进程等待除处理机外的资源为可用,如等待I/O完成。
- 创建态
进程正在被创建。
- 结束态
进程结束时必须先转为结束态,然后再释放资源并回收。
注:一个进程从运行态变成阻塞态是主动的行为,而从阻塞态变成就绪态是被动的行为。
进程控制
在操作系统中,把进程控制用的程序段称为原语,原语在执行期间不允许中断,它是一个不可分割的基本单位。
进程的创建
允许一个进程创建另一个进程,此时创建者为父进程,被创建者为子进程,子进程继承父进程所有的资源。
操作系统创建一个新进程的过程如下(创建原语):
- 为新进程分配一个唯一的进程标识号,并申请一个空白的PCB(数量有限),若PCB申请失败,则创建失败。
- 为进程分配资源,如内存空间,若资源不足,则进程处于阻塞态,而不是创建失败。
- 初始化PCB,包括初始化标志信息、处理机状态信息、处理机控制信息以及进程的优先级。
- 若就绪队列能够接纳新进程,则把新进程插入就绪队列,等待被调度。
进程的终止
引起进程终止的事件有:
- 正常结束,表示进程的任务已完成并准备退出。
- 异常结束,表示进程在运行时发生了异常事件,如存储区越界、保护错、非法指令、I/O故障等。
- 外界干预,指进程应外界的请求而终止运行,如操作系统干预、父进程请求和父进程终止。
操作系统终止一个新进程的过程如下(撤销原语):
- 根据被终止的进程的标识符,检索PCB,从中读出该进程的状态。
- 若被终止进程处于执行状态,则立即终止该进程,并回收处理机资源。
- 若该进程还有子进程,则终止其所有子进程。
- 把该进程的全部资源还给父进程。
- 把该PCB从队列中删除。
进程的阻塞和唤醒
进程的阻塞
正在执行的进程,由于某些期待的事件未发生,如系统资源请求失败、新数据未传达等,则
被阻塞进程自我调用阻塞原语(Block),使自己由运行态变为阻塞态。因此,进程的阻塞是一种自身的主动行为,只有运行态的进程才能转为阻塞态。
阻塞原语的执行过程如下:
- 找到将要被阻塞进程的标识号对应的PCB。
- 若该进程为运行态,则保护其现场,将其转为阻塞态,停止运行。
- 把该PCB插入相应事件的等待队列。
进程的唤醒
当被阻塞进程所期待的事件出现时,由相关进程(如提供数据的进程)调用唤醒原语(Wakeup),将等待该事件的进程唤醒。唤醒原语的执行过程如下:
- 在该事件的等待队列中找到相应进程的PCB。
- 将其从等待队列移出,转变为就绪态。
- 把该PCB插入就绪队列,等待调度程序调度。
需要注意的是,Block原语和Wakeup原语是一对刚好相反的原语,必须成对使用。Block原语由被阻塞进程自我调用实现,Wakeup原语由一个与被唤醒进程合作或被其他相关的进程调用实现的。
进程切换
进程的切换是在内核的支持下实现的,指的是处理机从一个进程的运行转到另一个进程上运行,在这个过程中,进程的运行环境产生了实质性变化。进程的切换过程如下:
- 保存处理机上下文,包括程序计数器和其他寄存器。
- 更新PCB信息。
- 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
- 选择另一个进程执行,并更新其PCB。
- 更新内存管理的数据结构
- 恢复处理机上下文。
需要注意的是,进程切换和处理机模式切换是不一样的,模式切换时,处理机逻辑上可能还在同一进程中运行,如进程因中断或异常进入核心态,执行完后又回到用户态,则操作系统只需要恢复保存的CPU现场,无需改变进程的环境信息;但若要切换进程,则当前进程改变了,当前进程的环境信息也要改变。
“调度”和“切换”的区别:调度指的是决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为,一般来说,先有资源的调度,然后才有进程的切换。
进程的组织
进程是一个独立的运行单位,是操作系统进行资源分配和调度的基本单位,一般由以下三部分组成。
- 进程控制块
PCB是进程实体的一部分,是进程存在的唯一标志。PCB常用的组织方式有链接方式和索引方式两种,链接方式把同一状态的PCB链接成一个队列;索引方式把同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB。PCB主要包括进程描述信息、进程控制和管理信息、资源分配清单和处理机相关信息。
- 进程描述信息:进程标识符(PID)、用户标识符(UID)
- 进程控制和管理信息:进程当前状态、进程优先级等
- 资源分配清单:内存地址空间、虚拟地址空间、I/O设备信息等
- 处理机相关信息:各类寄存器值、状态字
- 程序段
注意程序可被多个进程共享,即多个进程可以运行同一个程序。
- 数据段
可以是程序加工的原始数据,也可以是程序执行时产生的中间或最终结果。
进程的通信
- 共享存储
在通信的进程之间存在一块可以直接访问的共享空间,通过对这片共享空间进行读/写操作实现进程间的信息交换。对共享空间进行读/写时需要使用同步互斥工具,以实现对空间的操作进行控制。共享存储分为两种:低级方式是基于数据结构的共享;高级方式是基于存储区的共享。
- 消息传递
在消息传递系统中,数据交换是以格式化的消息(Message)为单位的。进程通过系统提供的发送消息和接收消息两个原语进行数据交换。消息传递又有两种方式:直接通信方式使用消息缓冲队列;间接通信方式使用中间实体(也称信箱),这种方式也广泛应用于电子邮件系统。
- 管道通信
管道机制需要提供以下三方面的协调能力:互斥、同步、确定对方的存在。实际上管道是一个固定大小的缓冲区,从管道读取数据是一次性操作,数据一旦被读取就会被销毁,释放空间以便写入新的数据,因此管道只能采用半双工通信。如果需要全双工通信必须定义两个管道。
管道可以理解为共享存储的优化。因为在共享存储时,若进程需要访问共享空间,必须没有其他进程在该共享空间进行写操作,否则就会被阻塞。而管道通信的缓冲区只允许一边写入、另一边读出,不必担心会因为其他进程在其中进行写操作而遭到阻塞,因为写进程会先把缓冲区写满,才让读进程读。