十一、任务调度算法

1、重要概念

(1)正在运行的任务,被称为"正在使用处理器",它处于运行状态。在单处理器系统中,任何时间里只能有一个任务处于运行状态。

(2)非运行状态的任务,它处于这3种状态之一:阻塞(Blocked)、暂停(Suspended)、就绪(Ready)。

(3)就绪态的任务,可以被调度器挑选出来切换为运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它进入运行状态。

(4)阻塞状态的任务,它在等待"事件",当事件发生时任务就会进入就绪状态。事件分为两类:时间相关的事件、同步事件。

(5)所谓时间相关的事件,就是设置超时时间:在指定时间内阻塞,时间到了就进入就绪状态。使用时间相关的事件,可以实现周期性功能、可以实现超时功能。

(6)同步事件就是:某个任务在等待某些信息,别的任务或者中断服务程序会给它发送信息。怎么"发送信息"?方法很多,有:任务通知(task notfication)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。这些方法用来发送同步信息,比如表示某个外设得到了数据。

2、配置调度算法

(1)调度算法,就是怎样确定哪个就绪态的任务可以切换为运行状态。

(2)通过配置文件FreeRTOSConfig.h的两个配置项来配置调度算法。

  • configUSE_PREEMPTION
  • configUSE_TIME_SLICING

(3)还有第三个配置项:configUSE_TICKLESS_IDLE,它是一个高级选项,用于关闭Tick中断来实现省电,后续单独讲解。现在我们假设configUSE_TICKLESS_IDLE被设为0,先不使用这个功能。

(4)调度算法的行为主要体现在两个方面:高优先级的任务优先运行、同优先级的就绪态任务如何被选中。调度算法要确保同优先级的就绪态任务,能"轮流"运行,策略是"轮转调度"(Round Robin Scheduling)。轮转调度并不保证任务的运行时间是公平分配的,我们还可以细化时间的分配方法。

(5)从三个角度统一理解多种调度算法:

  • 可否抢占?高优先级的任务能否优先执行。
  • 可抢占的前提下,同优先级的任务是否轮流执行。
  • 在"可抢占"+"轮流执行"的前提下,进一步细化:空闲任务是否让步于用户任务。

(6)可否抢占?高优先级的任务能否优先执行(配置项: configUSE_PREEMPTION)

  • 可以:被称作"可抢占调度"(Pre-emptive),高优先级的就绪任务马上执行,下面在细化。
  • 不可以:不能抢就只能协商了,被称作"合作调度模式"(Co-operative Scheduling)。
    • 当前任务执行时,更高优先级的任务就绪了也不能马上运行,只能等待当前任务主动让出CPU资源。
    • 其他同优先级的任务也只能等待:更高优先级的任务都不能抢占,平级的更因该老实点。

(7)可抢占的前提下,同优先级的任务是否轮流执行(配置项:configUSE_TIME_SLICING)

  • 轮流执行:被称为"时间片轮转"(Time Slicing),同优先级的任务轮流执行,你执行一个时间片、我在执行一个时间片。
  • 不轮流执行:英文为"without Time Slicing",当前任务会一直执行,直到主动放弃、或者被高优先级任务抢占。

(8)在"可抢占"+"时间片轮转"的前提下,进一步细化:空闲任务是否让步于用户任务(配置项:configIDLE_SHOULD_YIELD)

  • 空闲任务低人一等,每执行一次循环,就看看是否主动让位给用户任务。
  • 空闲任务跟用户任务一样,大家轮流执行,没有谁更特殊。

(9)列表如下:

|-------------------------|----|-----|-----|-----|------|
| 配置项 | A | B | C | D | E |
| configUSE_PREEMPTION | 1 | 1 | 1 | 1 | 0 |
| configUSE_TIME_SLICING | 1 | 1 | 0 | 0 | x |
| configIDLE_SHOULD_YIELD | 1 | 0 | 1 | 0 | x |
| 说明 | 常用 | 很少用 | 很少用 | 很少用 | 几乎不用 |

注:

A:可抢占+时间片轮转+空闲任务让步

B:可抢占+时间片轮转+空闲任务不让步

C:可抢占+非时间片轮转+空闲任务让步

D:可抢占+非时间片轮转+空闲任务不让步

E:合作调度

相关推荐
莫到空离22 分钟前
LVS三种模式实战
linux·服务器·网络
qq_2151383271 小时前
【51单片机-B020】【protues仿真】基于51单片机智能晾衣架仿真
单片机·嵌入式硬件
Azxcc01 小时前
Linux内存系统简介
linux·性能优化·内存子系统
小猪写代码1 小时前
STM32 GPIO的八种工作模式
stm32·单片机·嵌入式硬件·gpio
CIAS1 小时前
clonezilla 导出自动化恢复iso
linux·windows·clonezilla
1+2单片机电子设计2 小时前
STM32 单片机的停车场管理系统设计与实现
stm32·单片机·嵌入式硬件·51单片机
如愿小李2 小时前
STM32之土壤湿度传感器模块
stm32·单片机·嵌入式硬件
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
linux端口监听命令
linux·服务器
iHero2 小时前
【Nextcloud】在 Ubuntu 22.04.3 LTS 上的 Nextcloud Hub 10 (31.0.2) 后台任务cron 的优化
android·linux·ubuntu·nextcloud
二向箔reverse2 小时前
Linux 文件操作命令大全:从入门到精通的实用指南
java·linux·服务器