linux - POSIX 消息队列 - mq_send 线程唤醒顺序

标签 linux linux-kernel posix ipc message-queue

有人可以向我解释消息队列如何处理多个唤醒 线程阻塞在单个消息队列上?

我的情况是我有多个作者阻塞了一条完整的消息 队列,每个发布消息的优先级等于线程 优先。我想确保他们醒来并按优先顺序发帖, 然而,我的应用程序表现得好像它们以先进先出的顺序醒来 (即他们阻止的顺序)。每个阻塞线程是 使用具有不同优先级的 SCHED_FIFO 策略进行调度 系统级范围。

我在 Internet 上上下搜索了一些描述如何 这应该可以工作,我能找到的只是描述它的 POSIX 手册页 如果优先级调度是 支持。由于内核调度程序是优先调度程序我 会认为线程会按优先顺序唤醒并发布到 队列,但是情况似乎并非如此。我确定我是 只是缺少一些细微的细节,希望这里的专家 这份 list 可以帮助阐明我所看到的,因为它位于 这些线程已准备好运行的内核级别。

我有一个小型测试应用程序,如有必要,我可以在此处发布。它简单地填充一个队列,然后让几个线程都尝试写入它,所有线程都具有不同的线程优先级并以等于线程优先级的消息优先级发布。然后我从队列中删除一条消息,并期望最高优先级的线程唤醒并发布它的消息。然而,第一个等待的线程首先发布它的消息。

任何人都可以向我指出任何帮助或文档以深入了解这个问题吗?

提前致谢!

最佳答案

事实证明,如果队列已满,Linux 内核会查看任务的优先级值,并按照任务良好顺序(这是非 RT 任务的优先级顺序)将它们添加到等待队列中。等待队列不遵守我的应用程序使用的实时优先级。非 RT 优先级(nice 值)被正确处理并以 niceness 顺序唤醒。

我的问题的根本原因在于内核在将任务添加到内部内核等待队列时如何处理优先级。我向 linux-kernel 列表提交了一个补丁,该补丁已被接受并将进入 future 的版本,它在将任务添加到等待队列时更改了优先级检查——它现在既支持非 RT 优先级也支持 RT 优先级。它不处理截止日期计划任务的优先级。

关于linux - POSIX 消息队列 - mq_send 线程唤醒顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46979725/

相关文章:

php - imagejpeg 和 chmod

c - 你什么时候使用 container_of 宏?

c - 如何在 dev_t 和主要/次要设备号之间进行转换?

php - 当无限 while 循环无所事事时,脚本对信号无响应

linux - Ubuntu 中“which”命令不输出任何内容

c - 运行进程的内存大小是否受操作系统限制?

linux - 获取符号表中的符号数

linux - 信号量值大于初始值

c - 如何从用户程序中调用用内核模块编写的函数?

c++ - 是否有必要在互斥锁上调用 pthread_mutex_destroy?