SysV 消息队列机制与实现详解

SysV 消息队列机制与实现详解

源码路径rk3588/kernel-6.1/ipc/msg.cmsgutil.c
文档目录linuxDoc/ipc/


目录


一、原理

消息队列链表 保存变长消息,发送方 拷贝 数据到内核(非零拷贝共享内存):

  • msgget 创建队列
  • msgsnd 入队(可阻塞)
  • msgrcvtype 规则取消息(SEARCH_EQUAL<type 等)
  • msgctl:STAT、SET、RMID、INFO

适合 小消息、多类型 协调;高吞吐场景更倾向 shmsocket


二、数据结构

1
2
3
4
5
6
7
struct msg_queue {
struct kern_ipc_perm q_perm;
...
struct list_head q_messages;
struct list_head q_receivers;
struct list_head q_senders;
};
结构 作用
msg_msg 消息头 + 内联或分页数据(msgutil.c
msg_receiver 阻塞接收者,r_msg 无锁完成路径
msg_sender 阻塞发送者

三、实现要点

3.1 MSG_BARRIER(与 mqueue 类似)

接收方被唤醒时,r_msgrelease/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_msgseg
  • init_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 命名空间)

文章互动

阅读 --

留言

0 条留言

正在加载留言…