调度单位 进程 / 线程#
进程状态
进程由 PCB,程序段,数据段组成
进程控制:创建、终止、阻塞 / 唤醒
进程通信:
共享内存,如全局变量,环境变量
消息传递,操作系统提供的进程通信机制
管道通信,Linux 中管道是单向的。
多线程
调度方面,在适配多线程的操作系统中,是基本调度单位
资源方面,分配给进程,而不是线程
多个线程共享同一个地址空间,不同线程不共享地址空间
开销较小
线程具有 执行、就绪、阻塞三种状态,由 TCB 表示
实现上分为内核级线程(操作系统支持的线程),用户级线程(如 Go routine)多线程模型
CPU 调度逻辑#
三层调度:高级调度(作业),从外存中取出作业,建立起相应的 PCB,获得进一步调度的机会(多道批处理中配备,但是其他系统通常没有)中级调度(内存),将暂时不能运行的进程调度到外存中,暂时保存。低级调度(进程),CPU 分配给对应进程,进程不同状态的切换
关系:作业调度创建进程,送入就绪队列,进程调度从中取出执行,中级调度将不能执行的挂起进程放入外存。
调度性能指标:
等待时间
调度实现:排队器、分派器、上下文切换器
调度时机、切换过程
不可调度的情况:中断处理中,位于内核临界区,其他完全屏蔽中断的原子操作中
需要调度的情况:发生引起调度的条件且当前进程无法继续执行(非剥夺),中断处理结束或自陷结束前,被置上请求调度标志(剥夺式调度)
调度方式:非抢占调度,抢占调度(有利于吞吐率、响应时间)
如果没有可调度进程就调度闲逛进程(ilde)
用户级线程调度,由用户线程库决定,内核级线程调度由内核调度,给一个时间片,结束后强制挂起。
调度算法#
FCFS
SJF
优先级调度:抢占式优先级,静态优先级、动态优先级
高响应比优先调度
时间片转轮调度
多级队列调度
多级反馈队列调度
进程切换过程#
上下文切换:
挂起进程,保存 CPU 上下文(寄存器)
更新 PCB
将 PCB 移入队列
选择另外进程,更新 PCB
切换 CPU 上下文,开始执行新进程
同步与互斥#
临界区
同步,A 必须等到 B 做完某操作才可以执行
互斥,A 访问 C 时,B 必须等待 A 结束访问
实现
软件实现:单标志,双标志先检查,双标志后检查,peterson
硬件实现,中断屏蔽,硬件指令 TestAndSet,Swap
互斥锁
信号量 PV
条件变量
管程
生产 - 消费
读者 - 写者
哲学家吃饭
吸烟者问题
死锁#
原因:资源竞争、同步互斥不当
条件:互斥、不剥夺、请求并保持、循环等待
死锁预防:
互斥条件:不可破坏
不剥夺条件:抢占资源(如 CPU,内存),但是不适用于打印机这类资源
请求并保持条件:运行前一次申请所有资源,不满足就不运行,导致饥饿,资源浪费
循环等待条件:顺序资源分配,给资源编号,必须按顺序请求资源,同类资源一次申请完。这种情况编号必须稳定,在资源新增时会被限制,资源浪费
死锁避免:
动态申请,单分配前计算安全性,防止进入不安全状态。如果不会进入不安全状态就分配。
系统按照某种进程推进顺序,分配所需资源,直到满足每个进程最大需求,每个进程都可完成。此时称为一个安全序列,如果无法找到一个安全序列,则是不安全状态。
银行家算法
可用资源向量 Avaliable
进程已分配资源向量 Allocation
进程最大需求资源向量 Max
检测与解除
资源分配图
死锁定理:在分配图中,找出既不阻塞,又不孤点的进程 P,消除分配边和请求边。视为释放了资源,依次做,如果能够消除所有边就称为可完全简化。否则则是出现死锁。
解除:资源剥夺,进程撤销,进程回退(需要还原点)。