进程通信IPC
Peng's Blog 只记录和技术相关的东西

进程通信IPC


IPC介绍

进程间通信。InterProcess Communication。

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须经过内核,在内核当中开辟一块缓冲区。

模型:

进程间通信模型

如图,进程1把数据从用户空间拷贝到内核缓冲区,进程2再从内核缓冲区把数据读走。内核提供的这种机制称为进程间通信,简称IPC。

顺便提一下,没有线程间通信这一说法。同一个进程用的是同一块地址空间,要进行通信是非常简单的。


方式

进程间通信是指在不同进程之间传播或交换信息。主要方式有管道、消息队列、信号量、共享存储、Socket、Streams等。

其中,Socket和Streams支持不同主机上的两个进程IPC。


管道

管道/匿名管道(pipe)

  • 管道是半双工的,数据只能向一个方向流动,需要双方通信时,需要建立起两个 管道;
  • 只能用于父子进程或者兄弟进程之间,即具有亲缘关系的进程
  • 可以看做是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数,但它不是普通的文件,并不属于其它任何文件系统,并且只存在内存当中,

管道


命名管道(FIFO)

为啥会有这鬼东西呢?因为上面那个叫做匿名管道,由于没有名字,所以只能用于有亲缘关系的进程之间通信。为了克服这个不足,所以有了这个。

特点:

1、FIFO可以在无关的进程之间交换数据,和匿名管道不同

2、FIFIO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

3、命名管道的名字存放在文件系统中,内容放在内存中。

4、看到FIFO就应该要想到First in first out。先进先出。


信号量

信号量和之前说的那些不太一样,它不是一个计数器。信号量用于实现进程间的同步和互斥,没错,就是当时操作系统学的那个PV操作。

信号量用于实现进程间的同步和互斥,而不是用于存储进程间通信数据。主要就是通知进程有某种事件发生。

特点:

1、信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

2、信号量基于操作系统的PV操作,所以,程序对信号量的操作都是原子操作。

3、每次对信号量的PV操作不仅限于对信号量加减1,而且可以加减任意正整数。

4、支持信号量组。

Linux系统中常用信号:

(1)SIGHUP:用户从终端注销,所有已启动进程都将收到该进程。系统缺省状态下对该信号的处理是终止进程。

(2)SIGINT:程序终止信号。程序运行过程中,按Ctrl+C键将产生该信号。

(3)SIGQUIT:程序退出信号。程序运行过程中,按Ctrl+\键将产生该信号。

(4)SIGBUS和SIGSEGV:进程访问非法地址。

(5)SIGFPE:运算中出现致命错误,如除零操作、数据溢出等。

(6)SIGKILL:用户终止进程执行信号。shell下执行kill -9发送该信号。

(7)SIGTERM:结束进程信号。shell下执行kill 进程pid发送该信号。

(8)SIGALRM:定时器信号。

(9)SIGCLD:子进程退出信号。如果其父进程没有忽略该信号也没有处理该信号,则子进程退出后将形成僵尸进程。


消息队列

消息队列,是存放在内核中的消息链表。而消息就是链表中具有特定格式和优先级的记录。

与管道不同的是消息队列存放在内核中,只有在内核重启或者显示的删除一个消息队列的时候,该消息队列才会被真正的删除。(匿名管道,之存放在内存中的文件;命名管道,存在于实际的磁盘介质或者文件系统。)

与命名管道相比,消息队列的优势在于:

1、消息队列可以独立于发送和接受进程而存在,从而消除了在同步命名管道的打开和关闭时可能产生的困难。

2、接受程序可以有选择的接收,而命名管道那样只能默认地接收。


共享内存

让多个进程直接读写同一块内存空间。为了在多个进程间进行信息的交换,内核专门留出来了一块内存区,可以由需要访问的进程将其映射到自己的私有地址空间。进程就可以直接到这一块内存而不需要进行数据的拷贝,从而大大地提升了效率。

特点:

1、最快的一种IPC方式,因为进程是直接对内存进行存取

2、因为多个进程可以同时操作, 所以需要进行同步

3、信号量+共享内存通常结合在一起用,信号量用来同步对共享内存的访问。


套接字(socket)

它可以让不在同一台计算机,但通过网络连接计算机上的进程 进行通信。

Socket是支持TCP/IP的网络通信的基本操作单元。


参考资料

1、《深刻理解Linux进程间通信(IPC》。2002.12。https://www.ibm.com/developerworks/cn/linux/l-ipc/

2、《进程间通信IPC (InterProcess Communication)》。2016.5。http://www.jianshu.com/p/c1015f5ffa74

3、《【Linux编程】进程间通信(IPC)》。2015.4。https://songlee24.github.io/2015/04/21/linux-IPC/

4、https://github.com/xuelangZF/CS_Offer/blob/master/Linux_OS/IPC.md


上一篇 Redis

Comments

评论功能暂停使用,如需跟作者讨论请联系底部的GitHub