进程的引入
由于早期未配置os的系统和单道批处理系统中程序是顺序执行的,然而这种方式浪费资源、系统资源利用率较低,从而出现了多道批处理系统。内存中可以同时装入多个程序,使其共享资源、并发执行。为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,于是引入了“进程”
什么是进程?
进程是程序的一次执行;
是一个程序及其数据在处理机上顺序执行时所发生的活动;
是具有独立功能的程序在一个数据集合上运行的过程,是系统进行资源进行分配和调度的一个独立单位。
进程(又称为进程实体)由三部分组成:PCB(进程控制块)、程序段和相关数据段
进程控制块PCB
1.PCB作为进程实体的一部分,记录操作系统所需的用于描述进程的当前情况以及管理进程运行的全部信息,是操作系统中最重要的记录型数据结构。我们认为,创建进程就是创建一个PCB,销毁进程也就是销毁进程的PCB。它的作用是使一个能在多道程序环境下不能独立运行的程序称为一个能独立运行的基本单位,一个能与其他进程并发执行的进程。
PCB中主要包含以下四方面的信息:
1)进程标识符:用于唯一的标识某一个进程
2)处理机状态(又称处理机上下文):主要由处理机的各种寄存器中的内容组成,当进程被切换时,处理机状态信息被保存起来以便重新执行时可以继续执行
寄存器主要包括:
通用寄存器:用于暂存信息(大多数处理机有8~32个)
指令计数器:存放将要访问的下一条指令的地址
程序状态字PSW:是运算器的一部分,分两类:一种是体现当前指令结果如是否有进位、是否为零,另一种是存放控制信息如允许中断、跟踪标志等
用户栈指针:每个用户进程都有一个或若干个与之相关的系统栈,用于存放过程和系统调用参数及调用地址,栈指针则是指向该栈的栈顶
3)进程调度信息:存储当前进程的进程状态、进程优先级、进程调度所需的其他信息(与调度算法有关的信息如进程等待CPU的时间、已执行的时间等)和事件(从执行状态到阻塞状态的原因)
4)进程控制信息:用于进程控制的信息,包括:程序和数据的地址、进程同步和通信机制、资源清单和链接指针(该进程所在队列中的下一个PCB的首地址)
2.PCB的组织方式:
在一个系统中常有数百乃至上千个PCB,为了对他们加以有效的管理,应使用适当方式将其组织起来,目前常用的有以下三种方式:
1)线性:所有的PCB都组织在一张线性表中,该表的首地址放在内存的一个专用区域,每次使用都遍历整张表,适合进程数目较少的操作系统
2)链接:将具有相同状态进程的PCB分别通过PCB中的链接字链接成一个队列,这样可以形成就绪队列、阻塞队列和空白队列等
3)索引:即系统根据进程状态不同,建立几张索引表
进程控制
进程控制是进程管理中最基本的功能,主要包括创建新进程、终止已完成的进程、将因发生异常情况而无法继续运行的进程置于阻塞状态、负责进程运行中的转换等功能。进程控制一般是由OS内核中的原语来实现的
1.操作系统内核:
OS分为若干层次,通常将一些与硬件紧密相关的模块(如中断处理程序等)、各种常用设备的驱动程序以及运行频率较高的模块(如时钟管理、进程调度和许多模块所公用的一些基本操作),这些都常驻于内存,被称为OS内核。
其目的在于:
1)便于对这些软件进行保护,防止遭受其他应用程序的破坏
2)提高OS的运行效率
相应的,系统为保护OS本身或关键数据(如PCB等)免遭破坏,也将处理机的执行方式分为两种状态:系统态和内核态
1)系统态:又称为管态或内核态。它具有较高的特权,能执行一切命令,访问所有的寄存器和存储区;
2)用户态:又称为目态。具有较低的执行权,只能执行一部分命令或访问一部分寄存器和存储区。一般情况下,应用程序都是用户态,防止破坏OS
不同的OS内核之间都有不同程度的差异,但都具有以下两大功能:
1)支撑功能:提供给OS其他众多模块所需要的一些基本操作以支撑其工作,三中最基本的支撑功能是:中断处理、时钟管理和原语操作
2)资源管理功能:包括进程管理、存储器管理、设备管理
2.进程的创建:
1)进程的层次结构(UNIX中是树状层次,Windows下所有进程没有层次结构):
OS中允许一个进程创建另一个进程,我们将创建进程的进程叫做父进程,把被创建的进程叫做子进程,子进程还可以创建孙进程,于是就出现了一个进程组。
子进程在被创建后可以继承父进程所有的资源,例如父进程打开的文件、父继承所分配到的缓冲区等。当子进程被撤销时就将所有从父进程那获得的资源还回给父进程,然而当父进程被撤销时,所有子进程也同样被撤销,将资源归还给OS。为表示进程之间的家族关系,PCB中的进程标识符中设置有家族表项。
2)进程图:
为形象的描述一个进程组而引入进程图,一个树结构的图,根节点是这个进程家族的祖先
3)引起创建进程的事件:用户登录、作业调度、提供服务、应用请求
4)进程创建:当系统中出现了创建新进程的请求后,OS便调用进程创建原语Creat按以下步骤创建一个新的进程:
①申请空白PCB
②为新进程分配其所需的资源:包括各种物理和逻辑资源,如内存、文件、I/O设备和CPU时间等
③初始化进程控制块(PCB):初始化标识信息、处理机状态信息和处理机控制信息(进程状态和优先级等)
④如果进程就绪队列可以接纳新的该进程,就将进程加入队列
3.进程的终止:
1)引起进程终止的条件:
- 正常结束:任何系统中都有一个表示进程已经运行完成的指示,运行到该指令时,就产生一个中断通知OS该进程已运行完毕
- 异常结束:指进程运行中出现了无法解决的错误导致程序无法继续执行。产生的原因有:
越界错、保护错(权限问题或访问方式非法)、非法指令、特权指令错、运行超时、等待超时、算术运算错、I/O故障
- 外界干预:操作员或操作系统干预、父进程请求、父进程终止
2)进程终止的过程:
- 根据终止进程的进程标识符在PCB集合中检索出要终止的进程,并查看改进程的状态
- 若被终止的进程正在执行则立即终止该进程,并置调度标志为真,用于指示该进程被终止后应重新进行调度
- 若该进程有子进程或孙进程则全部终止,以免变成不可控制的进程
- 将被终止进程的资源全部归还给父进程或操作系统
- 将被终止的进程(PCB)从所在队列中移除
4.进程的阻塞(block)和唤醒(wakeup)
阻塞原语block和唤醒原语wakeup使用时是成对的
1)引起进程阻塞和唤醒的事件
- 向系统请求共享资源失败
- 等待某种操作的完成
- 新数据尚未到达
- 等待新任务的到达
2)进程阻塞过程
进程在发生以上情况时变调用阻塞原语(block)将自己阻塞,可见阻塞是一个主动过程。首先将进程状态从执行改为阻塞状态并加入到阻塞队列;如果系统中设置了原因不同的阻塞队列,则将该队列插入相应队列;最后转调度程序进行调度,此时分配新的PCB,并按照新的PCB中的处理机状态设置CPU环境
3)进程唤醒过程
当阻塞进程所期待的事件发生时,则由有关进程(比如提供数据的进程)调用唤醒原语wakeup将该时间唤醒。wakeup的执行过程是:将该进程由阻塞队列移出,将其状态改为就绪,再将其加入就绪队列
5.进程的挂起(suspend)与激活(active)
1)进程的挂起
- 检查被挂起的进程的状态
- 若是活动就绪状态,便将其改成静止就绪;若是活动阻塞状态,便将其改成静止阻塞
- 为方便用户或父进程考察该进程的运行情况,而把该进程的PCB复制到某指定的内存区域
- 若被挂起的进程正在执行,则转向调度程序重新调度
2)进程的激活
- 将进程从外存调入内存,检查该进程的现行状态
- 若是静止就绪,便将其改为活动就绪;若是静止阻塞,便将其改为静止就绪
- 假如采用的是抢占调度策略,则每当有静止就绪进程被激活而加入就绪队列时,便检查是否需要重新调度,即由调度程序将被激活的进程和当前进程两者优先级进行比较
- 若被激活进程优先级低,则不必重新调度;若当前进程优先级低,则把处理机分配给被激活的进程
进程的基本状态和转换
1.三种基本状态及转换:
三种基本状态:
1)就绪(Ready)状态:指进程已处于准备好运行的状态,及进程已经分配到需要的系统资源,只要在获得CPU就可以执行
2)执行(Running)状态:指进程获得了CPU正在执行,在单处理机系统中,最多只有一个进程处于该状态
3)阻塞(Block)状态:指正在执行的进程,在执行过程中发生了某时间(如:I/O请求、申请缓冲区失败等)
2.五种状态及转换:
为满足进程控制块对数据及操作的完整性要求以及增强管理的灵活性,通常在引入两种状态:创建状态和终止状态
1)创建状态:
创建一个进程要经过以下几步:
- 首先进程申请一个空白PCB,并向PCB中填写用于控制和管理进程的信息
- 然后为该进程分配运行时所必须的资源
- 最后把该进程转入就绪状态并插入就绪队列
引入创建状态是为了保证进程的调度必须是在创建工作完成之后
2)终止状态:
进程的终止状态有以下两步:
- 首先,等待操作系统做善后处理
- 最后将其PCB清零,并将PCB空间返还给系统
当一个进程达到了自然结束点或是出现了无法克服的错误,或是被操作系统终结,则进入终止状态。进入终止状态的进程以后不能再执行,但在操作系统中保存状态码和一些计时统计数据供其他进程收集
挂起操作和进程状态的转换
1.挂起操作的引入:
1)终端用户的需要:当终端用户在运行程序期间发现有可疑问题,希望暂停程序的运行以便研究其执行情况或做一定的修改
2)父进程请求
3)符合调节的需要
4)操作系统的需要:有时希望挂起某些进程以便检查运行中的资源使用情况或进行记账
2.分别使用挂起原语Suspend和激活原语Active对进程进行挂起或激活
三种基本状态下加入挂起和激活的进程状态图:
五种状态下加入挂起和激活的进程状态图: