前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RTP之调度策略

RTP之调度策略

作者头像
Taishan3721
发布2019-09-30 11:19:42
1.4K0
发布2019-09-30 11:19:42
举报
文章被收录于专栏:这里只有VxWorks这里只有VxWorks

在《Task之调度策略》里介绍了VxWorks的主要调度策略,而有了RTP之后,系统又是如何调度的呢?其实非常非常简单:RTP不参与调度VxWorks还是使用之前的调度策略,即所有Task基于优先级抢占,以及默认关闭的时间片轮转。这确保在任何给定的时刻,系统中准备运行的最高优先级Task都将执行,而不管该Task是在内核中还是在任何进程中。相比之下,非实时系统主要使用分时调度策略,以及动态调整进程优先级,以确保没有进程会长期无法使用CPU,并且没有进程独占CPU。VxWorks的时间片轮转也是一种分时策略,但它不会干扰优先级的抢占,因此它具有确定性,保证了实时性。

如果你不打算使用pthread,现在就可以跳到文末点赞了

----------分割线---------

不过,为了更好的支持POSIX标准,VxWorks在RTP里引入了POSIX的Thread调度策略。事实上,要想在RTP里使用POSIX的Thread必须要包含这种调度策略:INCLUDE_POSIX_PTHREAD_SCHEDULER

从名字上就可以看出来,这种策略只对RTP里的Thread有效。而Kernel里的Task和Thread,以及RTP里的Task,用的都是VxWorks的传统策略

POSIX定义的几种调度策略在VxWorks的RTP中的实现方式:

  • SCHED_FIFO – 类似于默认的优先级抢占
  • SCHED_RR – 基于时间片轮转策略封装
  • SCHED_OTHER – 直接使用当前调度策略
  • SCHED_SPORADIC – 这个复杂些,没有直接对应的策略。它适用于零星的非周期行为,可以让该Thread在短期内以高优先级执行,其它时间内以低优先级执行

需要注意的地方:

  • 不建议Thread函数与Task函数混用,即POSIX的Thread里就不要调用Task相关的函数了
  • Task的优先级越高,数字越小,例如0是最高优先级;POSIX Thread相反,优先级越高,数字越大。不过将全局变量posixPriorityNumbering的值由默认的TRUE改为FALSE后,POSIX的优先级就与VxWorks的一致了
  • Thread的调度策略不能动态切换到SCHED_SPORADIC,但是可以从SCHED_SPORADIC动态切换到其它策略
  • 如果已经使能了时间片轮转策略,再使用kernelTimeSlice()改变时间片大小的时候,不会影响到之前使用SCHED_RR策略创建的Thread的时间片。
  • 使用pthread_setschedprio()降低Thread的优先级后,该Thread会排到同优先级队列的部;而使用taskPrioritySet()降低Task的优先级后,该Task会排到同优先级队列的
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 这里只有VxWorks 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档