描述各种过程调度算法
讨论了为特定系统选择过程调度算法的评价标准
通过多路编程获得的最大CPU利用率
CPU - I/O突发周期——进程执行由CPU执行和I/O等待周期组成
CPU破裂分布
- cpu突发次数直方图
CPU调度程序
从内存中准备执行的进程中选择,并将CPU分配给其中一个进程
CPU调度决策可能发生在一个进程:
从运行状态切换到等待状态(I/O请求)
从运行状态切换到就绪状态(定时器超时)
从等待切换到就绪(I/O完成)
终止
低于1和4的调度是不可抢占的
所有其他的调度都是优先的
调度员
Dispatcher模块将CPU的控制权交给短期调度程序选择的进程;这包括:
上下文切换
切换到用户模式
跳到用户程序中的适当位置重新启动该程序
调度延迟——调度程序停止一个进程并启动另一个进程所花费的时间
CPU利用率—保持CPU尽可能繁忙
吞吐量——每个时间单位完成其执行的进程的数量
周转时间——执行特定流程的时间总量
等待时间——进程在就绪队列中等待的时间
响应时间——从提交请求到产生第一个响应(而不是输出)所花费的时间(用于分时环境)
马克斯CPU利用率
最大吞吐量
分钟周转时间
最小等待时间
最小响应时间
- 先到先得(FCFS)的安排
Process Burst Time
P1 24
P2 3
P3 3
Suppose that the processes arrive in the order: P1 , P2 , P3 The Gantt Chart for the schedule is:
Waiting time for P1 = 0; P2 = 24; P3 = 27
Average waiting time: (0 + 24 + 27)/3 = 17
假设流程按照顺序到达
P2, P3, P1
时间表的甘特图是:
P1等待时间= 6;P2 = 0;P3 = 3
平均等待时间:(6 + 0 + 3)/3 = 3
比以前的情况好多了
护航效果:短进程后长进程
- Shortest-Job-First (SJF)调度
与每个进程关联其下一个CPU突发的长度。使用这些长度以最短的时间安排流程
SJF是最优的——为给定的一组进程提供最小的平均等待时间
困难在于知道下一个CPU请求的长度
- 确定下一个CPU突发长度
只能估计长度吗
可以通过使用先前CPU爆发的长度,使用指数平均来完成吗
- 指数平均的例子
= 0
n + 1 =n
近代史不算数
= 1
n + 1 = tn
只有实际的最后一次CPU突发计数
如果我们展开公式,我们得到:
n+1 =tn+(1 -)tn 1 +…
+(1 -)jtn -j +…
+(1 -)n +10
因为和(1 -)都小于或等于1,所以每一个连续的项的权重都小于它的前一个项
下一个CPU突发长度的预测
优先调度
优先级数(整数)与每个进程相关联
CPU分配给优先级最高的进程(最小的整数优先级最高)。
先发制人的
无优先
SJF是一种优先级调度,优先级是预测的下一个CPU突发时间
问题饥饿—低优先级进程可能永远不会执行
解决方案老化—随着时间的推移,增加进程的优先级
轮循
每个进程得到一个很小的CPU时间单位(时间量),通常是10-100毫秒。
在此时间过后,进程将被抢占并添加到就绪队列的末尾。
如果有n个进程在就绪队列中,并且时间量为q,那么每个进程一次最多获得1/n的CPU时间块,时间单位为q。没有进程等待超过(n-1)q个时间单位。
性能
q大FIFO
Q小Q关于上下文切换必须大,否则开销太高
- 时间量子= 4的RR示例
过程破裂时间
p1 24
p2 3
p3 3
甘特图为:
一般来说,比SJF高的平均周转时间,但更好的反应
- 时间量子和上下文切换时间
多级队列
就绪队列被划分为多个单独的队列:
前台(互动)
背景(批处理)
每个队列都有自己的调度算法
前台- RR
背景:先
调度必须在队列之间进行
固定优先级调度;(即,服务所有从前台,然后从背景)。饥饿的可能性。
时间片——每个队列获得一定数量的CPU时间,它可以在其进程之间调度;即,在RR中80%到前景,在FCFS中20%到背景
多级队列调度
多级反馈队列
进程可以在各个队列之间移动;老化可以通过这种方式实现
多级反馈队列调度器由以下参数定义:
队列的数量
每个队列的调度算法
用于确定何时升级流程的方法
用于确定何时降级进程的方法
方法,用于确定当进程需要服务时将进入哪个队列
三个队列:
Q0 - RR与时间量子8毫秒
Q1 - RR时间量子16毫秒
Q2 -先
调度
一个新的作业进入FCFS服务的队列Q0。当它获得CPU时,作业收到8毫秒。如果它没有在8毫秒内完成,作业将被移动到队列Q1。
在Q1作业再次使用FCFS服务,并收到额外的16毫秒。如果它仍然没有完成,它将被抢占并移动到队列Q2。
线程调度
用户级线程由线程库管理,并且内核不知道它们
要在CPU上运行,用户级线程最终必须映射到相关的内核级线程,尽管这种映射可能是间接的,并且可能使用LWP(轻量级进程)。
竞争范围
process-contention范围(个人电脑)
system-contention范围(SCS)
用户级线程和内核级线程之间的一个区别在于它们的调度方式。
多对一和多对多模型,线程库调度用户级线程运行在一个可用的LWP(轻量级进程)上
这称为进程争用范围(PCS),因为调度竞争是属于同一进程的线程之间的竞争
当我们说线程库将用户线程调度到可用的lwp时,我们并不是说线程实际上在CPU上运行;这将要求操作系统将内核线程调度到物理CPU上。
为了决定将哪个内核线程调度到CPU上,内核使用系统争用作用域(SCS)
系统中所有线程都在竞争SCS调度的CPU。
系统采用一对一模型,仅使用SCS调度线程。
通常,PCS是根据优先级来执行的——调度程序选择优先级最高的可运行线程来运行。用户级线程优先级是由程序员设定的,而不是由线程库调整的。
PCS通常会抢占当前运行的线程,以有利于高优先级线程;然而,并不能保证在同等优先级的线程之间进行时间切片。
API允许在线程创建期间指定PCS或SCS
PTHREAD SCOPE进程使用PCS调度来调度用户级线程
PTHREAD SCOPE SYSTEM使用SCS调度调度线程。
将为多对多系统上的每个用户级线程创建和绑定一个LWP,使用一对一策略有效地映射线程。
- Pthread调度API