第三部分 CPU调度
一、相关基本概念
引入多程序设计,目的是提高计算机资源利用率,尤其是CPU利用率(CPU utilization)。(前面所讲的多程序和多任务的目的就是让多个进程竞争使用资源,从而使CPU利用率提高。)
CPU密集 — I/O密集的循环
进程的执行,呈现出CPU运行和I/O等待的交替循环。
注意前面的知识:
CPU中有READY信号,当收到I/O送来的信号后才会进行读写操作。
I/O操作不消耗CPU,而是让CPU闲置了,浪费CPU,因为I/O设备相对于CPU来说速度很慢,CPU要花大部分时间来等待I/O处理数据。
二、CPU调度器
CPU调度器的使命
从内存中一堆准备就绪的进程中(就绪队列中的就绪进程),选取一个进程;
将CPU分配给该进程。
后者也可以由dispatcher完成。
CPU调度器的操作对象.png
由上图我们可以看见,通过CPU 调度器,计算机进程(PCB)有四个去向:
1)留在就绪队列
2)进入CPU
3)等待队列
4)I/O操作
CPU调度器的操作时机
调用CPU调度器的时机,通常发生在:
1)某一进程从执行状态转为等待状态
2)某一进程从执行状态转为就绪状态(图上应为双向箭头)
如果有一个进程进入就绪队列,且进程优先级高,则有可能该优先级高的进程把原先执行队列里的进程抢过来。
3)某一进程从等待状态转为就绪状态
如I/O操作完成以后,转回ready queue。
4)某一进程终止
进程上下文切换。
等等,不限于以上四种,只是举了四个例子(引发调度的时机可能有十几种)。
1,4属于“非抢占式(nonpreemptive)调度”,2,3属于“抢占式(preemptive)调度”。
非抢占式:
进程自愿交出CPU,引起新一轮的调度。
抢占式:
进程被迫交出CPU,引起新一轮的调度。
解释一下第三种情形:
本身等待到就绪状态是不需要CPU调度的,由图可知,做完I/O操作,进入ready queue即可。但现在如果有重要或紧迫的进程到达,那么当前进程必须为就绪状态。则强行将CPU调度从等待状态转为就绪状态,并且强行放弃处理现在的运行进程,将CPU立即分配给新到达的进程。故它是一种抢占式调度。
CPU调度器追求目标
CPU利用率(CPU utilization)。CPU的利用率就是非空闲进程占用时间的比例,即CPU执行非空闲进程的时间/ CPU总的执行时间。
吞吐率(Throughput) — 单位时间内完成执行的进程数
周转时间(Turnaround time) — 执行某一进程所耗用的CPU累积时间(进程进入就绪队列开始到拿到CPU执行结束为止的累积时间,其间有可能存在时间片到了或者高优先级抢占CPU的情况)
等待时间(Waiting time) — 某一进程等待在就绪队列里面的累积时间(不包括CPU执行时间)
响应时间(Response time) — 某一进程从发出调度请求,到其开始得到CPU调度器响应,其间所经历的时间。
优异的指标,当然是
Maximize CPU utilization
Maximize th