进程间通信(IPC)

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)

进程间通信

常见的进程间通信的方式有如下:

  1. 管道/匿名管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。例如 ls -l | grep string就是一个管道
  2. 信号量(signal): 信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
  3. 套接字(socket): 套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同主机的进程通信。
  4. 消息队列(MessageQueue): 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
  5. 共享内存(shareMemory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式。

共享内存

共享内存就是允许两个或多个进程共享一定的存储区。就如同 malloc() 函数向不同进程返回了指向同一个物理内存区域的指针。当一个进程改变了这块地址中的内容的时候,其它进程都会察觉到这个更改。因为数据不需要在客户机和服务器端之间复制,数据直接写到内存,不用若干次数据拷贝,所以这是最快的一种IPC(进程间通信)。

共享内存

共享内存是IPC通信当中传输速度最快的通信方式没有之一,但是共享内存并未提供同步机制,也就是说,在一个服务进程结束对共享内存的写操作之前,并没有自动机制可以阻止另一个进程(客户进程)开始对它进行读取。 因此常用会通过信号量来实现对共享内存同步访问控制。

常见的共享内存函数

  1. 创建共享内存——>shmget() 函数
  2. 操作共享内存———>shmctl()函数
  3. 挂接操作———>shmat()函数
  4. 分离操作———>shmdt()函数

参考文档