进程间通信方式

111 阅读1分钟

每个进程的用户地址空间都是独立的,一般而言是不能相互访问的,但内核空间每个进程都共享的,所以进程之间通信必须通过内核。

管道

ps auxf | grep mysql

命令行中的[|]竖线就是一个管道,将前面的输出作为后面的输入,管道传输数据是单向的,如果想互相通信,则需要创建两个管道才行。这是匿名管道,用完就销毁。

管道还有另外一个类型是命名管道,也被叫做FIFO,因为数据是先进先出的传输方式。

使用命名管道,需要先通过mkfifo命令来创建,并指定管道名字:

mkfifo myPipe

管道这种通信方式效率低,不适合进程间频繁地交换数据。当然,它的好处,自然就是简单,同时我们也很容易知道管道里的数据已经被另一个进程读取了。

消息队列

消息队列是保存在内核中的消息链表。

消息队列不适合比较大数据的传输。

消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销。

共享内存

共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。

信号量

信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。

信号

对于异常情况下的工作模式,就需要用[信号]的方式来通知进程。

Socket

跨网络与不同主机上的进程之间通信,就采用Socket通信了。