SysV 消息队列机制与实现详解
源码路径:
rk3588/kernel-6.1/ipc/msg.c、msgutil.c
文档目录:linuxDoc/ipc/
目录
一、原理
消息队列以 链表 保存变长消息,发送方 拷贝 数据到内核(非零拷贝共享内存):
msgget创建队列msgsnd入队(可阻塞)msgrcv按 type 规则取消息(SEARCH_EQUAL、<type等)msgctl:STAT、SET、RMID、INFO
适合 小消息、多类型 协调;高吞吐场景更倾向 shm 或 socket。
二、数据结构
1 | struct msg_queue { |
| 结构 | 作用 |
|---|---|
msg_msg |
消息头 + 内联或分页数据(msgutil.c) |
msg_receiver |
阻塞接收者,r_msg 无锁完成路径 |
msg_sender |
阻塞发送者 |
三、实现要点
3.1 MSG_BARRIER(与 mqueue 类似)
接收方被唤醒时,r_msg 用 release/acquire 语义设置,使 返回路径可不持锁,降低 contention。
3.2 限额(每 namespace)
| 参数 | sysctl 典型名 | 含义 |
|---|---|---|
msg_ctlmax |
msgmax |
单条消息最大字节 |
msg_ctlmnb |
msgmnb |
队列总字节上限 |
msg_ctlmni |
msgmni |
系统队列数上限 |
percpu_msg_bytes / percpu_msg_hdrs 统计用量;内存热插拔可触发 auto_msgmni 重算。
3.3 安全
security_msg_queue_*、audit 挂钩在关联与操作时。
四、msgutil 消息体
alloc_msg/load_msg/store_msg:按页链式msg_msgseginit_ipc_ns:全局初始命名空间(无IPC_NS时仍需要)DEFINE_SPINLOCK(mq_lock):与 POSIX mqueue 共享(注释说明单文件编译场景)
五、系统调用与限额
| syscall | 说明 |
|---|---|
msgget |
|
msgsnd / msgrcv |
支持 IPC_NOWAIT |
msgctl |
含 64 位 msqid_ds |
附录
相关:05 POSIX mqueue(不同 API,同属 IPC 命名空间)
正在加载留言…