我读过关于协作调度程序,它不让高优先级任务运行,直到低优先级任务块本身。所以如果任务中没有延迟,较低的任务将永远占用CPU,这是正确的吗?因为我认为非抢占是合作的另一种说法但是有另一篇文章让我感到困惑它说在非抢占中,更高的任务可以在sys tick时中断较低的任务而不是在tick之间的中间那么什么是正确的?其实合作和不先发制人是一样的吗?
和Rate单调是一种抢占式调度器,对吗?它的优先级没有手动设置调度算法决定优先级基于执行时间或截止日期,这是正确的?
它的速率单调优于固定优先级抢占内核(其中FreeRtos使用)?
这些术语永远无法完全涵盖可能存在的可能性范围。事实是,人们可以编写任何他们喜欢的调度器,然后其他人尝试将编写的内容放入一个或多个类别。
先发制人意味着中断(例如:来自时钟或外设)可以导致任务切换发生,也可以在调度操作系统函数被调用时发生(如延迟或接收或给出信号量)。
cooperative的意思是任务函数必须返回或者调用操作系统函数来导致任务切换。
一些操作系统可能有一个特定的定时器中断,导致上下文切换。ARM系统中断适合于此目的。因为任务本身不需要调用调度函数,所以这是一种抢占。
如果调度程序使用定时器允许具有相同优先级的多个任务共享处理器时间,那么它的一个通用名称是"轮询调度程序"。我没有听说过"率单调"这个词。但我认为它的意思非常相似。
听起来像你读过的文章描述了一个非常简单的抢占式调度器,其中任务确实有不同的优先级,但任务切换只能在计时器中断运行时发生。
协作调度是非抢占式的,但"非抢占式的";可以描述任何不使用抢占的调度器。这是一个相当不具体的术语
然而,你所描述的文章(没有引用)似乎很混乱。如果被中断的任务没有显式地产生,则标记事件上的上下文切换是抢占。不是你在网上读到的所有东西都是真实的或权威的;经常检查你的消息来源,以确定他们的专业水平。热情的业余爱好者比比皆是。基于完全抢占优先级的调度程序可以上下文切换"调度事件";这不仅包括计时器滴答,而且还包括当一个正在运行的线程或中断处理程序触发IPC或同步机制时,一个比当前线程更高优先级的线程正在等待。
你所说的"非先发制人"我建议实际上是一个时间触发的抢占式调度器,其中上下文切换仅在tick事件中发生,而不是在消息队列发布或信号量给出时异步发生。
速率单调调度器不一定自动确定优先级(事实上我从未遇到过这样的调度器)。而是根据要执行的任务的速率单调分析(rate-monotonic analysis)手动设置优先级。它是"rate-单调;在这个意义上,它支持速率单调调度。对于系统设计者来说,仍然有可能应用完全不适当的优先级或分区任务,使它们对RMS的实际发生没有足够的确定性。
大多数RTOS调度器支持RMS,包括FreeRTOS。大多数RTOS还支持可变任务优先级,既可以缓解优先级反转,也可以通过API实现。但老实说,如果您的应用程序依赖于其中任何一种,我会认为这是一个失败的设计。