进程间通信(IPC)
每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)
常见的进程间通信的方式有如下:
- 管道/匿名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。例如
ls -l | grep string
就是一个管道 - 信号量(signal): 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
- 套接字(socket): 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机的进程通信。
- 消息队列(MessageQueue): 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
- 共享内存(shareMemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式。
共享内存
共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC(进程间通信)。
共享内存是IPC通信当中传输速度最快的通信方式没有之一,但是共享内存并未提供同步机制,也就是说,在一个服务进程结束对共享内存的写操作之前,并没有自动机制可以阻止另一个进程(客户进程)开始对它进行读取。 因此常用会通过信号量来实现对共享内存同步访问控制。
常见的共享内存函数
- 创建共享内存——>shmget() 函数
- 操作共享内存———>shmctl()函数
- 挂接操作———>shmat()函数
- 分离操作———>shmdt()函数
参考文档
- https://mp.weixin.qq.com/s/GMCi0tA-syEliTYzjrv6Mw // 分布式实验室
- https://www.cnblogs.com/wuyepeng/p/9748889.html // Linux下进程间通信方式——共享内存