进程
- 进程
- 定义
- 进程是程序的一次执行过程,是程序在一个数据集合上顺序执行时发生的活动。
- OS 用进程描述系统的并发活动。
- 特性
- 动态性:进程是一次执行过程,是临时的,具有生命周期。
- 独立性:进程是系统进行资源分配和调度的独立单元(没有线程时),进程之间相对隔离。
- 并发性:多个进程可以交替执行。
- 结构性:OS 为每个进程建立进程控制块(PCB),结构化地描述进程信息。
- 与程序的区别
- 程序是静态、永久的,进程是动态、暂时的。
- 程序一般可以在计算机之间迁移,进程只有在一个 OS 的范围内。
- 进程包括程序、数据、PCB。
- 一个程序多次执行可以对应多个进程,一个进程可以通过调用包括多个程序。
- 进程可以创建进程,程序自身不能产生新程序。
- 定义
- PCB
- 定义
- PCB 是进程的唯一标识,也包括进程的各种信息。
- 内容
- 进程标识数/PID:区分不同进程的 ID。
- 可以有外部标识符,提供用户使用。
- 状态、调度、存储器管理信息:调度所需的必要信息
- 状态:描述进程所处的生命周期阶段。
- 调度:优先级等。
- 存储器:程序在主存、外存的地址等。
- 资源:使用的设备、打开的文件等资源。
- CPU 现场保护区:执行时的 CPU 上下文
- PC
- 程序状态字(PSW)
- SP
- 各种通用寄存器
- …
- 记账信息:使用 CPU 时间量、运行的用户等。
- 家族关系:记录父子进程信息。Windows 无。
- 进程链接指针:记录相同状态的进程(如兄弟进程)。
- 进程标识数/PID:区分不同进程的 ID。
- 实现
- PCB 可能拆分,如 Windows 使用
EPROCESS表示 PCB,其中包含KPROCESS,仅内核使用。
- PCB 可能拆分,如 Windows 使用
- 状态
- 分类
- 创建态:进程刚被创建,还进入就绪态,没有被调度。
- 运行态:正在 CPU 上运行。
- 阻塞态:正在等待某些资源,无法继续运行。
- 就绪态:不在 CPU 上运行,但是没有等待的资源,可以随时被 CPU 继续执行。
- 终止态:进程已经正常或异常结束,但是相关数据没有被清理,仍然驻留在系统中。
- 转移
- 运行态 to 阻塞态:启动 IO 设备,导致进程需要等待。
- 阻塞态 to 就绪态:IO 完成,设备发生中断,中断处理程序把阻塞进程改为就绪。
- 运行态 to 就绪态:调度被抢占或进程主动让出。
- 就绪态 to 运行态:进程被分配到 CPU。
- 分类
- 组织方式
- 线性表:PCB 都放在一个数组中。
- 链表:PCB 之间用指针相连。
- 可以拆分为多个链表,每个链表表示不同状态。
- 对于阻塞态进程,可以按照阻塞原因继续拆分链表。
- 定义
- 控制
- 定义
- 系统使用特定代码完成进程的创建、撤销、状态切换的过程。
- 进程控制由内核实现。
- 进程控制操作是原语,不能中断。
- 分类
- 创建原语
- 调用时机
- 批处理系统:每次提交作业时。
- 分时系统:每个用户登录时,创建终端进程。
- 交互式系统:运行命令、点击图标时。
- DE:打开新窗口时,每个窗口对应一个进程。
- *nix:
fork()、execve()等。 - Windows:
CreateProcess()。
- 步骤和功能
- 找到并分配一个未初始化的 PCB。
- 为新进程的分配内存,包括程序代码、数据、栈等。
- 初始化 PCB,填入 PCB 包含的所有信息。
- 把新进程加入就绪队列。
- 调用时机
- 撤销原语
- 调用时机
- *nix 调用
exit(),Windows 调用ExitProcess()。
- *nix 调用
- 步骤和功能
- 在 PCB 集合中找到对应进程的 PCB。
- 终止此进程的子进程。
- 释放资源。
- 撤销 PCB。
- 调用时机
- 阻塞原语
- 调用时机
- 进程等待事件或资源时,自动执行。
- 步骤和功能
- 中断 CPU 执行。
- 保持 CPU 现场信息至 PCB。
- 切换进程状态为阻塞态。
- 加入进程到相应事件的阻塞队列。
- 转入到调度其他进程的过程。
- *nix 的相关函数
sleep():使进程休眠指定时间,进入阻塞态。pause():使进程挂起,直到收到信号才恢复。wait():等待子进程结束,当前进程阻塞。
- 调用时机
- 唤醒原语
- 调用时机
- IO 完成后发出中断,CPU 处理中断,唤醒阻塞进程,设置为就绪态。
- 其他进程发送消息给等待进程。
- 步骤和功能
- 类似阻塞。
- *nix 的相关函数
wakeup():唤醒等待某事件的进程,使其进入就绪态。
- 调用时机
- 挂起原语
- 步骤和功能
- 实时系统:根据实时现场需要,把正在执行或没有执行的进程暂停一段时间,切换为静止状态。
- 分时系统:把进程从内存换到外存,不能被调度。
- 步骤和功能
- 解挂原语
- 步骤和功能
- 与挂起相反。
- 进程恢复为就绪态后,通常立即转入进程调度。(不一定立刻执行)
- 步骤和功能
- 创建原语
- 定义
- 调度
- 定义
- 为进程分配处理器资源。
- 级别
- 作业调度:高级调度。
- 进程调度:低级调度。
- 交换调度:中级调度。
- 把暂不具备运行条件的进程换出到外存交换区。主存就绪和主存阻塞的进程都可能被换。
- 把外存交换区中具备运行条件的进程换进主存。
- 可以控制进程对主存的使用。
- 功能
- 记录进程执行情况:及时记录进程的状态、资源需求情况到 PCB。
- 选择就绪进程占有 CPU。
- 进行进程的上下文切换。
- 上下文
- 用户级:进程的程序、数据、用户栈。
- 寄存器级:CPU 现场信息。
- 系统级:PCB、内核栈等。
- 分类
- 非抢占式:进程一直占用 CPU,直到完成或必须阻塞。
- 用于批处理系统。
- 抢占式:调度程序可以剥夺进程的 CPU 给其他进程。
- 用于分时系统、实时系统。
- 非抢占式:进程一直占用 CPU,直到完成或必须阻塞。
- 时机
- 当前进程完成或错误终止。
- 等待 IO 资源。
- 时间片用尽。
- 更高优先级进程就绪。
- 调用相关原语,包括阻塞和唤醒。
- 算法
- 先来先服务/FCFS
- 遇到大作业,增加平均周转时间。
- 最短作业优先/SJF
- 遇到大量短作业,导致长作业饥饿。
- 相应比高者优先/HRN
- 相应比 。
- 其中 为估计周转时间, 为估计运行时间, 为等待时间。
- 结合了 FCFS 和 SJF。
- 实现比较复杂。
- 相应比 。
- 优先级调度
- 分配 CPU 给最高优先级的就绪进程。
- 静态优先级:在进程创建时就确定的固定优先级。系统进程优先级更高。
- 动态优先级:根据占用 CPU 时间和等待 CPU 时间调整。
- 轮转法/RR
- 划分时间片,每个时间片调度一个就绪进程,轮流执行。
- 需要使用定时时钟中断,时间片结束后发出中断,中断处理程序转入调度。
- 时间片过短导致调度开销大,时间片过长导致响应慢。
- 多级反馈队列轮转法
- 将就绪进程分为多个队列,每个队列分配不同的时间片长度和优先级,队列分前后台。
- 前台队列使用 RR,后台使用 FCFS。
- 新进程、等待 IO 的进程先进入高优先级队列,2~3 个时间片用完未完成则降到下一队列。
- 优先调度高优先级队列中的进程。
- 高优先级进程分配短时间片,低优先级分配长时间片。
- 时间驱动法
- 用于实时系统。
- 任务调度按照预先确定的方式进行,调度程序按顺序执行任务。
- 加权轮转法
- 每个时间片的长短由进程的权重确定。
- 先来先服务/FCFS
- 定义