简介
目的
本文对最新的 Linux-4.19.4 内核源码进行分析,并详细指出内核 IPC 机制中的消息队列的原理。
进程间通信
IPC(进程间通信,InterProcess Communication)是内核提供的系统中进程间进行通信的一种机制。系统中每个进程的用户地址空间互不干扰,所以需要内核来提供进程之间进行通信机制。
进程间通信的七种方式:
- 管道/匿名管道 (PIPE)
- 有名管道 (FIFO)
- 信号 (Signal)
- 消息 (Message) 队列
- 共享内存 (Share Memory)
- 信号量 (Semaphore)
- 套接字 (Socket)
消息队列简介
消息队列是消息的链接表,包括 Posix 消息队列和 System V 消息队列。消息队列克服了信号承载信息量少、管道只能承载无格式字节流以及缓冲区大小受限等缺点,克服了早期 Lunix 通信机制的一些缺点。消息队列将消息看作一个记录,具有特定的格式以及特定的优先级,对消息队列有写权限的进程可以向中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读取消息,消息队列是随内核持续的。
源码分析
重要文件
- ./ipc/msg.c
- ./ipc/msgutil.c
- ./ipc/mqueue.c
数据结构
总体结构见图: