RTT昨天新merge了一条PR
[kernel][ipc] 移除mutex RT_IPC_FLAG_FIFO 功能 #4852
对于描述中说的”互斥量诞生之初就是为了解决信号量带来的无界优先级反转问题(Sha, 1990),而FIFO flag却恰恰人为引入了无界优先级反转的问题“, 并且貌似是引述而来(Sha, 1990)。
它的改法很简单,仅仅是去掉了FIFO这个选项,默认强制设置为PRIO。

看一下其它OS怎么处理的:
UCOSIII:
UCOSIII挂队的统一接口是OS_Pend,信号量和互斥锁都是从这里进入。

它的实现是:

很明显可以看出UCOSIII也是按照优先级入队的。
再来看一下UCOSII,ucos使用事件来pend tcb,入口为OS_EventTaskWait:



看到按照优先级设置bitmap.
唤醒的流程是


唤醒操作也是按照优先级来进行的。不是FIFO。
看一下FreeRTOS:
初始化设置优先级到pxNewTCB->xEventListItem中

之后,在资源获取不到睡眠时,调用的是:

最终,也是按照优先级进行排序的:

nuttx系统的做法:
nuttx系统在资源获取不到进入睡眠时会调用nxsched_add_blocked函数,此函数会判断全局列表的类型,如是是PRIORITIZED的类型,则需要按照优先级进行入队。否则,加入普通队列。

nuttx 的所有队列都是全局的,而不像其它系统,每个ipc对象都有一个队列。所以通过全局列表可以看出队列的属性,从下图可以看出,大部分的队列都是PRIORITIZED的,所以资源不到位时都会进入优先级队列等待。

所以看起来,大部分RTOS的资源就绪队列默认就是按照RTT中的RT_IPC_FLAG_PRIO模式管理的,RT_IPC_FLAG_FIFO模式用的很少,这个改动没有问题,有问题的是它的理由。
本文探讨了RTT PR#4852中关于mutex RT_IPC_FLAG_FIFO功能移除的原因,指出该功能可能导致无界优先级反转问题,并对比了多个RTOS如UCOSIII、UCOSII、FreeRTOS和Nuttx的资源就绪队列管理策略,显示它们通常采用PRIO模式而非FIFO。结论认为改动合理,但需重新审视其理论依据。
2631

被折叠的 条评论
为什么被折叠?



