进程 PCB 进程挂起
7-1 进程定义
OS系统从只能跑一个程序到能跑多个。进程可以描述程序的执行过程。
进程:一个具有一定独立功能的程序在一个数据集合上的一次动态执行过程。
只有当一个程序被OS加载到内存中,cpu对其执行时,这个过程是动态的,称为进程。
7-2 进程的组成
包含了正在运行的一个程序的所有状态信息
程序的代码
程序处理的数据
要知道现在执行哪条指令,程序计数器中的值指示将运行的指令。
CPU寄存器会动态变化,一组通用寄存器的当前值,堆,栈等;
各种系统资源,内存,外存,网络
进程与程序的联系
程序是进程的基础,代码控制操作,可以多次执行程序,每次构成不同的进程;进程是程序功能的体现;多次执行——某一个程序对应多个进程;调用关系——某一个进程包括多个程序
多对多的映射关系
进程与程序的区别
程序静态,有序代码的集合;进程动态,执行中可以是核心态/用户态,写的代码都是用户态,但有些操作比如读写文件只能由OS完成,
OS代表进程在内核中执行,此时为核心态;
进程是暂时的,是状态变化的过程,程序永久;
组成不同,进程包括程序,数据(可能变化),进程控制块(进程状态信息)
7-3进程的特点
动态性;
并发性(在一段时间内有多个程序在执行,不同于并行,是一个时间点有多个在跑,需多个CPU即多核,进程可以被独立调度并占用处理机运行):
独立性,正确性不受影响(通过OS给不同的进程分配不同页表);
制约性,因访问共享数据/资源或进程间同步产生制约,要同步互斥;
描述进程的数据结构:进程控制块,PROCESS control block PCB
OS给每个进程都维护了一个PCB,保存与之有关的所有状态信息。
7-4 进程控制结构
PCB进程控制块:进程存在的唯一标识,操作系统管理控制进程运行所用的信息集合,描述进程的基本情况和运行变化的过程。
用PCB的生成,回收,组织管理来完成进程的创建、终止和管理。
PCB含有三大类信息:
(1) 进程标识,哪个程序在执行,执行了几次(本进程的标识),产生者标识(父进程标识),用户标识
(2) 处理机状态信息保存区,主要就是寄存器,保存进程的运行现场信息:
用户可见寄存器,程序使用的数据,地址控制和状态寄存器,程序计数器pc,程序状态字PSW栈指针,过程调用/系统调用/中断处理和返回时需要用到
(3) 进程控制信息
调度和状态信息,用于操作系统调度进程并占用处理机使用。运行状态?等待?进程当前的执行现状
进程间通信信息,各种标识、信号、信件等
进程本身的存储管理信息,即指向本进程映像存储空间的数据结构,内存信息,占了多少?要不要回收?
进程所用资源,打开使用的系统资源,如文件
有关数据结构连接信息,父进程,子进程,构成一个链,进程可以连接到一个进程队列,或链接到其他进程的PCB
PCB的组织方式:
链表(便于插删,用于通用的OS):同一状态的进程PCB为一链表,多个状态对应更多个不同的链表,就绪链表,阻塞链表
索引表(数组,不利于插删,使用于固定数目的进程,相对创建更快捷):同一状态的归入一个index表(每一个index指向PCB),就绪/阻塞索引表
7-5 进程状态
进程生命期管理:创建—>运行—>等待—>唤醒—>结束
引起进程创建的3个主要时间:系统初始化时,创建INIT进程,INIT再负责创建其他进程;用户请求创建一个NEW PROCESS,正在运行的进程执行了创建进程的系统调用。
运行:内核选择一个就绪的进程,让它占用处理机(cpu)并执行
调度算法—-如何选择?
等待(阻塞)的三种情况:请求并等待系统服务,无法马上完成;启动某种操作(和其他进程协调工作),无法马上完成;需要的数据没有到达
进程自己触发阻塞,因为只有自己才知道何时需要等待某事件
唤醒的情况:需要的资源可被满足,等待的事件到达,都意味着可将该进程的PCB插入到就绪队列
因为自身没有占用cpu执行,所以只能被OS或其他进程唤醒
结束的情形:自愿(正常退出,错误退出),强制性的(致命错误,被其他进程所杀)
7-6 进程状态变化模型
结束前的三种状态:运行态(running),就绪态(ready 获得除CPU即处理机之外的一切资源,一旦得到CPU就可以运行),等待状态(阻塞态,blocked)
进程状态变化模型
创建态(new) 已创建还没就绪
结束态(exit) 正在从OS中消失,PCB还存在
running to ready:分时-时间片到了,就切到另一个程序,这个转变为ready,由OS结合时钟完成。
new->ready:很快,只是生成pcb
进程挂起模型
7-7 进程挂起
不同于进程阻塞。挂起时没有占用该内存空间,而是映像在磁盘上。类似虚存中,有的程序段被放到了硬盘上。
Suspend:把一个进程从内存转到外存。
可以合理、充分地利用系统资源。
两种挂起状态:
阻塞挂起,进程在外存等事件blocked suspend
就绪挂起,进程在外存,但进了内存就能执行ready suspend
状态转换:
在内存中被挂起:
blocked to blocked suspend: 没有进程ready或ready进程要求更多内存时挂起,以提交新进程或运行就绪进程
ready to ready suspend: 多个就绪进程挂优先级低的,有高优先级阻塞(OS认为会很快就绪)进程和低优先ready进程时,挂低优先的就绪进程
running to ready blocked: 抢先式分时系统,空间不够或高优先级阻塞挂起进程进入就绪挂起时,正在运行的进程被就绪挂起
外存中:
blocked suspend to ready suspend: 相关事件出现时,转变为ready suspend但还在硬盘上。
解挂/激活 activate:外存到内存,需要运行该进程时
ready suspend to ready: 没有就绪进程或挂起就绪优先进程优先级高于当前就绪进程时
blocked suspend to blocked:当一个进程释放了足够内存时,OS把高优先级阻塞挂起(认为很快出现等待的事件)转换为阻塞进程
OS怎么通过PCB和定义的进程状态来管理?
以进程为基本结构的OS,底层为CPU调度程序(执行哪个?中断处理等),上面是各种进程。
OS要维护一组状态队列(重要的数据结构),表示系统中所有进程的当前状态。
就绪队列,各种类型的阻塞队列,挂起队列
PCB根据状态排入相应队列,状态变化加入和脱离队列
7-8进程的上下文切换 context switch
进程共享CPU,停止当前进程,并调度其他进程的切换叫做上下文切换。
必须切换前存储上下文,切换后恢复让进程不知道被暂停过,必须快速(上下文切换频繁),因为有时间开销所以也要尽量避免
要存储哪些context?
寄存器(pc,sp,…),CPU状态等
进程执行中要关注寄存器,PC(进程执行到了什么地方),栈指针(调用关系,相应的局部变量位置)等。
这些信息要被保存到PCB中,进程挂起时要把PCB的这些值重置,恢复到寄存器中去,使接下来进程可以继续在CPU上执行。
上下文切换的开销越小越好,且所有信息都与硬件紧密相连,所以OS中实现是用汇编代码。
需要知道哪些进程能切换?
PC为活跃进程准备了进程控制块PCB,OS将不同PCB放在不同的状态队列链表里便于选择
就绪队列
等待I/O队列—-分为每个设备的队列
僵尸队列
僵尸状态:
就是调用了EXIT但还没有wait返回的时候。将死,还没死。无法正常工作,只是等待被父进程回收。
执行EXEC()时,进程可以处于不同的状态。首先是runnig, 然后加载、运行,加载时间长要等running->blocked。