Linux之【进程间通信(IPC)】-总结篇
- 管道
- System V共享内存
- System V消息队列
- System V信号量
- IPC资源的管理方式
往期文章
1.进程间通信之管道
2.进程间通信之System V共享内存
管道
- 进程之间具有独立性,拥有自己的虚拟地址空间,因此无法通过各自的虚拟地址进行通信(A的地址经过B的页表映射不一定映射在什么位置)
- 除了内核中的缓冲区之外还有文件以及网络通信的方式可以实现进程间通信
- 管道的本质是内核中的缓冲区,通过内核缓冲区实现通信,命名管道的文件虽然可见于文件系统,但是只是标识符,并非通信介质
System V共享内存
-
共享内存的本质就是开辟一块物理内存,让多个进程映射同一块物理内存到自己的地址空间进行访问,实现数据共享的。
-
共享内存的操作是非进程安全的,多个进程同时对共享内存读写是有可能会造成数据的交叉写入或读取,造成数据混乱
-
共享内存的删除操作并非直接删除,而是拒绝后续映射,只有在当前映射链接数为0时,表示没有进程访问了,才会真正被删除
-
共享内存生命周期随内核,只要不删除,就一直存在于内核中,除非重启系统(当然这里指的是非手动操作,可以手动删除)
System V消息队列
消息队列是OS提供的内核级队列,消息队列提供了一个从一个进程向另外一个进程发送一块数据的方法,每个数据块都被认为是有一个类型,接收者进程接收的数据块可以有不同的类型值
消息队列与共享内存不同之处在于:
共享内存需要关联,消息队列使用
//发送
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
//接收
ssize_t msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp,
int msgflg);
msqid:同shmid
msgp:柔性数组地址
msgsz:数据大小
msgtyp:标识符,表示要读取写入那个类型节点
msgflag:同shmflag作用
来收发消息
System V信号量
参考linux【多线程】基于环形队列(RingQueue)的生产消费模型
IPC资源的管理方式
除管道外,其余三种,虽然内部的属性差别很大,但是维护它们的数据结构的第一个成员结构是一样的,都是ipc_perm类型的成员变量,都可以通过key来标识唯一性
1)三种ipc资源数据结构的首地址元素相同,用一个struct ipc_perm* perms[]指针数组进行管理。
2)访问时只需(struct shmid_ds*)perms[0] 对指针强转就可以得到每个共享内存的属性,消息队列,信号量同理。
3)这是C语言模拟实现的一种多态行为。以【struct ipc_perm 】为基类