[TOC]
- 操作系统必须全方位地管理计算机系统中运行的程序。因此,操作系统为正在运行程序建立一个管理实体——进程
- 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动
- 进程是操作系统进行资源分配和调度的一个独立单位
- (OS管理运行程序的)数据结构P
- (运行程序的)内存代码C
- (运行程序的)内存数据D
- (运行程序的)通用寄存器信息R
- (OS控制程序执行的)程序状态字信息PSW
- 运行态:进程占有处理器运行
- 就绪态:进程具备运行条件等待处理器运行
- 等待态:进程由于等待资源、输入输出、信号等而不具备运行条件
- 运行态→等待态:等待资源、I/O、信号
- 等待态→就绪态:资源满足、I/O结束、信号完成
- 就绪态→运行态;处理器空闲时选择更高优先权进程抢占
- 运行态→就绪态:运行时间片刻、有更高优先权进程
- OS无法预期进程的数目与资源需求,计算机系统在运行过程中可能出现资源不足的情况
- 运行资源不足表现为性能低和死锁两种情况
- 解决办法(进程挂起):剥夺某些进程的内存及其他资源,调入OS管理的对换区,不参加进程调度,待适当时候再调入内存、恢复资源、参与运行
- 挂起态与等待态有着本质区别,后者占有已申请到的资源处于等待,前者没有任何资源
- 选择等待态、就绪态进程进入挂起等待态
- 运行态进程可以挂起自己
- 等待事件结束后,挂起就绪态
- 一般选择挂起就绪态进程予以恢复
- 进程标识
- 用于存放唯一标识该进程的信息
- 系统分配的标识号
- 系统分配的进程组标识号
- 用户定义的进程名
- 用户定义的进程组名
- 用户可见寄存器内容
- 控制/状态寄存器内容
- 用户/核心栈指针
- 用于存放该进程运行时的处理器现场信息
- 用户可见寄存器内容:数据寄存器、地址寄存器
- 控制与状态寄存器内容:PC、IR、PSW
- 栈指针内容:核心栈与用户栈指针
- 调度相关信息:状态、等待事件/原因、优先级
- 进程组成信息:代码/数据地址、外存映像地址
- 队列指引元:进程队列指针、父子兄弟进程指针
- 通信相关信息:消息队列、信号量、锁
- 进程特权信息:内存访问权限、处理器特权
- 处理器使用信息:占用的处理器、时间片、处理器使用事件/已执行总时间、记账信息
- 资源清单信息:正占用的资源、已使用的资源
- 一些中断/异常不会引起进程状态转换,不会引起进程切换,只是在处理完成后把控制权交回给被中断进程
- (中断/异常触发)正向模式切换压入PSW/PC
- 保存被中断进程的现场信息
- 处理中断/异常
- 恢复被中断进程的现场信息
- (中断返回指令触发)逆向模式转换弹出PSW/PC
- 进程切换必须在操作系统内核模式下完成,这就需要模式切换
- 用户模式到内核模式:由中断/异常/系统调用中断用户进程执行而触发
- 内核模式到用户模式:OS执行中断返回指令将控制权交还用户进程而触发
- 中断装置完成正向模式切换,包括:
- 处理器模式转为内核模式
- 保存当前进程的PC/PSW值到核心栈
- 转向中断/异常/系统调用处理程序
- 中断返回指令完成逆向模式转换,包括:
- 从待运行进程核心栈中弹出PSW/PC值
- 处理器模式转为用户模式
- 保存被中断进程的上下文
- 转向进程调度
- 恢复待运行进程的上下文
- (中断/异常等触发)正向模式切换并压入PSW
- 保存被中断进程的现场信息
- 处理具体中断/异常
- 把被中断进程的系统堆栈指针SP值保存到PCB
- 调整被中断进程的PCB信息,如进程状态
- 把被中断进程的PCB加入相关队列
- 选择下一个占用CPU运行的进程
- 修改被选中进程的PCB信息,如进程状态
- 设置被选中进程的地址空间,恢复存储管理信息
- 恢复被选中进程的SP值到处理器寄存器SP
- 恢复被选中进程的现场信息进入处理器
- (中断返回指令触发)逆向模式转换并弹出PSW/PC
- 阻塞式系统调用、虚拟地址异常导致被中断进程进入等待态
- 时间片中断、I/O中断后发现更高优先级进程导致被中断进程转入就绪态
- 终止用系统调用、不能继续执行的异常导致被中断进程进入终止态
- 进程控制过程中涉及对OS核心数据结构(进程表/PCB池/队列/资源表)的修改
- 为防止与时间有关的错误,应使用原语
- 原语是由于若干条指令构成的完成某种特定功能的程序,执行上具有不可分割性
- 原语的执行可以通过关中断实现
- 进程控制使用的原语称为进程控制原语
- 另一类常用原语是进程通信原语
- 进程创建:进程表加一项,申请PCB并初始化,生成标识,建立映像,分配资源,移入就绪队列
- 进程撤销:从队列中移除,归还资源,撤销标识,回收PCB,移除进程表项
- 进程阻塞:保存现场信息,修改PCB,移入等待队列,调度其他进程执行
- 进程唤醒:等待队列中移除,修改PCB,移入就绪队列(该进程优先级高于运行进程触发抢占)
- 进程挂起:修改状态并出入相关队列,收回内存等资源送至对换区
- 进程激活:分配内存,修改状态并出入相关队列
- 其他:如修改进程特权
- 队列管理模块是操作系统实现进程管理的核心模块
- 操作系统建立多个进程队列,包括就绪队列和等待队列
- 按需组织为先进先出队列与优先队列
- 队列中的进程可以通过PCB中的队列指引元采用单/双指引元或索引连接
- 出队与入队操作
- 进程与资源调度围绕进程队列展开
- 进程的执行需要环境支持,包括CPU现场和Cache中的执行信息
- OS中的进程物理实体和支持进程运行的环境合成进程上下文,包括以下:
- 用户级上下文:用户程序块/用户数据区/用户栈/用户共享内存
- 寄存器上下文:PSW/栈指针/通用寄存器
- 系统级上下文:PCB/内存区表/核心栈
- 进程上下文刻画了进程的执行情况
- 某一时刻进程的内容及其执行状态集合
- 进程控制块:保存进程的标识信息、状态信息和控制信息
- 进程程序块:进程处理的数据空间,包括数据、处理函数的用户栈可修改的程序
- 核心栈:进程在内核模式下运行时使用的堆栈,中断或系统过程使用
- 进程映像是内存级的物理实体,又称为进程的内存映像
- 进程切换开销大
- 进程通信开销大
- 限制了进程并发的粒度
- 降低了并行计算的效率
- 分离两个功能,”独立分配资源“与”被调度分派执行“
- 进程作为系统资源分配和保护的独立单位,不需要频繁地切换
- 线程作为系统调度和分派的基本单位,能轻装运行,会被频繁地调度和切换
- 线程的出现会减少进程并发执行所付出的时空开销,使得并发粒度更细、并发性更好
- 在多线程环境中,进程是操作系统中进行保护和资源分配的独立单位,具有:
- 用来容纳进程映像的虚拟地址空间
- 对进程、文件和设备的存取保护机制
- 线程是进程的一条执行路径,是调度的基本单位,同一个进程中的所有线程共享进程获得的主存空间和资源。它具有:
- 线程执行状态
- 受保护的线程上下文,当线程不运行时,用于存储线程信息
- 独立的程序指令计数器
- 执行堆栈
- 容纳局部变量的静态存储器
- 线程状态有运行、就绪和睡眠,无挂起
- 与线程状态变化有关的线程操作有:
- 孵化、封锁、活化、剥夺、指派、结束
- OS感知线程环境下:
- 处理器调度对象是线程
- 进程没有三状态(或者说只有挂起状态)
- OS不感知线程环境下:
- 处理器调度对象仍是进程
- 用户空间中的用户调度程序调度线程
- 快速线程切换
- 减少(系统)管理开销
- (线程)通信易于实现
- 并行程序提高
- 节省内存空间
- 前台和后台工作
- C/S应用模式
- 加快执行速度
- 设计用户接口
- 线程管理的所有工作由OS内核来做
- OS提供了一个应用程序设计接口API,供开发者使用KLT
- OS直接调度KLT
- KLT适用于解决物理并行性问题
- 特点
- 进程中的一个线程被阻塞了,内核能调度同一进程的其他线程占用处理器运行
- 多处理器环境中,内核能同时调度同一进程中多个线程并行执行
- 内核自身也可用多线程技术实现,能提高操作系统的执行速度和效率
- 应用程序线程在用户态运行,线程调度和管理在内核实现,在同一进程中,控制权从一个线程传送到另一个线程时需要模式切换,系统开销较大
- 用户空间运行的线程库,提供多线程应用程序的开发和运行支撑环境
- 任何应用程序均需通过线程库进行程序设计,再与线程库连接后运行
- 线程管理的所有工作都由应用程序完成,内核没有意识到线程的存在
- ULT适用于解决逻辑并行性问题
- 特点
- 所有线程管理数据结构均在进程的用户空间中,线程切换不需要内核模式,能节省模式切换开销和内核的宝贵资源
- 允许进程按应用特定需要选择调度算法,甚至根据应用需要裁剪调度算法
- 能运行在任何OS上,内核在支持ULT方面不需要做任何工作
- 不能利用多处理器的优点,OS调度进程,仅有一个ULT能执行
- 一个ULT的阻塞,将引起整个进程的阻塞
- 把阻塞式系统调用改造成非阻塞式的
- 把线程陷入系统调用时,执行jacketing程序
- 由jacketing程序来检查资源使用情况,以决定是否执行进程切换或传递控制权给另一个线程
- 线程创建是完全在用户空间做的
- 单应用的多个ULT可以映射成一些KLT,通过调整KLT数目,可以达到较好的并行效果
- 特点
- 组合ULT/KLTs设施
- 线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进行
- 一个应用中的多个ULT被映射到一些(小于等于ULT数目)内核级线程上
- 程序员可以针对特定应用和机器调节KLT数目,以达到整体最佳结果
- 该方法将会结合纯粹ULT方法和KLT方法的优点,同时减少它们的缺点
- KLT负责三态,系统调用负责
- ULT负责三态,用户调度负责
- 活跃态ULT代表绑定KLT的三态
- 活跃态ULT运行时可激活用户调度
- 非阻塞系统调用可使用Jacketing启动用户调度,调整活跃态ULT