Skip to content

2.4 进程控制

Giovanna

About 1335 wordsAbout 4 min

2024-08-31

一、进程的创建与撤销

1. 引起创建进程的典型事件

  • 用户登录:为终端用户建立一进程

  • 作业调度(不是进程调度):为被调度的作业建立进程

  • 提供服务:如要打印时建立打印进程

  • 已有进程请求:由已有进程创建子进程

2. 创建进程(create原语)的步骤

  1. 给新进程分配一个唯一的进程标识符

  2. 为进程分配空间

  3. 初始化进程控制块

    • 初始化标识信息
    • 初始化处理机状态信息:如使程序计数器指向程序的入口地址,使栈指针指向栈顶等。
    • 初始化进程调度信息:如设置进程的状态、优先级。
  4. 建立链接:将之插入就绪或就绪/挂起链表

  5. 建立或扩充其它数据结构

3. 引起进程终止的事件

  • 正常结束:如exit,halt, logoff

  • 异常结束:越界错误、保护错、非法指令、特权指令错、运行超时、等待超时、 算术运算错(如被0除)、I/O故障等

  • 外界干预:系统员kill进程、父进程请求、父进程结束

4. 进程终止过程(进程终止原语)

  1. 根据被终止进程的标识符找到其PCB,读出该进程的状态。

  2. 若该进程为执行状态,则终止其执行,调度下一个就绪进程执行。

  3. 若该进程还有子孙进程,还应将其所有子孙进程予以终止,以防他们成为不可控的进程。

  4. 将该进程所拥有的全部资源,或者归还给其父进程,或者归还给系统。

  5. 将被终止进程(它的PCB)从所在队列(或链表)中移出,等待其他程序来搜集信息。

二、进程的阻塞与唤醒

1. 引起进程阻塞的事件

  • 请求系统服务而得不到满足时:如向系统请求打印。

  • 启动某种操作而需同步时:例如进程访问临界区,而临界区暂时被锁定。

  • 新数据尚未到达:如进程A写,进程B读,则A未写完,B不能读。

  • 无新工作可做。

2. 进程阻塞过程

  1. 正在执行的进程,当发现上述某事件时,由于无法继续执行,于是进程便通过调用阻塞原语block()把自己阻塞。

  2. 把进程控制块中的现行状态由“执行”改为“阻塞”,并将PCB插入阻塞队列。

  3. 调度程序将处理机分配给另一就绪进程,并进行切换。

3. 进程唤醒过程

  1. 当被阻塞进程所期待的事件出现时,则由有关进程(比如,用完并释放了该I/O设备的进程)调用唤醒原语wakeup(),将等待该事件的进程唤醒。

  2. 唤醒原语执行过程:将被阻塞的进程从阻塞队列移出,将其PCB中的现行状态由“阻塞”改为“就绪”,插入到就绪队列中。

三、进程的挂起与激活

1. 进程的挂起

当出现了引起进程挂起的事件时,系统将利用挂起原语suspend( )将指定进程挂起。

2. 挂起原语的执行过程

  1. 检查被挂起进程的状态,状态改变:就绪 —> 就绪/挂起;阻塞 —> 阻塞/挂起

  2. 插入相应的队列

3. 进程的激活

当发生激活进程的事件时,则可将在外存上处于挂起状态的进程换入内存。

4. 激活原语的执行过程

  1. 利用激活原语active()将指定进程从外存调入内存;检查该进程的状态,状态改变:就绪/挂起 —> 就绪;阻塞/挂起 —> 阻塞

  2. 插入相应队列

四、进程切换

调度另一个就绪进程占用处理器执行。

进程的上下文:进程执行现场

1. 何时会发生进程切换

  • 时钟中断:当前执行的进程执行时间超过时间片大小

  • I/O中断:操作系统将等待I/O事件的进程改为就绪态,并决定是继续执行当前进程,还是让更高优先级的进程抢占CPU

  • 内存失效:当前进程访问的数据或代码不在内存(引用一个不在内存的字的虚地址)时,当前进程阻塞

  • 陷阱:当前指令的执行出现错误或异常

  • 系统调用:处理器移到操作系统内核例程上执行,用户进程阻塞,如file open

2. 进程切换步骤

  1. 保存处理器上下文环境,包括程序计数器和其它寄存器

  2. 更新当前处于运行状态进程的进程控制块

  3. 将进程的进程控制块移至相应队列(就绪、阻塞等)

  4. 选择另一进程执行

  5. 更新其进程控制块信息

  6. 恢复被选择进程的上下文环境

五、实现方式

进程控制由原语来实现

原语(Primitive):用于完成一定功能的过程。它是原子操作,执行过程中不允许被中断。