进程间的通信方式?|青训营笔记

179 阅读4分钟

www.bilibili.com/video/BV1tv…

  1. 管道:父进程需要将数据传递给子进程,或者子进程需要将处理结果返回给父进程。例如,Unix系统中的命令行管道就是使用管道进行进程间通信的经典例子。当我们在终端执行command1 | command2命令时,command1的输出会通过管道传递给command2进行处理。
  2. 共享内存:多个进程需要同时访问同一块内存区域,以便进行数据共享和交换。例如,多个进程需要共同访问一个数据库或者一个缓存区域时,可以使用共享内存进行高效的数据交换。
  3. 消息队列:进程需要以异步的方式进行通信,并且可以处理多个请求或者消息。例如,在分布式系统中,多个进程之间需要通过消息队列进行异步通信。生产者进程将消息发送到队列中,而消费者进程则从队列中取出消息进行处理。
  4. 套接字:进程需要在不同主机之间进行通信。例如,在客户端/服务器应用程序中,客户端进程和服务器进程需要通过套接字进行网络通信,以便进行请求和响应的交换。
  5. 信号量:多个进程需要对共享资源进行同步和互斥访问。例如,在并发编程中,多个进程需要对共享资源进行访问控制时,可以使用信号量进行同步和互斥操作。

管道

管道,通常指无名管道,是 UNIX 系统 IPC 最古老的形式。

  • 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
  • 它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
  • 它可以看成是一种特殊的文件,对于它的读写也可以使用普通的 read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。

消息队列

消息队列,是消息的链接表,存放在内核中。一个消息队列由一个标识符(即队列 ID)来标识。

  • 消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
  • 消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
  • 消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

共享内存和信号量

共享内存(Shared Memory),指两个或多个进程共享一个给定的存储区。

信号量(semaphore)与已经介绍过的 IPC 结构不同,它是一个计数器。信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。

信号量 + 共享内存通常结合在一起使用,信号量用来防止多个进程对共享内存的同时访问。

信号

信号是进程间通信机制中唯⼀的异步通信机制,因为可以在任何时候发送信号给某⼀进程,⼀旦有信号产

⽣,我们就有下⾯这⼏种,⽤户进程对信号的处理⽅式。例如Ctrl+C 产⽣ SIGINT 信号,表示终⽌该进程;

socket

前⾯提到的管道、消息队列、共享内存、信号量和信号都是在同⼀台主机上进⾏进程间通信,那要想跨⽹

络与不同主机上的进程之间通信,就需要 Socket 通信了。

  • Socket通信过程

    Socket保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个Socket对象,然后通过Socket对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。