CPU的三级调度: 1.高级调度(Long-term):作业调度,从外存进内存 2.低级调度(Short-term):进程调度,分配处理机 3.中级调度(Medium-term):对换 通过多道程序设计得到CPU的最高使用率。 CPU-IO脉冲周期:进程的执行包括进程CPU上执行和等待IO。 进程的执行以CPU脉冲开始,其后跟着IO脉冲。进程的执行就是在这两个状态之间切换。 CPU调度可能发生以下情况: 1.从运行转到等待 2.从运行转到就绪 3.从等待转到就绪 4.中止运行 其中1、4情况下的调度为非抢占式调度,所有其他情况下发生的调度成为抢占式调度。 非抢占式调度:把处理机分配给某进程后,让其一直执行,知道该进程完成或发生某事件被阻塞时,才把处理机分配给其他进程,不允许其他进程抢占已经分配出去的处理及。 抢占方式:允许调度程序根据某个原则,去停止某个正在执行的进程,将处理及重新分配给另一个进程。 抢占的原则: 1.时间片原则 2.优先权原则 3.短作业优先原则 分派程序负责将对CPU的控制权转交给进程调度选择的进程, 包括:切换上下文、切换到用户态、跳转到用户程序的适当位置并重新执行。 分派延迟:分派程序种植一个进程的运行并启动另一个进程所花费的时间。 调度准则: 1.CPU利用率(CPU utilization):使CPU尽可能忙碌。 2.吞吐量(Throughput):单位时间内运行完的进程数。 3.周转时间(Turnaround time):进程从提交到运行结束的全部时间。 4.等待时间(Waiting time):进程在就绪队列中等待调度的时间片总和。 5.响应时间(Response time):从进程提出请求到首次被相应的时间段。注意:在分时系统环境下不是输出完整结果的时间 6.带权周转时间:周转时间/实际运行时间 调度算法影响的是等待时间,而不能影响真正使用CPU的时间和IO时间。 调度算法: 1.先来先服务(FCFS) ——属于非抢占式调度,一旦一个进程占有处理及,它就一直运行下去,知道该进程完成或者因为等待某事件而不能继续运行时才释放处理机。 ——有利于长作业不利于短作业,有利于CPU型作业,不利于IO型作业。 2.短作业优先(SJF):SJF是最优的,对一组指定的进程而言,它给出了最短的平均等待时间。 ——有两种调度形式: (1)非抢占式调度(nonpreemptive):一旦进程拥有CPU,它的使用权小只能等待该CPU脉冲结束后才让出。 (2)抢占式调度(Preemptive):发生在有比当前进程剩余时间片更短的进程到达时,也称为最短剩余时间优先调度。 预测CPU脉冲长度:T(n+1) = a*t(n) + (1-a)*T(n) 其中t(n)是实际运行时间,T(n)是预测时间。 ——采用SJF有利于系统减少平均周转时间,提高系统吞吐量。 3.优先权调度(Priority Scheduling) ——同样有两种调度形式: (1)非抢占式调度(nonpreemptive) (2)抢占式调度(Preemptive) ——CPU分配给最高优先级的进程[嘉定最小整数=最高的优先级] ——SJF是以下一次CPU脉冲长度为优先数的优先级调度。 ——静态优先权:在进程创建时确定,而且在整个生命期中保持不变。 ——静态优先权可能会出现饥饿问题。解决方案:老化(视进程等待时间的延长提高其优先数)。 ——动态优先权:进程的优先权可以随进程的推进而改变。改变优先权的因素:进程的等待时间、已使用处理机的时间、资源使用情况。 4.时间片轮转(Round Robin) ——每个进程将得到小单位的CPU时间,通常为10-100ms。时间片用完后,该进程将被抢占并插入就绪队列的末尾。 ——一般来说,RR的平均周转时间比SJF长,但响应时间要短一些。 ——时间片长度对于切换上下文的时间而言应足够长,否则将导致系统开销过大。 ——一组进程的平均周转时间并不一定随着时间片的增大而降低。一般来说,如果大多数(80%)进程能在一个时间片内完成,就会改善平均周转时间 5.多级队列调度(Multilevel Queue) ——按进程的属性来分类,每个进程固定地处于某一个队列,每个队列有自己的调度算法,调度需要在队列间进行。 ——给定时间片调度,即每个队列得到一定的CPU时间,进程在给定时间内执行;如,80%的时间执行前台的RR调度,20%的时间执行后台的FCFS调度。 6.多级反馈队列调度(Multilevel Feedback Queue) ——存在多个就绪队列,具有不同的优先级,各自按时间片轮转法调度。 ——允许进程在队列之间移动。 ——各个就绪队列中时间片的大小各不相同,优先级越高的队列时间片越小。 ——当一个进程执行完一个完整的时间片后被抢占处理器,被抢占的进程优先级降低一级而进入下级就绪队列,如此继续,直至降到进程的基本优先级。 ——而一个进程从阻塞态变为就绪态时要提高优先级。 ——最后会将I/O型和交互式进程留在较高优先级队列 。 ——多级反馈队列调度程序由以下参数定义: ——队列数、每一队列的调度算法、决定进程升级的方法、决定进程降级的方法、决定需要服务的进程将进入哪个队列的方法。 7.高响应比优先调度算法(Highest Response Ratio Next) RP = 1 + 已等待时间/要求运行时间 HRRN算法实际上是FCFS算法和SJF算法的折衷。 优点:等待时间相同则SJF,要求服务时间相同,则FCFS。长作业优先级随着等待时间的增加而提高,不会出现长时间得不到相应的情况。 缺点:作业调度程序要统计作业的等待时间,做浮点运算浪费大量的计算时间。 Dispatch Latency 分派延迟 优先级倒置:如果较高优先级的进程需读或修改正在被另一个低优先级进程所访问的内核数据,高优先级进程需要等待低优先级的进程完成。 优先级继承:(正在访问高优先级进程所需资源的)低优先级进程继承高优先级,直到相关资源处理完毕,它们的优先级再返回原来的值。 Thread Scheduling 线程调度 1.用户级线程需要运行的话,需通过LWP映射到某个内核级线程。 2.局部调度(Local Scheduling):线程怎样决定将那个线程列入有效的轻量级线程。 3.全局调度(Global Scheduling):内核怎样决定下一个运行的内核线程。 4.Solaris scheduling 采用基于优先级的进程调度。 5.Windows XP采用基于优先级的,可抢占的调度算法,线程按时间片来使用CPU。 ——优先级相同的进程按RR调度 ——非实时优先级是动态调整的,实时优先级是固定不变的。 6.Linux提供2种进程调度算法 ——分时:实现进程间公平可抢占调度。 ——实时:按优先级调度。 ——linux支持SMP,每个CPU有自己的runqueue,并独自进行调度。 ——每个runqueue有两组优先级:Active 和 Expired ——调度程序从Active array中选取优先级最高的进程使用CPU,当所有进程都用尽了自己的时间片,交换Active array与expired array。 7.JVM使用的是抢占式的、基于优先级的调度算法。 多道程序的道指的是同一时刻能进内存的进程数量。