天天看点

进程之间的通信方式

https://www.cnblogs.com/edisonchou/p/5022508.html

进程之间有直接通信和间接通信两种方式。

有管道、信号、消息队列、共享内存、socket、信号量。

管道

一个进程向存储空间的一端写入信息,另一个进程存储空间的另外一端读取信息,这个就是管道。

信号是在软件层次上对中断机制的一种模拟,是一种异步通信方式。

信号可以直接进行用户空间进程和内核进程之间的交互,内核进程也可以利用它来通知用户空间进程发生了哪些系统事件。它可以在任何时候发给某一进程,而无需知道该进程的状态。

在计算机中,信号就是一个内核对象或者是一个内核数据结构。发送方将该数据结构的内容填好,并指明该信号的目标进程后,发出特定的软件中断(这就是一个发电报的操作)。OS接收到特定的中断请求后,知道是有进程要发送信号,于是到特定的内核数据结构里查找信号接收方,并进行通知。接到通知的进程则对信号进行相应处理。

信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

在计算机中,信号量实际上就是一个简单整数。一个进程在信号变为0或1的情况下推进,并将信号变为1或0来防止别的进程同时推进。当该进程完成任务后,则将信号再改为0或1,从而允许其他进程执行。从而我们也可以看出,信号量已经不只是一种通信机制,更是一种同步机制。

共享内存

共享内存(shared memory)可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

套接口

套接口(socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。

消息队列:

消息队列是一列具有头和尾的消息排列,新来的消息放在队列尾部,而读取消息则从队列头部开始。这样看来,它和管道十分类似,一头读,一头写?的确,看起来很像管道,但又不是管道:

  (1)消息队列无固定的读写进程,任何进程都可以读写;而管道需要指定谁读和谁写;

  (2)消息队列可以同时支持多个进程,多个进程可以读写消息队列;即所谓的多对多,而管道是点对点;

  (3)消息队列只在内存中实现,而管道还可以在磁盘上实现;