IPC(进程间通信)

23 阅读3分钟

前置知识

进程通信,即进程之间的数据交换 出于安全考虑,每个进程的用户地址空间是独立的 但是内核空间是共享的,因此进程间信息交换需要依靠内核实现

一、管道

管道的本质就是内核在内存中开辟了一个缓冲区,这个缓冲区与管道文件相关联,对管道文件的操作,被内核转换成对这块缓冲区的操作

普通的管道,即匿名管道,只能用于父子间通信

为了解决这个问题,我们使用有名管道 Linux下命令:

mkfifo myPipe
echo "hello" > myPipe
cat < myPipe # print "hello"

缺点

  1. 有名管道遵循先进先出
  2. 并且必须等待另一方的读/写

二、消息队列

消息队列的本质就是存放在内存中的消息的链表,消息则是用户自定义的数据结构

优点

  1. 可以随机查询,不一定要先进先出
  2. 不需要等待
  3. 消息队列需要手动释放,不像管道那样会因为进程结束自动销毁

缺点

  1. 写入数据到内存中的消息队列时,需要从用户态拷贝数据到内核态;同样读的时候需要从内核态拷贝到用户态。因此数据量较大的时候需要进行频繁的系统调用

三、共享内存

两个不同进程的逻辑地址通过页表映射到物理空间的同一区域,它们所共同指向的这块区域就是共享内存 如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程

优点

  1. 仅在建立共享内存区域的时候触发系统调用,建立之后的内存访问不需要调用内核,这是最快的一种进程通信方式

缺点

  1. 可能会发生冲突

四、信号

是一种异步的通信机制 通过发送指定信号来通知进程某个异步事件的发送,以迫使进程执行信号处理程序。信号处理完毕后,被中断进程将恢复执行 用户、内核和进程都能生成和发送信号 例如,键盘按Ctrl + C终止,或者 kill 命令,分别从硬件和软件触发了信号 一般发出信号与信号处理程序都涉及系统调用

五、socket

一般用于不同主机间的进程通信,当然也可以用于同一主机 socket是支持 TCP/IP 协议的网络通信的基本操作单元 进行网络通信要求包含5种信息:使用的协议,本地与远端的IP与端口 socket本质是对 TCP/IP 协议进行了分装,使调用更简单

ref

一文搞懂六大进程通信机制原理(全网最详细)