点我查看操作系统秘籍连载


进程间通信

单机操作系统上的进程可以分为两类:

1.独立进程:这类进程不会和其它进程有任何交流。

2.协作进程:两个或多个进程之间需要交流。

例如,ls /tmp命令是独立运行的,不依赖于其它进程,而cat a.log | grep 'abc'命令中的两个进程是协作进程,grep进程依赖于cat进程,grep只有等待到了cat进程产生的数据才能继续执行下去。

对于单机上不同进程之间的协作,各进程之间需要进行数据的交流,这种行为称为进程间通信(Inter-process communication,IPC),即进程与进程的通信。

除了单机上的多个进程可能需要进程间通信,多计算机之间的进程有时候也需要进行进程间的通信,这很常见,例如本机上的QQ客户端进程需要和腾讯的QQ服务器上的进程进行数据传输,浏览器浏览网页时,浏览器进程需要和网页所在的服务端进程进行数据传输,等等。

进程间通信的方式有很多种。从广义上讲,只要进程间能共享数据或传递数据就算是进程间通信。下面列出常见的进程间通信方式:

进程间通信方式 描述
文件(File) 多个进程可以获取到同一个文件的数据
管道(pipe) 单方向传输数据的管道,只能一方写,另一方读
套接字(Socket) 多机进程间通信,当然也可以在本机让两个进程使用socket通信
Unix域套接字(Unix Domain Socket) 单机进程间通过域套接字模式通信,可看作是双向管道
共享内存(Shared Memory,shm) 在物理内存上划分一片内存,多个进程共享这片内存
文件映射(Memory-maped file) 将文件中的一段数据映射到物理内存,多个进程共享这片内存
消息队列(Message Queue) 某进程将消息放入消息队列,其它进程从队列中接收消息
信号(Signal) 通过发送某些信号通知其它进程,进程收到信号做出不同的处理
信号量(Semaphore) 就是信号灯。应用方式有多种,其作用概括起来就是,根据是否有信号灯或信号灯的数量多少来决定是否阻塞进程
锁(Lock) 对资源上锁,如果资源已被某进程锁住,则其它进程想要修改甚至读取这些资源,都将被阻塞,直到锁被打开。

通过文件实现进程间通信的方式,这没什么可介绍的,简单介绍剩下的几种进程间通信方式。