进程和线程三(Linux进程间通信)

一、前言
在讨论进程间通信的时候,我们有一个前置条件,就是先要弄明白进程的概念,进程地址空间的概念,进程的数据结构。务必务必要弄清楚后在继续,读者可查阅本站相关的内容,或其他资料。

二、为什么要进行进程间通信
0、什么是进程间通信
进程间通信即通常所说的IPC(Inter Process Communication), 用户态的进程之间如何进行同步和交换数据的机制。进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程A把数据从用户空间拷到内核缓冲区, 进程B再从内核缓冲区把数据读走, 内核提供的这种机制称为进程间通信。

1、为什么要进行进程间通信
每个进程各自有不同的进程地址空间, 任何一个进程的全局变量在另一个进程中都看不到。

三、进程间通信方式
Linux进程间常用的通信方式有管道、消息队列、共享内存区、信号量、信号、套接字。

0、管道(pipe)
有些进程往管道中写入数据,另外一些进程从管道中读取数据。这样就达到了数据在不同进程之间交互的目的。

例如:

ls | more

进程A(执行ls产生的进程)的标准输入被重定向到管道中,进程B(执行more程序产生的进程)从这个管道中读取输入。

一种特殊的管道FIFO,称为命名管道(named pipe)。

管道详解可参考这里。基于swoole实现多进程中父子进程通过管道交换数据例子可参考这里《基于swoole实现多进程任务处理》。

1、消息队列
多个进程在预定义的消息队列中读和写消息来交换数据。

2、共享内存
多个进程通过共享内存块来交换数据。

两个或多个进程通过把公共数据结构X放入一个共享内存区来访问它们。进程访问X之前,需要在自己的进程地址空间中增加一个新内存区,它将映射到这个共享内存区。

3、信号量
通过信号量与其他进程进行同步。

信号量是一个计数器,用来为多个进程共享的数据结构提供受访控制。

如果受保护的资源是可用的,那么信号量的值就是正数;如果不可用,信号量的值就是0。某个进程去访问资源,把信号量减1后大于0,那么可以访问,否则会被内核阻塞。当进程释放受保护的资源时,就把信号量的值加1,同时唤醒全部在等待这个信号量的进程。

4、信号
信号是用于向一个进程通知发生异常事件的机制。进程间可以相互发送信号。

信号的传递是通过修改接受进程对应的进程表中的一个域来完成的。

5、套接字(socket)
不同计算机上的进程通过网络来交换数据。

四、参考
0、书籍
《深入理解Linux内核》P767
《深入Linux内核架构》P300
《现代操作系统》(Andrew S.Tanenbaum)P66
《操作系统精髓与设计原理》(William Stallings)P192

1、资料
进程间通信方式总结
知乎:目前linux进程间通信的常用方法是什么
Linux进程间通信的几种方式总结–linux内核剖析(七)

发表评论

电子邮件地址不会被公开。 必填项已用*标注