本文章的调度算法总结自博客https://blog.youkuaiyun.com/m0_37925202/article/details/79471445
首先说明什么叫进程和程序?
首先程序和进程的存放位置不同:程序是保存在磁盘中的一些数据;而进程是一个运行起来的程序,需要将代码数据加载到内存中,参与竞争分配系统资源的一个实体。
为什么会有进程调度:
需要进程调度的理由很简单,即充分利用计算机系统中的CPU资源,让计算机系统能够多快好省地完成我们让它做的各种任务。自己将它实例化成一个不是很恰当的例子:如果将cpu比作一个工厂的机器;那么进程就是工人;而这个工厂的效益比较好;需要每天24小时运行也是为了能够充分利用机器;那么进程调度就是工人换班;只不过工厂是工人操作机器;而计算机是cpu操作进程;当工人8个小时上班时间到了;就要下班轮换;而计算机是CPU是操作某一个进程时间到了时间片就该去操作另一个进程了;只不过工人上班的时间长度和CPU的时间片不是一个数量级;
进程调度的原理:
一般我们在内存中可存放数目远大于计算机系统内CPU个数的进程,让这些进程在操作系统的进程调度器的调度下,能够让进程高效(高的吞吐量–throughput)、及时(低延迟–latency)、公平(fairness)地使用CPU。为此调度器可设计不同的调度算法来选择进程,这体现了进程调度的策略,同时还需并进一步通过进程的上下文切换(context switch)来完成进程切换,这体现了进程调度的机制。
进程调度的方式:
- 可抢占式(可剥夺式,preemptive):就绪队列中一旦有某进程的优先级高于当前正在执行的进程的优先级时,操作系统便立即进行进程调度,完成进程切换。
- 不可抢占式(不可剥夺式non_preemptive):即使在就绪队列存在有某进程优先级高于当前正在执行的进程的优先级时,当前进程仍将占用处理器执行,直到该进程自己进入阻塞状态,或时间片用完,或在执行完系统调用后准备返回用户进程前的时刻,才重新发生调度让出处理机。
进程调度的策略/算法:
在早期操作系统的调度方式大多数是非剥夺的,这是由于早期的应用一般是科学计算或事务处理,不太把人机交互的响应时间指标放在首要位置。在这种情况下,正在运行的进程可一直占用CPU直到进程阻塞或终止。这种方式的调度算法可以很简单,且比较适用对于响应时间不关心或者关心甚少的批处理科学计算或事务处理应用。随着计算机的应用领域进一步扩展,计算机更多地用在了多媒体等人机交互应用上,为此采用可抢占式的调度方式可在一个进程终止或阻塞之前就剥夺其执行权,把CPU尽快分配给另外的“更重要”进程,使得就绪队列中的进程有机会响应它们用户的IO事件。
基于这两种方式的调度算法如下:
1、先来先服务(FCFS)调度算法:
处于就绪态的进程按先后顺序链入到就绪队列中,而FCFS调度算法按就绪进程进入就绪队列的先后次序选择当前最先进入就绪队列的进程来执行,直到此进程阻塞或结束,才进行下一次的进程选择调度。FCFS调度算法采用的是不可抢占的调度方式,一旦一个进程占有处理机,就一直运行下去,直到该进程完成其工作,或因等待某一事件而不能继续执行时,才释放处理机。操作系统如果采用这种进程调度方式,则一个运行时间长且正在运行的进程会使很多晚到的且运行时间短的进程的等待时间过长。总的来说就是先来后到;除非自已运行结束或某些原因自己让出CPU才能轮到下一个进程运行。
2、短作业优先(SJF)调度算法:其实目前作业的提法越来越少,我们姑且把“作业”用“进程”来替换,改称为短进程优先调度算法,此算法选择就绪队列中确切(或估计)运行时间最短的进程进入执行。它既可采用可抢占调度方式,也可采用不可抢占调度方式。可抢占的短进程优先调度算法通常也叫做最短剩余时间优先(Shortest Remaining Time First,SRTF)调度算法。短进程优先调度算法能有效地缩短进程的平均周转时间,提高系统的吞吐量,但不利于长进程的运行。而且如果进程的运行时间是“估计”出来的话,会导致由于估计的运行时间不一定准确,而不能实际做到短作业优先。优先完成时间短的。
3、时间片轮转(RR)调度算法:RR 调度算法与FCFS 调度算法在选择进程上类似,但在调度的时机选择上不同。RR调度算法定义了一个的时间单元,称为时间片(或时间量)。一个时间片通常在1~100 ms之间。当正在运行的进程用完了时间片后,即使此进程还要运行,操作系统也不让它继续运行,而是从就绪队列依次选择下一个处于就绪态的进程执行,而被剥夺CPU使用的进程返回到就绪队列的末尾,等待再次被调度。时间片的大小可调整,如果时间片大到让一个进程足以完成其全部工作,这种算法就退化为FCFS调度算法;若时间片设置得很小,那么处理机在进程之间的进程上下文切换工作过于频繁,使得真正用于运行用户程序的时间减少。时间片可以静态设置好,也可根据系统当前负载状况和运行情况动态调整,时间片大小的动态调整需要考虑就绪态进程个数、进程上下文切换开销、系统吞吐量、系统响应时间等多方面因素。
运行时间达到时间片长度则让出CPU等待下次调用
4、高响应比优先(Highest Response Ratio First,HRRF)调度算法:HRRF调度算法是介于先来先服务算法与最短进程优先算法之间的一种折中算法。先来先服务算法只考虑进程的等待时间而忽视了进程的执行时间,而最短进程优先调度算法只考虑用户估计的进程的执行时间而忽视了就绪进程的等待时间。HRRF调度算法二者兼顾,既考虑进程等待时间,又考虑进程的执行时间。
5、多级反馈队列(Multi-Level Feedback Queue)调度算法:在采用多级反馈队列调度算法的执行逻辑流程如下:
设置多个就绪队列,并为各个队列赋予不同的优先级。第一个队列的优先级最高,第二队次之,其余队列优先级依次降低。仅当第1~i-1个队列均为空时,操作系统调度器才会调度第i个队列中的进程运行。赋予各个队列中进程执行时间片的大小也各不相同。在优先级越高的队列中,每个进程的执行时间片就越小或越大(Linux-2.4内核就是采用这种方式)。
当一个就绪进程需要链入就绪队列时,操作系统首先将它放入第一队列的末尾,按FCFS的原则排队等待调度。若轮到该进程执行且在一个时间片结束时尚未完成,则操作系统调度器便将该进程转入第二队列的末尾,再同样按先来先服务原则等待调度执行。如此下去,当一个长进程从第一队列降到最后一个队列后,在最后一个队列中,可使用FCFS或RR调度算法来运行处于此队列中的进程。
如果处理机正在第i(i > 1)队列中为某进程服务时,又有新进程进入第k(k < i)的队列,则新进程将抢占正在运行进程的处理机,即由调度程序把正在执行进程放回第i队列末尾,重新将处理机分配给处于第k队列的新进程。
从MLFQ调度算法可以看出长进程无法长期占用处理机,且系统的响应时间会缩短,吞吐量也不错(前提是没有频繁的短进程)。所以MLFQ调度算法是一种合适不同类型应用特征的综合进程调度算法。
6、最高优先级优先调度算法:进程的优先级用于表示进程的重要性及运行的优先性。一个进程的优先级可分为两种:静态优先级和动态优先级。
静态优先级是在创建进程时确定的。一旦确定后,在整个进程运行期间不再改变。静态优先级一般由用户依据包括进程的类型、进程所使用的资源、进程的估计运行时间等因素来设置。一般而言,若进程需要的资源越多、估计运行的时间越长,则进程的优先级越低;反之,对于I/O bounded的进程可以把优先级设置得高。
动态优先级是指在进程运行过程中,根据进程执行情况的变化来调整优先级。动态优先级一般根据进程占有CPU时间的长短、进程等待CPU时间的长短等因素确定。占有处理机的时间越长,则优先级越低,等待时间越长,优先级越高。那么进程调度器将根据静态优先级和动态优先级的总和现在优先级最高的就绪进程执行。
操作系统中为了能够让每个进程都有机会运行,需要给每个进程分配一个时间片,当一个进程的时间片用完以后,操作系统的调度器就会让当前进程放弃CPU,而选择另外一个进程占用CPU执行。为了有效地支持进程调度所需的时间片,ucore设计并实现了一个timer(计时器)功能。这样,通过timer就对基于时间事件的调度机制提供了基本支持。
task_struct结构体, 理解结构体中的各个字段的含义.