POSIX消息队列 - mq_send线程唤醒命令

时间:2017-10-27 16:33:34

标签: linux linux-kernel posix ipc message-queue

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

我的情况是我有多个编写器阻止完整邮件 队列,每个发布优先级等于线程的消息 优先。我想确保他们按优先顺序叫醒和发布, 但是我的应用程序表现得像是按FIFO顺序唤醒 (即他们阻止的顺序)。每个阻塞线程都是 使用具有不同优先级的SCHED_FIFO策略进行调度 系统级范围。

我在互联网上搜索高低的东西来描述如何 这应该工作,我所能找到的是描述它的POSIX手册页 多个阻止程序按优先级顺序唤醒如果是优先级调度 支持的即可。由于内核调度程序是优先级调度程序 会认为线程会按优先级顺序唤醒并发布到 队列,但似乎并非如此。我敢肯定我 只是遗漏了一些微妙的细节,并希望专家在这里 这份清单可以帮助我了解我所看到的内容 这些线程准备好运行的内核级别。

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

任何人都可以指点我的帮助或文档,以便深入了解这一点?

提前致谢!

1 个答案:

答案 0 :(得分:1)

如果队列已满,Linux内核会查看任务的优先级值,并按任务友好顺序将其添加到等待队列(这是非RT任务的优先级顺序)。等待队列不符合我的应用程序使用的实时优先级。正在正确处理非RT优先级(漂亮的值)并以良好的顺序唤醒。

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