调度时机:内核对中断/异常/系统调用处理后返回到用户态时
进程切换:---
切换全局页目录以加载一个新的地址空间
切换内核栈和硬件上下文,其中硬件上下文包括了内核执行新进程需要的全部信息
切换过程包括了对原来进程各种状态的保存和对新进程各种状态的恢复
上下文切换步骤:
场景:进程A下cpu,b上cpu
上下文切换开销:
直接开销:内核完成切换所用的cpu的时间
保存和恢复寄存器
切换地址空间
间接开销
高速缓存(cache)、缓冲区缓存(buffer cache)TLB(translation lookup buffer)失效
调度算法衡量指标:
吞吐量throughput
周转时间TT
响应时间RT
其他
cpu利用率
等待时间
进程优先级(数)
优先级 优先数
静态优先级
进程创建时指定,运行过程中不在改变
动态优先级
进程创建时指定了一个优先级,运行过程中可以动态变化
抢占与非抢占:
I/O密集型或I/O型:
频繁的进行I/O,通常会花费很多时间等待I/O操作
CPU密集型:
需要大量的cpu时间进行计算
时间片:
一个时间段,分配给调度上cpu的进程,确定了允许该进程运行的时间长度
批处理系统中采用的调度算法:
先来先服务:
1,先进先出
2,按照进程就绪的先后顺序使用cpu
3,非抢占
改变调度顺序:p2 p3 p1
短作业优先SJF:
具有最短完成时间的进程优先执行
非抢占式
最短剩余时间优先:
SJF抢占式版本:当一个新就绪的进程比当前进程具有更短的完成时间时,系统抢占当前进程,选择新就绪的进程执行
---改善周转时间
有缺点:
最短的平均周转时间
不公平-----产生“饥饿”现象
最高相应比优先HRRN:----折中权衡
综合算法
调度时,首先计算每个进程的响应比R;之后,总是选择R最高的进程执行
交互式系统中采用的调度算法:
时间片轮转调度算法:
目标:
为短任务改善平均响应时间
解决问题思路:
周期性切换
每个进程分配一个时间片
时钟中断--->轮换
优缺点:
公平
有利于交互式计算,响应时间快
由于进程切换,时间片轮转算法要花费较高的开销
假设时间片10ms,如果进程切换花费0.1ms,cpu开销1%
虚拟轮转法(virtual RR)
最高优先级调度算法:
通常:
优先级反转问题:
又称:优先级反置,倒挂,翻转
现象:
一个低优先级进程持有一个高优先级进程所需的资源,使得高优先级进程等待底优先级进程运行
解决方案:
设置优先级上限
优先级继承
使用中断禁止
多级反馈队列调度算法:
1,设计多个就绪队列,第一级队列优先级最高
2,给不同就绪队列中的进程分配长度不同的时间片,第一级队列时间片最小,随着队列优先级的降低,时间片增大
3,当第一级队列为空,第二级队列调度
4,各级队列按时间片轮转方式进行调度
5,当一个新创建进程就绪后,进入第一级队列6,进程用完时间片,而放弃cpu,进入下一级就绪队列
7,由于阻塞而放弃cpu的进程进入相应的等待队列,一旦等待事件发生,该进程回到原来一级就绪队列(??)
----回到队首还是队尾 ----再次被调度上cpu时,对时间片的处理-----》非抢占式
若允许抢占:
1,当有一个优先级更高的进程就绪时,可以抢占cpu
----被抢占的进程回到原来以及就绪队列末尾(或者?)
各种调度算法比较:
FCFS:先来先服务调度算法
Round Robin:轮询调度算法
SJF:最短作业优先调度算法
SRTN:最短剩余时间调度算法
HRRN:最高响应比优先调度算法
Feedback:多级反馈队列调度算法
多处理其调度算法需要考虑的问题:
1,在哪一个cpu上执行
2,考虑在多个cpu之间迁移时的开销
---高速缓存失效,TLB失效
---尽可能使进程总在同一个cpu上执行
3,考虑负载均衡
windows线程调度:
1,调度单位:线程
2,采用基于动态优先级的,抢占式调度,结合时间配额的调整
引发线程调度的条件:
1,线程的优先级的改变
2,一个线程改变了它的亲和(affinity)处理机集合
分为32个优先级:
时间配额:
1,不是一个时间长度值,而一个称为配额单位的整数
2,一个线程用完了自己的时间配额时,如果没有其他相同优先级的线程,windows将重新给该线程分配一个新的时间配额,让它继续运行
时间配额的一种特殊作用:
windows调动策略:
1,主动切换
2,抢占
3,时间配额用完
1,主动切换
2,抢占
当线程被抢占时,它被放回相应优先级的就绪队列的队首
1,处于实时优先级的线程在被抢占式,时间配额被重置为一个完整的时间配额
2,处于可变优先级的线程在被抢占时,时间配额不变,重新得到cpu后将运行剩余的时间配额
3,时间配额用完
假设:线程A的时间配额用完
---A的优先级没有降低:
1,如果队列中有其他就绪线程,选择下一个线程执行就,A回到原来就绪队列末尾
2,如果队列中没有其他就绪队列,系统给线程A分配一个新的时间配额,让它继续运行
---A的优先级降低,windows选择一个更高的优先级线程
windows的调度策略:
1,如何体现对某类线程的倾向性
2,如何解决由于调度策略中潜在的不公平,而带来的饥饿现象
3,如何改善系统吞吐量,相应时间等整体特征
解决方案:
1,提升线程优先级
2,给线程分配一个更大的时间配额
windows会提升线程优先级的情况:
1,I/O操作完成
2,信号量或事件等待结束
3,前台进程中的线程完成一个等待操作
4,由于窗口活动而唤醒窗口线程
5,线程处于就绪态超过了一定的时间还没有运行---饥饿现象
针对可变线程级范围内(1-15)
I/O操作完成后的优先级提升:
1,在完成I/O操作后,windows将临时提升等待该操作线程的优先级,保证该线程能更快上cpu运行进行数据处理
2,优先级的提升值由设备驱动程序决定,提升建议值保存在系统文件“Wdm.h”或“Ntddk.h”中
3,优先级的提升幅度与对I/O请求的响应时间要求是一致的,响应时间要求越高,优先级提升幅度越大
4,设备驱动程序在完成I/O请求时通过内核函数IoCompleteRequest来指定优先级提升的幅度
5,为避免不公平,在I/O操作完成唤醒等待线程时会将该线程的时间配额减1
饥饿线程的优先级的提升:
1,系统线程“平衡管理器(balance set manager)” 每秒钟扫描一次就绪队列,发现是否存在等待时间超过300个时钟中断间隔的线程
2,平衡管理器将这些线程的优先级提升到15,并分配给它一个长度为正常值4倍的时间配额
3,当被提升的线程用完它的时间配额后,立即衰减到它原来的基础优先级