进程调度算法
FCFS
先来先服务(FCFS)调度算法是一种最简单的调度算法,当在作业调度中采用该算法时,每次调度都是从后备作业队列中选择一个或多个最先进入该队列的作业,将它们调入内存,为它们分配资源、创建进程,然后放入就绪队列。在进程调度中采用FCFS算法时,则每次调度是从就绪队列中选择一个最先进入该队列的进程,为之分配处理机,使之投入运行。该进程一直运行到完成或发生某事件而阻塞后才放弃处理机。
SJF
在最短作业优先调度中我们根据作业的执行时间长短来调度。相比于FCFS,SJF能大大提高系统的吞吐能力改善进程的周转时间,但SJF对长进程非常不利,可能长时间得不到执行,且未能依据进程的紧迫程度来划分执行的优先级,以及难以准确估计进程的执行时间,从而影响调度性能。
HRRN
最高响应比优先法(HRRN,Highest Response Ratio Next)是对FCFS方式和SJF方式的一种综合平衡。FCFS方式只考虑每个作业的等待时间而未考虑执行时间的长短,而SJF方式只考虑执行时间而未考虑等待时间的长短。因此,这两种调度算法在某些极端情况下会带来某些不便。HRN调度策略同时考虑每个作业的等待时间长短和估计需要的执行时间长短,从中选出响应比最高的作业投入执行。这样,即使是长作业,随着它等待时间的增加,W / T也就随着增加,也就有机会获得调度执行。这种算法是介于FCFS和SJF之间的一种折中算法。由于每次调度前要计算响应比,系统开销也要相应增加。
响应比R定义如下: R =(W+T)/T = 1+W/T
RR
时间片轮转算法(RR,Round-Robin)采用剥夺策略。时间片轮转调度是一种最古老,最简单,最公平且使用最广的算法,又称RR调度。每个进程被分配一个时间段,称作它的时间片,即该进程允许运行的时间。在时间片轮转算法中,时间片的大小对系统性能的影响很大,因此时间片的大小应选择恰当怎样确定时间片的大小。
Linux进程调度的目标
- 高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效;
- 加强交互性能:在系统相当的负载下,也要保证系统的响应时间;
- 保证公平和避免饥渴;
- SMP调度:调度程序必须支持多处理系统;
- 软实时调度:系统必须有效的调用实时进程,但不保证一定满足其要求;
O(1)调度算法
进程有两个优先级,一个是静态优先级,一个是动态优先级.静态优先级是用来计算进程运行的时间片长度的,动态优先级是在调度器进行调度时用到的,调度器每次都选取动态优先级最高的进程运行。
动态优先级=max(100 , min(静态优先级 – bonus + 5 , 139))
动态优先级的生成是以静态优先级为基础,再加上相应的惩罚或奖励(bonus).这个bonus并不是随机的产生,而是根据进程过去的平均睡眠时间做相应的惩罚或奖励.交互性强的进程会得到调度程序的奖励(bonus为正),而那些一直霸占CPU的进程会得到相应的惩罚(bonus为负).
普通进程的动态优先级的范围是100~139,实时进程的动态优先级的范围是0~99
时间片的计算
Linux2.4版本的内核调度算法理解起来简单:在每次进程切换时,内核依次扫描就绪队列上的每一个进程,计算每个进程的优先级,再