进程间通信(IPC
)指的是在操作系统重,允许两个或者多个进程之间传递信息或者数据的机制;
进程是操作系统重独立运行的实体,即进程间具有独立性,存在自己的地址空间;
因此进程间默认无法直接访问彼此的内存空间,其通信成本会较高;
IPC
提供一种方式使得互相独立的进程能够交换数据并进行通信和数据共享;
基本数据交换
进程间通信允许不同的进程交换基本的数据信息,例如用户输入,计算结果等;
发送命令
通过IPC
,一个进程可以向另一个进程发送命令或请求知道其执行特定操作;
某种协同
多个进程通过IPC
机制协同工作可以完成独立进程无法完成的复杂工作;
数据传输
IPC
提供了一种机制使得进程可以安全有效的进行数据传输;
资源共享
多个进程可能需要访问和修改同一份资源;
通知事件
进程间通信允许进程相互通知重要的事件发生,如系统错误,任务完成等;
进程控制
IPC
机制可以用于控制其他进程的行为,例如启动或停止某个进程或者调整其执行的优先级;
…
进程间通信的本质
进程间通信的本质是必须让不同的进程看到同一份"资源";
这里的"资源"通常指数据或者信息,在操作系统中,数据和信息的存储和交换的媒介一般是内存空间;
而这个内存空间不一定是直接的物理内存访问;
IPC
机制通过多种形式使得进程间可以共享和传递信息,这包括但不限于直接的内存共享;
进程间通信的内存空间的提供者必须是操作系统而不能是进程,原因主要为以下几点:
安全性
进程通常在操作系统分配的隔离环境中运行,可以防止一个进程访问或修改另一个进程的代码数据;
隔离性
操作系统为每个进程提供了一个独立的地址空间,以保证进程间的独立性和稳定性;
如果进程间通信的内存空间由进程自身提供则可能打破这种隔离性;
资源管理
操作系统负责管理所有的软硬件资源,拥有全局的视角和控制权;
而单个进程并不具备这种特性,操作系统数据进程的上级所以操作系统能观察到所有的进程的当前状态但进程无法观察到操作系统的状态;
独立性
进程间是相互独立的,每个进程存在自己独有的进程地址空间;
如果这块公共区域是由进程自行提供,那么将会破坏进程间的独立性;
操作系统所提供的资源的媒介(空间)可以被视作一种"第三方空间";
而这种第三方空间是由操作系统提供的,当进程要对这个"第三方空间"进行写入或是读取数据时本质上是在访问操作系统;
进程为用户层的结构,为了保证安全,用户无法直接访问操作系统,即进程无法直接访问操作系统;
故操作系统必须提供一种机制即系统调用(System Calls)来允许用户层的进程与"第三方空间"中的资源进行安全互动;
即进程对这个媒介的 创建 - 使用(一般情况下) - 释放 都是利用系统调用接口;
资源的管理
当存在大量进程且进程与进程间都需要通信时将会存在大量这样的 “第三方空间” ;
操作系统将会对这些资源进行管理 —— “先描述,再组织” ;
在操作系统中进程间通信(IPC
)被作为一个独立的通信模块并挂接在文件系统当中;
进程间通信的标准
进程间通信作为一种模块同样也存在标准;
常用的标准有:
POSIX IPC
标准System V IPC
标准IPC
标准 操作系统提供了多种IPC
机制,包括但不限于:
管道(Pipes)
允许一个进程与另一个进程直接通信,数据流是单向的;
消息队列(Message Queues)
允许不同的进程发送和接收消息,是一种异步通信方式;
信号(Signals)
一种用于通知接收进程某个事件已经发生的简单方式;
共享内存(Shared Memory)
通过映射一段能被多个进程访问的内存区域以时间线进程间的数据共享;
套字节(Sockets)
主要用于不同主机上的进程间通信,支持TCP
/IP
等网络协议;