目录
5.3.1 First-Come, First-Served (FCFS) Scheduling 先来先服务调度
5.3.2 Shortest-Job-First (SJF) Scheduling 短作业优先调度
5.3.3 Priority Scheduling 优先级调度
5.3.4 Round Robin (RR) 时间片轮转调度
5.3.5 Multilevel Queue Scheduling 多级队列调度
5.3.6 Multilevel Feedback Queue Scheduling 多级反馈队列调度
5.1 基本概念
CPU调度==处理机调度==进程调度
通过多重编程所获得的最大CPU利用率
CPU、I/OBurst cycle脉冲(运行)周期-进程执行包括一个CPU执行和I/O等待的周期
CPU突发时间、I/O突发时间
CPU型(CPU-bound)、I/O型程序(I/O-bound program)
CPU突发分布
CPU和I/O突发的交替顺序
CPU突发时间直方图
三级调度
CPU调度程序
CPU调度决策可能会在一个进程时发生(调度的时机):
1.从运行状态切换到等待状态
2.从已运行状态切换到已就绪状态。
3.从等待切换到准备就绪。
4.终止。
调度方式:
非抢占式(Nonpreemptive)调度:调度程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。如上1、4
抢占式(Preemptive)调度:当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程优先原则、时间片原则。如上2、3
调度程序(Disatcher)
调度员模块将CPU的控制交给短期调度器所选择的进程;这包括:
切换上下文
切换到用户模式
跳转到用户程序中的正确位置以重新启动该程序
调度延迟-调度程序停止一个进程并启动另一个进程运行所需的时间
Linux命令:vmstat
5.2 调度准则
1.面向用户(User-oriented)的准则和评价
周转时间Turnaround time :进程从提交到完成所经历的时间。包括:
在CPU上执行,就绪队列和阻塞队列中等待。
周转时间 T=完成时间-提交时间
平均周转时间=∑周转时间/进程数
带权周转时间W= T(周转时间)/t(CPU执行时间)
平均带权周转时间=∑W/进程数
响应时间Response time :从进程提出请求到首次被响应(而不是输出
结果)的时间段(在分时系统环境下)
等待时间Waiting time – 进程在就绪队列中等待的时间总和
截止时间:开始截止时间和完成截止时间——实时系统,与周转时间有些相似。
公平性:不因作业或进程本身的特性而使上述指标过分恶化。如长进程等待很长时间。
优先级:可以使关键任务达到更好的指标
2. 面向系统的调度性能准则
吞吐量Throughput :单位时间内所完成的进程数,跟进程本身特性和调度算法都有关系——批处理系统
平均周转时间不是吞吐量的倒数,因为并发执行的进程在时间上可以重叠。如:在2小时内完成4个进程,而每个周转时间是1小时,则吞吐量是2个进程/小时
处理机利用率CPU utilization:使CPU尽可能的忙碌
各种设备的均衡利用:如CPU繁忙的进程和I/O繁忙的进程搭配——大中型主机
3. 调度算法本身的调度性能准则
易于实现
执行开销比较小
4. Optimization Criteria最优准则
最大的CPU利用率 Max CPU utilization
最大的吞吐量 Max throughput
最短的周转时间 Min turnaround time
最短的等待时间 Min waiting time
最短的响应时间 Min response time
公平
Review Question
1、Under preemptive scheduling, when a process switches from the running to the ready state, it may lose control of the CPU?
True
2、List at least three different criteria for designing a CPU scheduling algorithm
- Maximize CPU utilization.
- Maximize throughput.
- Minimize turnaround time.
- Minimize waiting time.
- Minimize response time.
5.3 调度算法
5.3.1 First-Come, First-Served (FCFS) Scheduling 先来先服务调度
5.3.2 Shortest-Job-First (SJF) Scheduling 短作业优先调度
5.3.3 Priority Scheduling 优先权调度
5.3.4 Round Robin (RR) 时间片轮转调度
5.3.5 Multilevel Queue Scheduling 多级队列调度
5.3.6 Multilevel Feedback Queue Scheduling 多级反馈队列调度
高响应比优先调度算法 Highest Response Ratio Next(HRRN)
响应比R = (等待时间 + 要求执行时间) / 要求执行时间
5.3.1 First-Come, First-Served (FCFS) Scheduling 先来先服务调度
FCFS算法
按照进程或作业提交顺序形成就绪状态的先后次序,分派CPU
当前进程或作业占用CPU,直到执行完或阻塞,才出让CPU(非抢占方式)
在进程或作业唤醒后(如I/O完成),并不立即恢复执行,通常等到当前作业或进程出让CPU
最简单的算法
FCFS的特点
比较有利于长进程,而不利于短进程。
有利于CPU Bound的进程,而不利于I/O Bound的进程。
实例
假设进程到达的顺序为:P1、P2、P3
日程表的甘特图为:
P1 = 0;P2 = 24;P3 = 27等待时间
P1 = 24;P2 = 27;P3 = 30的周转时间
平均等待时间:(0 + 24 + 27)/3 = 17
平均周转时间:(24 + 27 + 30)/3 = 27
周转时间=终止时间-到达时间。
假设进程以P2、P3、P1的顺序到达。
该进度表的甘特图为:
等待时间:用于P1 = 6;P2 = 0;P3 = 3
周转时间:用于P1 = 30;P2 = 3;P3 = 6
平均等待时间:(6 + 0 + 3)/3 = 3
平均周转时间:(30 + 3 + 6)/3 = 13
比以前的情况好多了
车队效应——长流程背后的短流程
等待时间=周转时间-突发时间。
5.3.2 Shortest-Job-First (SJF) Scheduling 短作业优先调度
又称为“短进程优先”SPF(Shortest Process First);这是对FCFS算法的改进,其目标是减少平均周转时间。
SJF算法:
对预计执行时间短的作业(进程)优先分派处理机。
两种方案:
非抢占-一旦CPU给了进程,它就不能被抢占,直到完成它的CPU突发
抢占—如果新进程到达时CPU突发长度小于当前执行进程的剩余时间,则抢占。这个方案被称为最短的剩余时间优先方案(SRTF)
SJF是最优的-给出了给定进程集的最小平均等待时间。
SJF的变型
最短剩余时间优先SRT(Shortest Remaining Time)-基于抢占的SJF算法
允许比当前进程剩余时间更短的进程来抢占
最高响应比优先HRRN(Highest Response Ratio Next)
响应比R = (等待时间 + 要求执行时间) / 要求执行时间
是FCFS和SJF的折衷
非抢占式SJF例子
平均周转时间=(7+10+4+11)/4=8
平均等待时间=(0 + 6 + 3 + 7)/4 = 4
周转时间=终止时间-到达时间。
抢占式SJF例子
平均周转时间=(16+5+1+6)/4=7
平均等待时间=(9 + 1 + 0 +2)/4 = 3
周转时间=终止时间-到达时间。
确定下一次CPU突发的长度
只能估计出的长度
可以通过使用以前的CPU突发的长度来完成,使用指数平均。
下一次CPU突发长度的预测
指数平均的例子
5.3.3 Priority Scheduling 优先级调度
将与每个进程关联的优先级编号
该算法总是把处理机分配给就绪队列中具有最高优先权的进程。常用以下两种方法来确定进程的优先权:
静态优先权: 静态优先权是在创建进程时确定的,在整个运行期间不再改变。依据有:进程类型、进程对资源的要求、用户要求的优先权。
动态优先权: 动态优先权是基于某种原则,使进程的优先权随时间改变而改变。
假定:最小的整数 = 最高的优先级.
SJF是以下一次CPU脉冲长度作为优先数的优先级调度
优先权调度是抢占式还是非抢占式?
非抢占式优先级调度将高优先级的进程放在队列的最前面
抢占式优先级调度要求在高优先级进程到达时优先级中断运行进程
优先级调度例子
问题:饥饿(Starvation)-低优先级的进程可能永远不会执行。
(有传言说,当他们在1973年关闭麻省理工学院的IBM 7094时,他们发现了一个低优先级的流程,在1967年提交,但还没有运行)
解决方案:老化(Aging)-随着时间的推移,流程的优先级增加。——动态优先级
5.3.4 Round Robin (RR) 时间片轮转调度
基本思路:通过时间片轮转,提高进程并发性和响应时间特性,从而提高资源利用率。
RR算法:
将系统中所有的就绪进程按照FCFS原则,排成一个队列。
每次调度时将CPU分派给队首进程,让其执行一个时间片 (time slice) 。时间片的长度从几个ms到几百ms。
在一个时间片结束时,发生时钟中断。
调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。
进程可以未使用完一个时间片,就出让CPU(如阻塞)。
每个进程得到一个小单位的CPU时间(时间量子,time quantum),通常是10-100毫秒。经过此时间后,该进程将被抢占并添加到准备队列的末尾。
如果在准备队列中有n个进程,时间量子为q,那么每个进程一次获得1/n的CPU时间,最多为q时间单位的块。没有进程等待的时间超过(n-1)q时间单位。
响应时间=n*q
性能
q大 --> FIFO
q小 --> q相对于上下文切换必须很大,否则开销太高
时间片长度的影响因素:
就绪进程的数目:数目越多,时间片越小(当响应时间一定时)
系统的处理能力:应当使用户输入通常在一个时间片内能处理完,否则使响应时间,平均周转时间和平均带权周转时间延长。
具有时间量子= 20的RR的例子
通常情况下,平均周转率高于SJF,但反应更好。
时间量子和上下文切换时间
周转时间随时间量子的变化而变化
80%的CPU突发应该小于q
时间⽚优先级都在⼀个队列⾥
5.3.5 Multilevel Queue Scheduling 多级队列调度
本算法引入多个就绪队列,通过各队列的区别对待,达到一个综合的调度目标
根据进程的性质或类型的不同,将就绪队列再分为若干个子队列。
每个作业固定归入一个队列。
各队列的不同处理:不同队列可有不同的优先级、时间片长度、调度策略等。如:系统进程、用户交互进程、批处理进程等。
就绪队列被划分为单独的队列:
foreground (interactive) 前台(交互式)
background (batch) 后台 (批处理)
每个队列都有自己的调度算法:
foreground – RR 前台轮转
background – FCFS
多级队列算法调度须在队列间进行
固定优先级调度,即前台运行完后再运行后台。有可能产生饥饿
给定时间片调度,即每个队列得到一定的CPU时间,进程在给定时间内执行;如,80%的时间执行前台的RR调度,20%的时间执行后台的FCFS调度
5.3.6 Multilevel Feedback Queue Scheduling 多级反馈队列调度
优先级会变化现在的操作系统
多级反馈队列算法是时间片轮转算法和优先级算法的综合和发展。优点:
为提高系统吞吐量和缩短平均周转时间而照顾短进程
为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程
不必估计进程的执行时间,动态调节
多级反馈队列算法
设置多个就绪队列,分别赋予不同的优先级,如逐级降低,队列1的优先级最高。每个队列执行时间片的长度也不同,规定优先级越低则时间片越长,如逐级加倍
新进程进入内存后,先投入队列1的末尾,按RR算法调度;若按队列1一个时间片未能执行完,则降低投入到队列2的末尾,同样按RR算法调度;如此下去,降低到最后的队列,则按FCFS算法调度直到完成。
仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则抢占执行新进程,并把被抢占的进程投入原队列的末尾。
几点说明
I/O型进程:让其进入最高优先级队列,以及时响应I/O交互。通常执行一个小时间片,要求可处理完一次I/O请求的数据,然后转入到阻塞队列。
计算型进程:每次都执行完时间片,进入更低级队列。最终采用最大时间片来执行,减少调度次数。
I/O次数不多,而主要是CPU处理的进程:在I/O完成后,放回优先I/O请求时离开的队列,以免每次都回到最高优先级队列后再逐次下降。
为适应一个进程在不同时间段的运行特点,I/O完成时,提高优先级;时间片用完时,降低优先级;
多级调度队列例子
多级反馈队列三个队列的示例:
Q0 – time quantum 8 milliseconds
Q1 – time quantum 16 milliseconds
Q2 – FCFS
调度
一个新的作业进入服务于FCFS的队列Q0。当它获得CPU时,作业接收到8毫秒。如果没有在8毫秒内完成,作业将移动到队列Q1
在Q1,工作再次提供FCFS,并接收额外的16毫秒。如果它仍然没有完成,它将被抢占并移动到队列Q2。
进程调度例题分析
5.4* 多处理器调度
当有多个CPU可用时,CPU调度就会更加复杂
多处理器中的同质处理器
负载共享
非对称多处理——只有一个处理器访问系统数据结构,减轻了数据共享的需要
5.5* 线程调度
本地调度-线程库如何决定将哪个线程放到一个可用的LWP上
全局调度-内核如何决定下一个要运行哪个内核线程
Pthread Scheduling API
#include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 int main(int argc, char *argv[]) { int i; pthread t tid[NUM THREADS]; pthread attr t attr; /* get the default attributes */ pthread_attr_init(&attr); /* set the scheduling algorithm to PROCESS or SYSTEM */ pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); /* set the scheduling policy - FIFO, RT, or OTHER */ pthread_attr_setschedpolicy(&attr, SCHED_OTHER); /* create the threads */ for (i = 0; i < NUM_THREADS; i++) pthread_create(&tid[i],&attr,runner,NULL); /* now join on each thread */ for (i = 0; i < NUM THREADS; i++) pthread_join(tid[i], NULL); } /* Each thread will begin control in this function */ void *runner(void *param) { printf("I am a thread\n"); pthread exit(0); }
5.6 操作系统例子
Solaris scheduling
Windows XP scheduling
Linux scheduling
Linux Scheduling
有两种算法:分时算法和实时算法
时间共享
优先信贷流程与大多数信贷安排
计时器中断发生时减记
当输入=0时,选择了另一个进程
当所有进程都有信用=0时,将发生重新创建
基于优先级和历史等因素
实时
软实时
Posix.1b兼容——两类
FCFS and RR
最高优先级的进程始终优先运行
优先级与时间片长度之间的关系
按优先级进行索引的任务列表
总结
CPU Burst Time 、I/O Burst Time
CPU-bound program(CPU型程序) 、I/O-bound program(I/O型程序)
long-term scheduler(长程调度)、medium-term scheduler(中程调度)short-term scheduler(短程调度)
time slicing(时间片)
response time(响应时间)、turnaround time(周转时间)、waiting time(等待时间)、Average Turnaround time(平均周转时间)Average waiting time(平均等待时间)
preemptive scheduling(抢占式调度)Nonpreemptive scheduling(非抢占式调度)
throughput(吞吐量)
selecting a process from the ready queue and allocating CPU to it
scheduling algorithms
first-come, first served (FCFS)
shortest job first (SJF)
provably optimal, but difficult to know CPU burst
general priority scheduling
starvation, and aging
round-robin (RR)
for time-sharing, interactive system
problem: how to select the time quantum?
Multilevel queue
different algorithms for different classes of processes
Multilevel feedback queue
allow process to move from one (ready) queue to another
习题分析
1、Why the Shortest-Job-First process scheduling cannot be implemented? C
A It is too complex
B It requires special hardware
C The length of the next CPU burst is not known
D The length of the next I/O burst is not known
2、下列调度算法中,不可能导致饥饿现象的是___A____。
A. 时间片轮转
B. 静态优先数调度
C. 非抢占式短作业优先
D. 抢占式短作业优先
3、下列关于基于时间片的进程调度的叙述中,错误的是( B )
A.时间片越短,进程切换的次数越多,系统开销也越大
B.当前进程的时间片用完后,该进程状态由执行态变为阻塞态
C.时钟中断发生后,系统会修改当前进程在时间片内的剩余时间
D.影响时间片大小的主要因素包括响应时间、系统开销和进程数量等
4、下列事件中,可能引起进程调度程序执行的是(D)。
I.中断处理结束
II. 进程阻塞
III.进程执行结束
IV.进程的时间片用完
A、仅I、III
B、仅II、IV
C、仅III、IV
D、I、II、III、 IV
答案:D
解析:在时间片调度算法中,中断处理结束后,系统检测当前进程的时间片是否用完,如果用完,则将其设为就绪态或让其结束运行,若就绪队列不空,则调度就绪队列的队首进程执行,I可能。
当前进程阻塞时,将其放入阻塞队列,若就绪队列不空,则调度新进程执行,II可能。
进程执行结束会导致当前进程释放CPU,并从就绪队列中选择一个进程获得CPU, III可能。
进程时间片用完,会导致当前进程让出CPU,同时选择就绪队列的队首进程获得CPU,IV可能。