任务调度器详解(FreeRTOS)

news2024/11/18 11:40:21

目录

什么是任务调度器

FreeRTOS的任务调度器

抢占式调度

协作式调度

时间片调度


什么是任务调度器

        任务调度器是实时操作系统(RTOS)的一个关键组件,它负责决定在多个可运行任务中哪一个将获得CPU时间以执行。它基于任务的优先级和状态来做出这些决定。

        在一个RTOS中,可能会有多个任务同时运行,但是在任意时刻,CPU只能执行一个任务。任务调度器的主要目标是按照系统的需求合理分配CPU时间。

        基本功能

  1. 任务的选择:任务调度器会根据预设的算法从所有可运行的任务中选择一个要执行的任务。
  2. 任务的优先级:任务通常会被分配一个优先级,优先级越高的任务在抢占式调度中会优先执行。
  3. 任务状态管理:任务可能处于就绪状态(可立即运行)、阻塞状态(等待某些条件满足)或者挂起状态(暂停执行)。
  4. 上下文切换:任务调度器负责在不同任务之间进行上下文切换。这意味着将当前任务的状态保存起来,然后加载另一个任务的状态,以便它可以继续执行。
  5. 定时器管理:任务调度器通常会关注系统中的定时器,以便能够在特定事件发生时唤醒相应的任务。
  6. 中断处理:任务调度器需要与系统的中断处理程序协同工作,以确保在中断上下文中也能够正常进行任务调度。
  • 任务调度器确保了各个任务之间的合理分配和调度,以满足实时性要求和系统的功能需求。

FreeRTOS的任务调度器

        FreeRTOS提供了多种任务调度器,每种调度器适用于不同的应用场景和需求。

        以下是一些常见的FreeRTOS任务调度器

        1. 抢占式调度器(Preemptive Scheduler)

        解释:抢占式调度器是一种优先级基础的调度器,它允许更高优先级的任务可以抢占正在执行的低优先级任务,以确保紧急任务得到及时处理。

        优点:适用于实时要求严格的系统,可以确保高优先级任务及时响应。

        缺点:上下文切换的开销较大,可能会影响系统的性能。

         2. 协作式调度器(Cooperative Scheduler)

        解释:协作式调度器依赖于任务自行释放CPU,没有明确的任务优先级。任务必须自愿放弃CPU控制权,以便其他任务能够运行。

        优点:上下文切换开销较小,适用于资源受限的系统。

        缺点:如果任务不合作,可能会导致系统响应性降低。

        3. 时间片轮转调度器(Time-Slicing Scheduler)

        解释:时间片轮转调度器是一种抢占式调度器,它将CPU时间划分成小的时间片段,每个任务在一个时间片段内运行。

        优点:适用于多个任务优先级相近的场景,可以避免某个任务长时间占用CPU。

        缺点:会引入一定的上下文切换开销。

        这些调度器提供了不同的调度策略,可以根据系统的实时性需求和资源约束选择合适的调度器。例如,对于实时性要求高的系统,可以选择抢占式调度器,而对于资源受限的系统,协作式调度器可能是一个更好的选择。 Time-Slicing调度器则可以在优先级相近的任务之间实现公平分配CPU时间。

抢占式调度

        抢占式调度是一种实时操作系统(RTOS)中的任务调度策略。在抢占式调度中,RTOS具有能力在任意时刻暂停当前正在执行的任务,并切换到具有更高优先级的任务上去执行。

        1. 任务优先级:每个任务都会被分配一个优先级。优先级较高的任务被认为更紧急,将会在可运行时抢占具有较低优先级的任务。

        2. 抢占:当一个高优先级的任务准备好运行时,RTOS会暂停当前正在执行的低优先级任务,并将CPU的控制权转交给高优先级任务。

        3. 上下文切换:在抢占发生时,RTOS会保存当前任务的上下文(包括寄存器状态等),然后加载高优先级任务的上下文,使其可以继续执行。这个过程称为上下文切换。

        4. 实时性:抢占式调度器可以保证高优先级任务能够及时响应紧急事件。这对于实时系统和需要快速响应的应用程序非常重要。

        5. 任务挂起:在抢占式调度中,可以随时挂起(暂停)一个任务,以便给更高优先级的任务让路。

        6. 任务阻塞:一个任务可以由于等待某些条件的发生而被阻塞。当这些条件满足时,RTOS会将其重新置为就绪状态。

        7. 中断处理:抢占式调度需要能够在中断上下文中正确地处理任务的切换。

        8. 实时性保证:抢占式调度对于需要在严格的实时约束下工作的系统非常重要,因为它可以确保高优先级任务在预期的时间内得到处理。

        抢占式调度提供了对任务优先级的动态响应能力,使得RTOS可以有效地处理紧急情况,同时保证了系统的实时性。然而,抢占式调度也可能会引入一些上下文切换的开销,因此在设计系统时需要权衡好实时性和性能。

协作式调度

        在协作式调度中,任务的执行权由任务自行释放,而不是由RTOS强制性地进行抢占。换句话说,任务必须自愿地让出CPU控制权,以便其他任务能够运行。

        1. 任务自主控制:在协作式调度中,任务负责自己的执行时间。任务在需要让出CPU时,会主动调用RTOS提供的让出控制权的函数。

        2. 没有明确的任务优先级:协作式调度中通常没有明确的任务优先级概念。所有的任务被视为平等,没有任务可以强制其他任务停止执行。

        3. 低上下文切换开销:相比抢占式调度,协作式调度通常具有更低的上下文切换开销,因为任务只有在愿意让出CPU时才会发生切换。

        4. 任务合作:任务之间需要合作以确保系统的正常运行。如果一个任务长时间占用CPU,其他任务可能会受到影响。

        5. 适用于资源受限的系统:协作式调度适用于资源有限的嵌入式系统,因为它减少了抢占式调度中的上下文切换开销。

        6. 可能导致响应性降低:如果一个任务不合作,即使有更高优先级的任务需要执行,也可能导致响应性降低,因为任务不会主动让出CPU。

        7. 任务挂起和任务阻塞:虽然没有抢占,但任务仍然可以被挂起(暂停)或者阻塞,等待某些条件的发生。

        协作式调度依赖于任务之间的自愿合作,适用于资源有限或者对上下文切换开销敏感的嵌入式系统。然而,它也需要任务之间的良好协作,以确保系统的正常运行。

时间片调度

        在时间片调度中,RTOS将CPU的执行时间划分为小的时间片段,每个任务在一个时间片段内运行。

        1. 时间片段:CPU的执行时间被划分成固定长度的时间片段。每个时间片段可以是几毫秒或者更短的时间,具体取决于系统的配置。

        2. 任务优先级:每个任务都被分配一个优先级。在一个时间片段内,具有相同优先级的任务会依次轮流执行。

        3. 抢占:当一个时间片段结束时,RTOS会暂停当前执行的任务,并将CPU的控制权转交给具有相同优先级的下一个任务。

        4. 上下文切换:在每个时间片段结束时,RTOS会进行上下文切换,将当前任务的状态保存起来,并加载下一个任务的状态,以便其可以继续执行。

        5. 公平分配CPU时间:时间片调度确保了每个任务在一定时间段内都有机会执行,从而实现了相对公平的CPU时间分配。

        6. 避免任务长时间占用CPU:时间片调度可以防止某个任务长时间占用CPU,从而保证了其他任务也有机会执行。

        7. 适用于优先级相近的任务:时间片调度特别适用于具有相近优先级的任务集,因为它可以确保它们在相对公平的条件下执行。

        8. 降低实时性:相比于抢占式调度,时间片调度可能会引入一定的上下文切换开销,从而降低了系统的实时性。

        时间片调度是一种抢占式调度策略,通过将CPU时间划分为小的时间片段,确保了相对公平的CPU时间分配。它特别适用于具有相近优先级的任务集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1129438.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软考高级系统架构 上午真题错题总结

目录 前言一、2022年真题(√)二、2021年真题三、2020年真题(√)四、2019年真题(√)五、2018年真题(√)六、2017年真题(√)七、2016年真题(√&…

Remmina Linux 远程桌面(堡垒机)解决方案,含文件互传

简介 Remmina 是一款在 Linux 和其他类 Unix 系统下的自由开源、功能丰富、强大的远程桌面客户端。 对于一个Linux作为主力开发机而言,Remmina 解决痛点主要是公司堡垒机远程客户现场的计算机,公司只给开发了win系统下的远程连接程序,而没有…

SQLi靶场

SQLi靶场 less1- less2 (详细讲解) less 1 Error Based-String (字符类型注入) 思路分析 判断是否存在SQL注入 已知参数名为id,输入数值和‘ 单引号‘’ 双引号来判断,它是数值类型还是字符类型 首先输入 1 , 发现…

IDEA在GitHub / Gitee中拉取特定一个分支代码方法

IDEA通过HTTP / SSH拉取项目的时候,默认都是拉取master分支的节点代码,对于我们通过分支来逐一消化项目的需求是相违背的,那么下面就是如何对一个项目特定分支读取方法 首先正常通过HTTP / SSH拉一个项目下来 打开分支列表,选择指…

一文了解GC垃圾回收

一文了解GC垃圾回收 1 判断一个对象为垃圾对象的方法 引用计数法(弃用) 可达性分析算法 是否有指向GC root 的引用链,如果有,不是垃圾对象 ---->GC roo:即rt.jar包中内容 2 内存泄漏与内存溢出区别 泄漏:原本需要被回收的对象&#…

Python 深度学习入门之CNN

CNN 前言一、CNN简介1、简介2、结构 二、CNN简介1、输出层2、卷积层3、池化层4、全连接层5、输出层 前言 1024快乐!1024快乐!今天开新坑,学点深度学习相关的,说下比较火的CNN。 一、CNN简介 1、简介 CNN的全称是Convolutiona…

英语——语法——从句——名词性从句——笔记

文章目录 名词性从句一、定义二、分类(一)宾语从句(二)主语从句(三)C同位语从句(四)D表语从句 名词性从句 一、句子成分 简而言之,构成一个句子的成分(或要素…

关于 provide、inject 在Vue3中的用法

Vue3关于 provide、inject 的用法 一、传递变量/数据二、传递函数 前言: 在父子组件传递数据时,通常使用的是 props 和 emit。 父传子时,使用的是 props,如果是父组件传孙组件时,就需要先传给子组件,子组件…

STM32:TTL串口调试

一.TTL串口概要 TTL只需要两个线就可以完成两个设备之间的双向通信,一个发送电平的I/O称之为TX,与另一个设备的接收I/O口RX相互连接。两设备之间还需要连接地线(GND),这样两设备就有相同的0V参考电势。 二.TTL串口调试 实现电脑通过STM32发送…

高等数学啃书汇总重难点(六)定积分的应用

无论是考研还是学校期末考试,这一部分的内容都不会太难,因此今天的内容一页笔记就足够放的下了。 重点在于理解所谓的元素法——也就是微元法,即定积分的几何意义。只不过,定积分几何意义的引例为平面问题,实际上&…

Spring初步了解到深入理解

文章目录 1.Spring1.1简介1.2优点1.3组成1.4拓展 2.IOC理论推导3.Hello Spring下面牵扯到的地址: 4.IOC创建对象的方式1.使用无参构造创建对象,默认2.假设我们要使用有参构造创建对象1.下标赋值2.类型3.参数名 5.Spring配置5.1别名5.2bean的配置5.3import 6.依赖注入…

Monocular arbitrary moving object discovery and segmentation 代码复现

环境 https://github.com/michalneoral/Raptor 1.创建environment.yaml name: raptor channels:- pytorch- conda-forge dependencies:- python3.8- pytorch1.9.0- torchvision0.10.0- cudatoolkit11.1- pipconda env create -f environment.yaml conda activate raptor2.安…

C++基类和派生类的内存分配,多态的实现

目录 基类和派生类的内存分配基类和派生类的成员归属多态的实现 基类和派生类的内存分配 类包括成员变量(data member)和成员函数(member function)。 成员变量分为静态数据(static data)和非静态数据&…

技术分享 | 针对蜜罐反制Goby背后的故事

0x01 概述 近期我们联动FORadar做了一个插件,实现了从企业名称->企业漏洞的全自动检测流程,在做具体实践的时候碰到了两个很有意思的蜜罐,其中一个蜜罐内置了Weblogic漏洞,同时配置有专门针对旧版本Goby反制Payload&#xff0…

点亮现代编程语言的男人——C语言/UNIX之父Dennis Ritchie

祝各位程序员们1024程序员节快乐🎉🎉🎉 图片来自网络,侵删 前言 在程序员中,有一位人物的不被人熟知,他的贡献甚至比他自身更要出名 C语言之父,UNIX之父——Dennis MacAlistair Ritchie 一…

0基础学习PyFlink——使用Table API实现SQL功能

在《0基础学习PyFlink——使用PyFlink的Sink将结果输出到Mysql》一文中,我们讲到如何通过定义Souce、Sink和Execute三个SQL,来实现数据读取、清洗、计算和入库。 如下图所示SQL是最高层级的抽象,在它之下是Table API。本文我们会将例子中的SQ…

【机器学习合集】深度学习模型优化方法最优化问题合集 ->(个人学习记录笔记)

文章目录 最优化1. 最优化目标1.1 凸函数&凹函数1.2 鞍点1.3 学习率 2. 常见的深度学习模型优化方法2.1 随机梯度下降法2.2 动量法(Momentum)2.3 Nesterov accelerated gradient法(NAG)2.4 Adagrad法2.5 Adadelta与Rmsprop法2.6 Adam法2.7 Adam算法的改进 3. SGD的改进算法…

LVS+keepalived高可用集群

1、定义 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用,keepalived实现的是调度器的高可用,但keepalived不只为lvs集群服务的,也可以做其他代理服务器的高可用,比如nginxkeepalived也可实现高可用(重…

解密Kubernetes:探索开源容器编排工具的内核

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…