消息队列和邮箱的区别
Difference between message queues and mailboxes
在操作系统中,消息队列和邮箱有什么区别。
我怀疑对于消息队列和邮箱的区别没有普遍接受的定义。每个 RTOS 可能使用不同的术语和实现细节,因此您必须单独查看每个 RTOS。
一般来说,一些常见的差异包括:
- 通过 queue/mailbox 发送的邮件大小是固定的还是邮件大小可以变化?
- queue/mailbox 是否包含对邮件的引用或邮件的副本?
- queue/mailbox 能否容纳一条消息、多条消息或无限条消息?
A queue 通常在计算中具有非常精确的含义,作为具有先进先出 (FIFO) 访问语义的容器数据结构。特别是在 RTOS 队列中,对队列的访问将是线程安全的并且具有阻塞语义。
另一方面,A mailbox 没有普遍接受的特定语义,我看到该术语用于指代非常不同的 RTOS IPC 机制。在某些情况下实际上存在队列,但如果 RTOS 也支持 IPC 队列,则邮箱将具有某种不同的语义——通常与内存管理有关。在其他情况下,邮箱可能本质上是一个长度为 1 的队列——即它具有队列的阻塞和 IPC 能力,但没有缓冲。这样的机制允许进程之间进行同步通信。
邮箱是使用队列和信号量实现的。
如果多个线程被阻止使用邮箱 put() 方法将数据推送到完整队列,则在 space 可用时,只有一个线程可以看到 space 可用并允许将数据推送到队列原子循环。如果没有原子保证,另一个线程可以在另一个线程检查大小并推送数据时将数据推送到队列。
同样如果有超过1个线程在等待取数据清空Queue,也可以原子方式实现。
但是与队列相比,邮箱有额外的开销。
在操作系统中,消息队列和邮箱有什么区别。
我怀疑对于消息队列和邮箱的区别没有普遍接受的定义。每个 RTOS 可能使用不同的术语和实现细节,因此您必须单独查看每个 RTOS。
一般来说,一些常见的差异包括:
- 通过 queue/mailbox 发送的邮件大小是固定的还是邮件大小可以变化?
- queue/mailbox 是否包含对邮件的引用或邮件的副本?
- queue/mailbox 能否容纳一条消息、多条消息或无限条消息?
A queue 通常在计算中具有非常精确的含义,作为具有先进先出 (FIFO) 访问语义的容器数据结构。特别是在 RTOS 队列中,对队列的访问将是线程安全的并且具有阻塞语义。
另一方面,A mailbox 没有普遍接受的特定语义,我看到该术语用于指代非常不同的 RTOS IPC 机制。在某些情况下实际上存在队列,但如果 RTOS 也支持 IPC 队列,则邮箱将具有某种不同的语义——通常与内存管理有关。在其他情况下,邮箱可能本质上是一个长度为 1 的队列——即它具有队列的阻塞和 IPC 能力,但没有缓冲。这样的机制允许进程之间进行同步通信。
邮箱是使用队列和信号量实现的。 如果多个线程被阻止使用邮箱 put() 方法将数据推送到完整队列,则在 space 可用时,只有一个线程可以看到 space 可用并允许将数据推送到队列原子循环。如果没有原子保证,另一个线程可以在另一个线程检查大小并推送数据时将数据推送到队列。 同样如果有超过1个线程在等待取数据清空Queue,也可以原子方式实现。
但是与队列相比,邮箱有额外的开销。