操作系统
进程管理
进程:是程序的一次执行,
进程动态(程序静态)
-
特征
- 动态性
- 并发性
- 独立性
- 异步性
- 结构性
-
状态
- 运行态
- 就绪态:已获所需资源,一旦有处理机即刻调度
- 阻塞态(等待态):进程需要其他资源或等某事件
- 创建态
- 结束态
-
控制
-
- 创建
- (1)为进程分配一个唯一的进程标识号,并申请一个空白的PCB(PCB是有限的,如果申请失败,创建亦失败)
- (2)为进程分配资源(在PCB体现,而如果资源不足,处于阻塞态,等待资源)
- (3)初始化PCB(主要包括初始化标志信息、处理机状态信息、处理机控制信息、设置进程优先级)
- (4)插入 就绪队列,等待调度
-
- 终止
- 正常结束
- 异常结束
- 外界干预
-
- 阻塞
- (1)找到将要被阻塞进程的标识号 对应的PCB
- (2)若进程处于运行态,保护现场,将状态转为阻塞态,停止运行
- (3)把该PCB插入相应事件的等待队列,将此处理机资源调度给其他进程
-
- 唤醒
- (1)在该事件的等待队列中找到相应进程PCB
- (2)将其从等待队列中移除,并将状态转为就绪态
- (3)把该PCB插入就绪队列,等待调度
-
- 切换
- (1)保存处理机上下文(包括PC和其它寄存器)
- (2)更新PCB
- (3)把进程PCB移入相应队列(就绪/阻塞队列)
- (4)选择另一个进程执行,并更新PCB
- (5)共享内存管理的数据结构
- (6)恢复处理机上下文
-
-
组织
-
- PCB(进程控制块)【核心】
-
进程描述信息
- 进程标识符
- 用户标识符
-
进程控制信息
- 进程当前状态
- 进程优先级
- 代码运行入口地址
- 程序外存地址
- 处理机占用空间
- 信号量使用
-
资源分配清单
- 代码段指针
- 数据段指针
- 堆栈指针
- 文件描述符
- 键盘
- 鼠标
-
处理机信息
- 通用寄存器值
- 地址寄存器值
- 控制寄存器值
- 标志寄存器值
- 状态字
-
- 程序段
-
- 数据段
-
-
IPC(进程间通信)
-
- 共享存储
- 低级:基于数据结构
- 高级:基于存储区
-
- 消息传递
- 直接通信方式:发送进程 直接将 消息Message 挂在消息缓冲队列,接收进程 从队列上取消息
- 间接通信方式(信箱通信方式):发送进程 将消息 发送到 中间实体(信箱),接收进程从 中间实体取消息。eg. 电子邮件系统
-
- 管道通信:通过共享文件(pipe),发送进程(写进程)写入,接收进程(读进程)读出
-
线程:【轻量级进程】,一个最基本的CPU执行单元,程序执行流的最小单元,系统独立调度和分派的基本单元。由 线程ID、PC、寄存器集合、堆栈 组成,不拥有资源。
-
属性
-
- 轻型实体,不拥有资源,有唯一标识的标识符和线程控制块
-
- 不同线程可执行相同程序(一个被不同用户所调用,OS 为此创建多个 线程)
-
- 同一个进程的各个线程共享该进程所拥有的资源
-
- 线程是处理机的独立调度单位,多个线程可并发执行
-
- 线程 同 进程一样有生命周期,各种状态
-
-
实现方式
- 用户级线程:创建、撤销、切换都在应用程序上
- 内核级线程:所有工作由内核完成
-
多线程模型
- 多对一
优点:效率高(线程管理在用户空间运行)
缺点:一个线程在使用内核服务被阻塞,整个进程都会被阻塞;多线程不能并行运行在多处理机上 - 一对一
优点:当一个线程被阻塞,允许另一线程继续执行,并发能力强
缺点:每创建一个用户级线程都需要创建一个内核级线程 - 多对多:将n个用户级线程映射到m个内核级线程(m =< n)
集前二者优点
- 多对一
处理机调度
-
层次
-
- 作业调度(高级调度,多道批处理需要,其他系统不需要):从外存上挑选一个处于后备状态的作业分配资源
-
- 内存调度(中级调度):提高内存利用率和系统吞吐量。暂时不用的进程调至外存(挂起态),用时再调入
-
- 进程调度(低级调度):从就绪队列中选取一个进程分配处理机
-
-
方式
- 非剥夺(非抢占):正在执行态的进程进入阻塞态或完成,另一个的进程才能执行
- 剥夺(抢占):一个优先级更高,更紧急的进程可以替换 一个正在执行态的进程
-
指标
- CPU利用率
- 系统吞吐量
- 周转时间
- 等待时间:进程处于等待处理机状态之和
- 响应时间:从用户提交请求 到 系统首次响应 所用时间
-
算法
-
FCFS(先来先服务):不可剥夺算法,或结合在优先级调度算法相同优先级的使用。
简单,但效率低;
有利于长作业、CPU繁忙型作业,(相对SJF和高响应比)不利于短作业、I/O繁忙型作业; -
SJF(短作业优先):平均等待时间、平均周转时间最短
对长作业不利,未考虑作业急迫性; -
优先级调度算法
- 非剥夺式优先级调度算法 - 剥夺式优先级调度算法
- 高响应比优先
-
作业等待时间相同时,要求服务时间越短,响应比越高,有利于短作业;
要求服务时间相同时,作业的响应比由其等待时间决定,等待时间越长,其响应比越高(FCFS);
对于长作业,作业的响应比可随等待时间增加而提高,等待时间足够长时,其响应比便可升到很高,从而也可获得处理机(克服饥饿状态,兼顾长作业)
- 时间片轮转调度算法
时间片过大,退化为FIFS,过小,进程频繁切换,系统性能下降、处理机开销大
- 多级反馈队列调度算法
终端型作业:短作业优先
短批处理作业用户 :周转时间较短
长批处理作业用户 :经过前面结构队列调度部分执行,保护长期等待
- (1) 设置多个不同优先级的就绪队列,第1级队列优先级最高
- (2)对每个队列赋予不同时间片大小,优先级高时间片小
- (3)当一个新进程进入内存后,首先放入第1队级队尾,按FCFS等待调用,若时间片内完成,撤销;若未完成,进入第2级队列队尾,按FCFS等待调用....
- (4)仅当上级队列为空,可调度下一级(不为空)队列的进程允许
同步 与 互斥
-
临界资源
-
- 进入区:进入临界区前进行检查,若可以进入,则设置 正在访问临界区资源 标志,以阻止其他访问
-
- 临界区(临界段):每个进程中访问临界资源的一段代码
-
- 退出区:将 正在访问临界区资源 标志清除
-
- 剩余区:代码其余部分
-
-
同步(直接制约关系)
协调进程间工作和等待次序,eg. A完成后,B跟进工作- 【生产-消费者 问题】
对缓冲区互斥访问,生产后才能消费同步关系
mutex = 1; full = 0; empty = n; // 互斥信号量、满信号量、空信号量
producer(){
while(1) { start to Product; P(empty); P(mutex); add to Buffer; V(mutex); V(full); }
}
consumer(){
while(1) { P(full); P(mutex); remove from Buffer; V(mutex); V(empty); strat to Consume; }
} - 【读者-写者 问题】
- 【生产-消费者 问题】