当前位置: 首页 > news >正文

RT-Thread入门笔记5-线程的时间片轮询调度

优先级和时间片是线程的两个重要参数,优先级描述了线程竞争处理器资源的能力。

优先级和时间片

  • 优先级

    RT-Thread 最大支持 256 个优先级(数值越小的优先级越高,0 为最高优先级, 最低优先级预留给空闲线程);用户可以通过rt_config.h中的RT_THREAD_PRIORITY_MAX宏来修改最大支持的优先级;针对STM32 默认设置最大支持32个优先级;具体应用中,线程总数不受限制,能创建的线程总数只和具体硬件平台的内存有关。

  • 时间片
    时间片只有在相同优先级的就绪态线程中起作用,系统对优先级相同的就绪态线程采用时间片轮转的调度方式进行调度时,时间片起到约束线程单次运行时长的作用,其单位是一个系统节拍(OS Tick)。
    假设有2个优先级相同的就绪态线程A与B,A线程的时间片设置为10,B线程的时间片设置为5,那么当系统中不存在比A优先级高的就绪态线程时,系统会在A、B线程间来回切换执行,并且每次对A线程执行10个节拍的时长,对B线程执行5个节拍的时长。

线程调度规则

  • 优先级抢占调度
    操作系统总是让具有最高优先级的就绪任务优先运行:即当有任务的优先级高于当前任务优先级并且处于就绪态后,就一定会发生任务调度。
    通过优先级抢占机制,最大限度的满足了系统的实时性。
  • 时间片轮询调度
    当操作系统中存在相同优先级的线程时(优先级相同就不会抢占),操作系统会按照设置的时间片大小来轮流调度线程,时间片起到约束线程单次运行时长的作用,其单位是一个系统节拍(OS Tick)。
    通过时间片轮询,保证优先级相同的任务能够轮流占有处理器。

时间片轮询调度示例

#include <rtthread.h>#define THREAD_STACK_SIZE	1024
#define THREAD_PRIORITY	    20
#define THREAD_TIMESLICE    10static void thread_entry(void* parameter)
{rt_uint32_t value;rt_uint32_t count = 0;value = (rt_uint32_t)parameter;while (1){if(0 == (count % 5)){           rt_kprintf("thread %d is running ,thread %d count = %d\n", value , value , count);      if(count > 200)return;            }count++;}  
}int timeslice_sample(void)
{rt_thread_t tid;/* 创建线程1 */tid = rt_thread_create("thread1", thread_entry, (void*)1, THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE); if (tid != RT_NULL) rt_thread_startup(tid);/* 创建线程2 */tid = rt_thread_create("thread2", thread_entry, (void*)2,THREAD_STACK_SIZE, THREAD_PRIORITY, THREAD_TIMESLICE-5);if (tid != RT_NULL) rt_thread_startup(tid);return 0;
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(timeslice_sample, timeslice sample);

运行结果:在这里插入图片描述

线程1时间片为:THREAD_TIMESLICE(也就是10)
线程2时间片为:THREAD_TIMESLICE-5(也就是5)
所以线程1计数时间比线程2多一倍。

相关文章:

  • LeetCode906. Super Palindromes
  • 基于模块自定义扩展字段的后端逻辑实现(一)
  • php 字符串常用函数
  • 计算机找不到msvcr100.dll的多种解决方法分享,轻松解决dll问题
  • 中国智造闪耀CES | 木牛科技在美国CES展亮相多领域毫米波雷达尖端方案
  • redis stream restTemplate消息监听队列框架搭建
  • 零基础也可以探索 PyTorch 中的上采样与下采样技术
  • 以太网交换机——稳定安全,构筑数据之桥
  • 【2019】360Java工程师客观题总结
  • AI绘画软件Stable Diffusion模型/Lora/VAE文件存放位置
  • vue前端开发自学demo,父子组件之间传递数据demo2
  • 235.【2023年华为OD机试真题(C卷)】机器人搬砖(二分查找-JavaPythonC++JS实现)
  • 硬核加码!星邦蓝助力全球运力最大固体火箭“引力一号”海上首飞
  • python处理目录下文本文件去除空格和空行
  • 关于Python里xlwings库对Excel表格的操作(三十二)
  • canvas 高仿 Apple Watch 表盘
  • eclipse的离线汉化
  • ES6 ...操作符
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • React中的“虫洞”——Context
  • 关于Flux,Vuex,Redux的思考
  • 京东美团研发面经
  • 小程序开发中的那些坑
  • 协程
  • 硬币翻转问题,区间操作
  • 栈实现走出迷宫(C++)
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • #14vue3生成表单并跳转到外部地址的方式
  • (09)Hive——CTE 公共表达式
  • (12)Linux 常见的三种进程状态
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (LeetCode 49)Anagrams
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (七)Knockout 创建自定义绑定
  • (转载)Linux 多线程条件变量同步
  • **PHP二维数组遍历时同时赋值
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .net core开源商城系统源码,支持可视化布局小程序
  • .Net IOC框架入门之一 Unity
  • .NET 服务 ServiceController
  • .net和php怎么连接,php和apache之间如何连接
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @RestControllerAdvice异常统一处理类失效原因
  • @Transient注解
  • [2015][note]基于薄向列液晶层的可调谐THz fishnet超材料快速开关——
  • [AIGC 大数据基础]hive浅谈
  • [C/C++]数据结构 堆的详解
  • [CISCN2019 华北赛区 Day1 Web5]CyberPunk --不会编程的崽
  • [CSS3备忘] transform animation 等
  • [Geek Challenge 2023] web题解
  • [hive] 窗口函数 ROW_NUMBER()