每个进程的用户地址空间都是独立的,一般而言是不能相互访问的,但内核空间每个进程都共享的,所以进程之间通信必须通过内核。
管道
ps auxf | grep mysql
命令行中的[|]竖线就是一个管道,将前面的输出作为后面的输入,管道传输数据是单向的,如果想互相通信,则需要创建两个管道才行。这是匿名管道,用完就销毁。
管道还有另外一个类型是命名管道,也被叫做FIFO,因为数据是先进先出的传输方式。
使用命名管道,需要先通过mkfifo命令来创建,并指定管道名字:
mkfifo myPipe
管道这种通信方式效率低,不适合进程间频繁地交换数据。当然,它的好处,自然就是简单,同时我们也很容易知道管道里的数据已经被另一个进程读取了。
消息队列
消息队列是保存在内核中的消息链表。
消息队列不适合比较大数据的传输。
消息队列通信过程中,存在用户态与内核态之间的数据拷贝开销。
共享内存
共享内存的机制,就是拿出一块虚拟地址空间来,映射到相同的物理内存中。
信号量
信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。
信号
对于异常情况下的工作模式,就需要用[信号]的方式来通知进程。
Socket
跨网络与不同主机上的进程之间通信,就采用Socket通信了。