操作系统-进程
进程描述
进程控制块PCB(Process Control Block)
为了方便控制管理每个程序的独立运行,在操作系统中为之配置了一种专门的数据结构,称为进程控制块。
进程实体:又称进程映像。由程序段、相关数据段和PCB三部分构成。
PCB在进程切换中的作用
系统是根据PCB来感知进程存在的。操作系统可以通过对PCB进行修改实现进程的切换
进程的定义
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行时所发生的活动
- 进程是具有独立功能的程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
进程使得作业的并发执行得以实现。
引发的问题
- 增加了空间开销:需要为进程创建PCB
- 增加了时间开销:需要管理、跟踪、协调进程的执行
- 增加了控制难度
进程状态
五种状态
根据进程所拥有资源不同,划分为5种状态:
- 就绪状态:进程已获取到了除了处理器之外执行所需的所有资源
- 执行状态:进程已获取到了包括处理器在内执行所需的所有资源
- 阻塞状态:进程在执行过程种因等待某事件的发生而无法继续执行
- 创建状态:进程缺少完整PCB与运行所需资源
- 终止状态:进程释放所拥有资源的过程
就绪状态、执行状态、阻塞状态,称为进程的基本状态。
PCB的组织方式
不同应用可以产生很多异类进程,一个应用可以产生很多同类进程。无论是什么进程,按照它们的状态将它们组织到一起,常见的组织方式有两种:
- 链表方式:同一状态的进程的PCB组成一个链表,多种状态的进程PCB组成多个链表,此时会产生诸如就绪链表、阻塞链表等不同链表
- 索引表方式:所用PCB都放入同一链表,再为每种状态创建出不同的PCB索引链表
状态转换
- 创建完成的进程直接到达的是就绪态
- 就绪态不可能直接进入阻塞态
- 进程只能是在执行时终止
挂起与激活
挂起是将进程由活动状态变为静止状态,激活是将进程由静止状态变为活动状态
- 静止就绪态不能直接使用CPU
- 静止阻塞态等待的事件发生会进入静止就绪态
挂起的作用:
- 满足终端用户的需求
- 满足父进程的需求
- 满足负载调节的需求
进程控制
进程创建
父子进程
进程一般是由OS内核创建,但是也允许使用一个用户进程去创建另一个进程。此时这个用户进程被称为父进程,被创建的进程称为子进程。子进程还可以再创建出更多的孙子进程,最终呈现树形结构。
子进程可以继承父进程的所有资源,且父进程不能拒绝子进程的继承权。当子进程终止时,会将其从父进程获取到的资源全部归还给父进程
父进程可以管理子进程的生命周期。父进程在终止时会将所有子进程全部终止。
在Windows种,父子进程不存在层级结构,所有进程具有同等的地位,但父进程在创建子进程时会获得子进程的句柄,可以实现对子进程的控制。
进程创建事件
一般有三类典型事件需要创建进程:
- 用户登录:在分时系统种,用户登录后,系统内核会为用户创建一个进程
- 作业调度:在多道批处理系统种,当作业调度程序调度到某作业后,会将其装入内存,并由系统内核为该作业创建一个进程
- 请求处理:当某进程在运行过程中剔除某种请求后,系统内核或主进程会创建一个相应的子进程来处理该请求
进程创建过程
进程的创建都是调用了进程创建原语完成的。进程创建原语的创建过程如下:
- 生成进程标识符PID,进程的唯一数字标识符
- 申请空白PCB
- 为进程分配除了CPU之外所需的一切资源
- 初始化PCB,填写自己和父进程PCB所需的信息
- 将进程写入就绪队列或静止就绪队列
进程终止
进程终止事件
典型的事件有三类:
- 正常结束:当进程的任务执行完毕后,进程会发出一条终止指令,此时会产生终端,通知OS马上终止
- 异常结束:进程运行过程种发生了某种异常,导致进程无法继续运行(如访问越界、非法指令、权限异常、运行超时、IO异常)
- 外界干预:进程被外界干预终止(如用户直接终止、OS终止、父进程终止)
进程终止过程
OS会调用进程终止原语去终止进程,进程终止的原语过程如下:
- 根据被终止进程的PID,找到其PCB
- 从PCB中读取其状态,若进程处于执行态,则立即终止执行。并置调度标志为真,标识该进程可以被重新调度
- 从PCB中读取其子进程PID,若该进程还有子进程,则终止其所有子进程
- 从PCB中读取其所拥有的全部资源,全部释放
- 将该进程的PCB从PCB队列或链表中移除
- 释放该PCB空间
进程阻塞与唤醒
进程在执行过程中突然发生了执行条件缺失,进而暂停进程等待条件满足的事件被称为阻塞,当其具备了执行条件,从而继续执行的事件被称为唤醒。
阻塞是进程自身的一种主动行为
唤醒是相关进程调用唤醒原语,将阻塞进程唤醒,是一种被动行为
典型引发进程阻塞的事件:
- 等待资源:在运行的过程中需要某种资源,由于系统中的该类资源已被其它进程所使用,无法分配其资源。
- 等待IO完成:当进程启动IO操作后,如果该进程必须在该IO操作完成后才能继续执行,则会先将进程阻塞
- 等待数据到达:对于相互合作的进程,如果一个进程专门用于处理由其它进程提供的数据,那么在其它进程提供的数据到来之前,这个进程将一直处于阻塞状态。
- 等待任务到达:对于某些系统中,特别是在分布式系统环境中,往往会设置一些特定功能的进程,每当完成特定任务后就会把自己阻塞起来,等待新任务的到来。
进程阻塞过程:
- 立即暂停CPU的执行,保留当前CPU的现场
- 将PCB中的状态由执行态修改为阻塞态
- 将PCB写入到相应阻塞原因的阻塞队列
- 启用调度程序进行重新调度,即将CPU分配给另一就绪进程
- 按照新进程的PCB设置CPU的新环境
进程唤醒过程:
- 将该进程的PCB从 阻塞队列移除
- 修改PCB中的状态由阻塞变为就绪
- 将PCB插入到就绪队列
图片来源于网络