POSIX 中的正确消息队列用法

Proper message queue usage in POSIX

本文关键字:消息 队列 用法 POSIX      更新时间:2023-10-16

我对在实时操作系统中使用消息队列感到非常困惑。给出的代码似乎将消息队列使用到骨头:甚至将变量传递给另一个类对象也是通过 MQ 完成的。我一直有一个在IPC中使用的MQ的概念。问题是:什么是消息队列的正确用法?

在实时操作系统环境中,您经常面临必须保证以固定计划执行代码的问题。 例如,您可能有一个每 10 毫秒精确调用一次的函数。不早,不晚。

为了保证这种硬时序约束,您必须编写在任何情况下都不得阻塞时间关键代码的代码。

此处不能使用 posix 线程同步原语。切勿从时间关键代码锁定互斥锁或限制信号量,因为其他进程/线程可能已经锁定了它。但是,通常允许您从时间关键代码中取消阻止其他线程(例如,发布信号量是可以的)。

在这样的环境中,消息队列是交换数据的不错选择,因为它们提供了一种干净的方式来将数据从一个线程传递到另一个线程而不会阻塞。

使用队列来设置变量可能听起来有点矫枉过正,但它是非常好的软件设计。如果你这样做,你就有一个定义良好的接口来访问你的时间关键型代码。

此外,它有助于编写确定性代码,因为您永远不会遇到竞争条件的问题。如果通过消息队列设置变量,则可以确保时间关键型代码以与发送消息相同的顺序看到消息。混合使用直接内存访问和消息时,无法保证这一点。

消息队列主要用作 IPC 机制,每当需要在两个不同的进程之间交换数据时。但是,有时消息队列也用于线程上下文切换。例如:
您使用位于驱动程序顶部的软件层注册一些回调。回调将在驱动程序的上下文中返回给你。它是驱动程序生成的线程。现在你不能通过在其中进行大量处理来占用这个驱动程序线程。因此,可以将回调中返回的数据添加到消息队列中,该队列阻止了应用程序线程以对数据执行处理。

我不明白为什么应该使用消息队列来替换普通的函数调用。