十一、任务调度算法

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:合作调度

相关推荐
任风雨1 小时前
附录I Linux命令一览
linux·服务器
黄金旺铺1 小时前
Linux 命令与运维终极手册(2025 完整版)
linux·运维·服务器
qq_398586542 小时前
小小电脑安装logisim-evolution
linux·proot
小莞尔2 小时前
【51单片机】【protues仿真】基于51单片机简易电子琴系统(8键)
c语言·单片机·嵌入式硬件·物联网·51单片机
oioihoii2 小时前
不止于Linux:百花齐放的开源世界与社区的力量
linux·运维·开源
打不了嗝 ᥬ᭄2 小时前
传输层协议TCP
linux·服务器·网络·c++·tcp/ip
moringlightyn3 小时前
基础开发工具--编译器g++/gcc 自动化构建make/Makefile
linux·运维·笔记·自动化·c·编译器·make/makefile
程序员陆通3 小时前
CentOS/AlmaLinux 9 中 SSH 服务启动失败:OpenSSL 版本不匹配解决
linux·centos·ssh
ZYMFZ3 小时前
HAProxy 简介及配置
linux·负载均衡·haproxy
敲上瘾3 小时前
Linux系统C++开发环境搭建工具(三)—— brpc使用指南
linux·c++·分布式·rpc