前言:
而今看官们对“c语言优先级调度算法”大概比较注重,你们都想要分析一些“c语言优先级调度算法”的相关资讯。那么小编也在网摘上网罗了一些对于“c语言优先级调度算法””的相关资讯,希望朋友们能喜欢,小伙伴们一起来学习一下吧!FreeRTOS任务调度算法有三种:第一种是基于优先级的抢占式任务调度算法,第二种是基于优先级的时间片轮转调度算法,第三种是合作式调度算法。这三种方法各有各的优劣,下面我们具体分析一下:
调度器
要想了解调度算法,就需要先了解什么是调度器。调度器就是使用特定的算法来决定当前需要执行那个任务,调度器可以识别任务的状态,一般包括就绪态、挂起态,当任务处于就绪态时,任务才能被调度器调度;当任务处于挂起态时,需要先激活任务后,才能被调度器调度。所以调度器的核心就是调度算法,通过算法实现任务的切换。
抢占式调度:
抢占式调度算法是通过给任务设置成不同的优先级。优先级高的任务总是先被执行,优先级低的任务则被放到列表等待,也就是最高优先级的任务一旦就绪,总能得到CPU的控制权。
如下图所示:
根据上图可知,线程A、B、C优先级从高到低。当线程A运行时,线程B、C进入等待状态;当线程A进入阻塞或者挂起状态后,线程等待列表内的最高优先级的任务变成了线程B。此时调度器开始完成线程B的调度,运行一段时间后,线程C被重新激活或者从阻塞状态里面退出,则调度器重新进行调度,把CPU控制权再重新返还给线程A;当A、B任务同时被阻塞或者挂起后,则调度器将CPU控制权交给任务C,这样就完成了三个任务间的切换工作。
这种调度方式的优点就是:可以通过控制任务的优先级实现对不同任务的响应速度的控制,优先级越高,越能得到优先响应,但是这种方式也存在缺点,优先级低的任务被响应的速度可能受优先级高的任务的阻塞或者挂起频率限制,导致优先级低的任务响应效率太低。
时间片轮转调度器:
在小型的嵌入式RTOS中,最常见的时间片调度算法就是Round-robin调度算法。这种算法很容易理解,其实就是将CPU的控制权划分成很多的时间片,调度器将就绪态的任务放到任务列表内,轮训完成任务调度,每个任务的优先级都是相同的,并且获得CPU控制的时间都是相同,如下图所示:
从上图可以看出,调度器总是循环定期调度任务列表内的所有任务,这种方法的优势是每个任务都能够收到相同的待遇,资源分配相对合理,但是如果时间片划分的周期太小,可能会造成大量的系统资源浪费在系统调度上,并且这种调度方式的实时性相对较低。
合作式调度器:
合作式调度器则是融合前两种调度器的一种高级调度器,既能够兼容抢占式的实时性,又能够兼容时间片轮转调度的合理分配资源。这种调度器是将任务划分不同优先级级别,允许存在相同优先级,针对不同优先级间采用抢占式调度方式,针对相同优先级间,采用时间片轮转调度方式。
标签: #c语言优先级调度算法