【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>
背景
在多道程序环境下,内存中存在着多个进程,其数目往往多于处理机数目。这就要求系统能按某种算法,动态地将处理机分配给处于就绪状态的一个进程,分配处理机的任务就是由处理机调度程序完成的。调度的实质是一种资源分配。
调度的层次
1. 高级调度
又称长程调度或作业调度,调度对象是作业。主要用于多道批处理系统中,而在分时和实时系统中不设置高级调度
2. 低级调度
又称短程调度或进程调度,调度对象是进程(或内核级线程)。进程调度是最基本的一种调度,在多道批处理、分时和实时三种类型的OS中,都必须配置。
3. 中级调度
又称内存调度。引入中级调度的主要目的是:提高内存利用率和系统吞吐量。
调度的目标
共同目标
1. 资源利用率
CPU的利用率 = CPU有效工作时间 / (CPU有效工作时间 + CPU空闲等待时间)
2. 公平性
诸进程都能获得合理的CPU时间,不会发生进程饥饿现象
3. 平衡性
4. 策略强制执行
批处理系统的目标
1. 平均周转时间短
周转时间:从作业被提交给系统开始,到作业完成为止的这段时间间隔(作业周转时间)
它包括四部分:
-
作业在外存后备队列上等待调度的时间;
-
进程在就绪队列上等待进程调度的时间;
-
进程在CPU上执行的时间;
-
进程等待I/O操作完成的时间
平均周转时间
带权周转时间:作业周转时间 / 作业实际运行时间
2. 系统吞吐量高
吞吐量:在单位时间内系统所完成的作业数
如果单纯为了获得高的系统吞吐量,应尽量多地选择短作业运行
3. 处理机利用率高
如果单纯为了获得高的处理机利用率,应尽量多地选择计算量大地作业运行
分时系统的目标
1. 响应时间短
2. 均衡性
实时系统的目标
1. 截止时间的保证
2. 可预测性
作业调度算法
在批处理系统中,是以作业为基本单位从外存调入内存的
先来先服务(FCFS)调度算法
该算法既可用于作业调度,也可用于进程调度。
该算法按照作业到达的先后次序来进行调度,优先考虑在系统中等待时间最长的作业,而不管改作业所需执行时间的长短。
缺陷:假设一个短作业前面先到达了一个长作业,那么就导致短作业的响应时间太长了,用户交互的体验会变差
短作业优先(SJF)调度算法
以作业的长短来计算优先级,作业越短,其优先级越高。
这样一来,短作业得到了很好的照顾,但是也引发了一系列的问题
缺点:
- 必须预知作业的运行时间
- 对长作业非常不利,更严重的是,该算法完全忽视作业的等待时间,可能出现进程饥饿现象,使得长作业得不到CPU资源
- 在采用SJF算法时,人机无法实现交互
- 完全未考虑作业的紧迫程序,故不能保证紧迫性作业得到及时处理
优先级调度算法(PSA)
该算法既可用于作业调度,也可用于进程调度。
在优先级调度算法中,是基于作业的紧迫程度,由外部赋予作业相应的优先级,调度算法是根据该优先级进行调度的,这样就保证了紧迫性作业优先运行
高响应比优先调度算法(HRRN)
该算法综合考量作业的两个属性:等待时间、要求服务时间,因此既照顾了短作业,又不致使长作业的等待时间过长
实现思路:为每个作业引入一个动态优先级,即优先级随着等待时间的延长而增加
优先权 = (等待时间 + 要求服务时间) / 要求服务时间
由于等待时间与服务时间之和就是系统对该作业的响应时间
顾:
优先权 = 响应时间 / 要求服务时间
缺陷:虽然这个算法实现了较好的折中处理,但是系统的开销也随之增大了,因为每次调度前,都需要重新计算所有等待作业的响应比
进程调度
进程调度机制的三个基本部分:
- 排队器
- 分派器
- 上下文切换器
进程调度方式
- 非抢占方式
不会因为时钟中断或者其他原因去抢占当前正在运行进程的处理机,直至该进程完成,或者因发生某事件而被阻塞时,才会把处理机分配给其他进程
在采用非抢占调度方式时,可能引起进程调度的因素可归结为:
- 正在执行的进程运行完毕,或因某事件而无法再继续运行
- 正在执行的进程因提出I/O请求而暂停执行
- 在进程通信或同步过程中,执行了某种原语操作
优点: 实现简单,系统开销小,适合于大多数的批处理系统
缺点: 不能用于分时系统和大多数实时系统
- 抢占方式
在现代OS中广泛采用抢占方式
抢占不是一种任意性的行为,必须遵循一定的原则,主要原则有:
- 优先权原则
- 短进程优先原则
- 时间片原则
进程调度算法
时间片轮转调度算法(RR)
每个进程轮流使用CPU资源,且每次都最多只能使用一个CPU时间片,进程的选择就按照FCFS
面临的问题:时间片的长度如何设计?
在RR算法中,时间片的大小对系统性能有很大的影响。时间片越短,固定时间里可运行的进程就越多,可是切换进程是需要消耗指令周期的,也就是说时间片过短会导致大量CPU资源浪费在切换上下文上;而时间片过长,短交互指令响应就会变慢,RR算法便退化为FCFS算法,无法满足短作业和交互式用户的需求。
优先级调度算法
在RR中,做了一个隐含的假设,即系统中所有进程的紧迫性是相同的,但为了能满足实际情况的需要,在进程调度算法中引入优先级,从而形成了优先级调度算法。
优先级调度算法也分抢占式和非抢占式,所谓抢占式,即在处理机执行一个进程时,出现了另一个优先级更高的进程,则调度程序会将处理机分配给新到的优先级高的进程
优先级的类型可分为静态优先级和动态优先级
多队列调度算法
该算法将系统中的进程就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的就绪队列采用不同的调度算法,一个就绪队列中的进程可以设置不同的优先级,不同的就绪队列本身也可以设置不同的优先级
多级反馈队列调度算法
目前公认的一种较好的进程调度算法
设置多个就绪队列,并为每个队列赋予不同的优先级。每个队列都采用FCFS算法,在第n队列中采取按RR方式运行。按队列优先级调度,仅当高优先级队列为空时才会运行下一个队列
基于公平原则的调度算法
实时调度
实时调度算法
最早截止时间优先(EDF)算法
最低松弛度优先(LLF)算法
来源:oschina
链接:https://my.oschina.net/u/4207771/blog/3145802