Appearance
2.4 进程控制
一、进程的创建与撤销
1. 引起创建进程的典型事件
用户登录:为终端用户建立一进程
作业调度(不是进程调度):为被调度的作业建立进程
提供服务:如要打印时建立打印进程
已有进程请求:由已有进程创建子进程
2. 创建进程(create原语)的步骤
给新进程分配一个唯一的进程标识符
为进程分配空间
初始化进程控制块
- 初始化标识信息
- 初始化处理机状态信息:如使程序计数器指向程序的入口地址,使栈指针指向栈顶等。
- 初始化进程调度信息:如设置进程的状态、优先级。
建立链接:将之插入就绪或就绪/挂起链表
建立或扩充其它数据结构
3. 引起进程终止的事件
正常结束:如exit,halt, logoff
异常结束:越界错误、保护错、非法指令、特权指令错、运行超时、等待超时、 算术运算错(如被0除)、I/O故障等
外界干预:系统员kill进程、父进程请求、父进程结束
4. 进程终止过程(进程终止原语)
根据被终止进程的标识符找到其PCB,读出该进程的状态。
若该进程为执行状态,则终止其执行,调度下一个就绪进程执行。
若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控的进程。
将该进程所拥有的全部资源,或者归还给其父进程,或者归还给系统。
将被终止进程(它的PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息。
二、进程的阻塞与唤醒
1. 引起进程阻塞的事件
请求系统服务而得不到满足时:如向系统请求打印。
启动某种操作而需同步时:例如进程访问临界区,而临界区暂时被锁定。
新数据尚未到达:如进程A写,进程B读,则A未写完,B不能读。
无新工作可做。
2. 进程阻塞过程
正在执行的进程,当发现上述某事件时,由于无法继续执行,于是进程便通过调用阻塞原语block()把自己阻塞。
把进程控制块中的现行状态由“执行”改为“阻塞”,并将PCB插入阻塞队列。
调度程序将处理机分配给另一就绪进程,并进行切换。
3. 进程唤醒过程
当被阻塞进程所期待的事件出现时,则由有关进程(比如,用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。
唤醒原语执行过程:将被阻塞的进程从阻塞队列移出,将其PCB中的现行状态由“阻塞”改为“就绪”,插入到就绪队列中。
三、进程的挂起与激活
1. 进程的挂起
当出现了引起进程挂起的事件时,系统将利用挂起原语suspend( )将指定进程挂起。
2. 挂起原语的执行过程
检查被挂起进程的状态,状态改变:就绪 —> 就绪/挂起;阻塞 —> 阻塞/挂起
插入相应的队列
3. 进程的激活
当发生激活进程的事件时,则可将在外存上处于挂起状态的进程换入内存。
4. 激活原语的执行过程
利用激活原语active()将指定进程从外存调入内存;检查该进程的状态,状态改变:就绪/挂起 —> 就绪;阻塞/挂起 —> 阻塞
插入相应队列
四、进程切换
调度另一个就绪进程占用处理器执行。
进程的上下文:进程执行现场
1. 何时会发生进程切换
时钟中断:当前执行的进程执行时间超过时间片大小
I/O中断:操作系统将等待I/O事件的进程改为就绪态,并决定是继续执行当前进程,还是让更高优先级的进程抢占CPU
内存失效:当前进程访问的数据或代码不在内存(引用一个不在内存的字的虚地址)时,当前进程阻塞
陷阱:当前指令的执行出现错误或异常
系统调用:处理器移到操作系统内核例程上执行,用户进程阻塞,如file open
2. 进程切换步骤
保存处理器上下文环境,包括程序计数器和其它寄存器
更新当前处于运行状态进程的进程控制块
将进程的进程控制块移至相应队列(就绪、阻塞等)
选择另一进程执行
更新其进程控制块信息
恢复被选择进程的上下文环境
五、实现方式
进程控制由原语来实现
原语(Primitive):用于完成一定功能的过程。它是原子操作,执行过程中不允许被中断。