1.先来先服务调度算法
近乎单线程/单进程
2.时间片轮转算法
周期性地进行进程切换。
改善短程序的响应时间,但系统的响应时间依赖于时间片的选择。
进程切换需要一定的时间和空间成本。
进程多的时候,时间片就要短一点,否则交互体验会很差;
进程数量少,时间片就可以适量长一点。
3.短任务优先算法
短任务的优先级比长任务的高,我们总是安排优先级高的程序先运行。
非抢占式:让已经在CPU上运行的程序执行到结束或阻塞,然后再执行下一个。
抢占式:每新增加一个进程就要对所有进程(包括正在运行的)进行检查,谁的时间短,就执行谁。
优点:在所有非抢占调度算法中,非抢占短任务优先算法响应时间最优,在所有抢占调度算法中,抢占短任务优先算法响应时间也最优。
缺点:可能造成长程序无法得到CPU时间二导致“饥饿”。需要估算程序运转的时间(启发式估算:1.根据程序大小推测程序所需CPU时间。2.将每个程序先运行一遍,记录其所用的CPU时间)。
4.优先级调度算法
给每个进程赋予一个优先级(短任务优先算法也是优先级调度算法)。
缺点:低优先级的进程可能会“饥饿”。
(解决:只要动态地调节优先级即可,如:一个进程执行特定CPU时间后将其优先级降低一个级别;一个进程等待了长时间,可以将优先级持续提升而超过其他进程)
5.混合调度算法
之前介绍的所有算法都存在缺点,我们自然想设计一个算法合并他们的优点,摒弃他们的缺点。这就是所谓的混合调度算法。
将所有进程分为不同的大类,每个大类为一个优先级。如果两个进程处于不同的大类,则处于高优先级的大类的进程优先执行;如果两个进程处于同一个大类,则采用时间片轮转来执行。
6.其他调度算法
除了上面介绍的各种算法外,有的操作系统还实现了一些其他算法,它们包括:保证调度、彩票调度、用户公平调度。
保证调度算法的目标是保证每个进程占用CPU的时间完全一样,如果一个系统共有n个进程,则每个进程占用CPU的时间为1/n。保障就是肯定运转1/n的时间,不多不少。保障调度不一定要轮转,每次给的时间片不一定要一样。
彩票调度算法是一种概率算法。给每个进程发一定数量的彩票,而调度器则从所有的彩票中随机抽取一张彩票,而持有该彩票的进程就获得CPU。优点:灵活,可以用于模拟其他调度算法。
用户公平调度算法按照每个用户而不是每个进程来进行公平分配。如果一个用户进程多,则其进程获得的CPU时间将短,反之则多。
7.实时调度算法
实时系统是一种必须提供时序可预测性的系统,应用范围广和特性不同于一般计算机,因此调度算法也别出一格。前面的算法只要考虑的是平均响应时间和系统吞吐率的问题,而实时系统则必须考虑每个具体的任务响应时间必须符合要求,即每个任务必须要在什么时间之前完成,而无需考虑如何降低整个系统响应时间或吞吐率。
EDF调度算法:就是最早截止的任务先做(early deadline first?),是抢占式的。(实时调度里面最优的算法)如果一组任务可以被调度的话,那EDF可以满足;如果一批任务不能全部满足,那么EDF能满足的任务最多。
缺点:这是一种动态调度算法。意思是该算法动态地计算每个任务的截止时间并动态调节优先级,但是动态计算截止时间和动态抢占要占用CPU资源
RMS调度算法:在进行调度之前就计算出所有任务的优先级,然后按照计算出来的优先级,然后按照计算出来的优先级进行调度,任务执行期间既不接收新进程,也不进行优先级的调整或者CPU抢占。因此这种算法的优点是系统消耗小,是静态最优算法,缺点是不灵活。(如果CPU利用率在ln2(0.693147)以下,所有任务都能在截止时间前满足)