1.进程间通信的介绍
我们之前所谈的进程很多都是通过一个进程来进行理解的,可是很多情况下有一些任务呢,他是有很多的进程通过协作完成,比如说我们之前谈到的命令行,一条命令也是用一个进程去执行的。
像这样,我们是通过两条命令,也就是需要两个进程协作完成的任务。一个进程将自己执行的结果通过管道交给另一个进程进而完成这项任务的。虽然说进程具有独立性,但是有些事并不是一个进程工作就能完成的,所以进程之间是存在互相通信的,也就是进程之间可能会互相协作完成任务。要让两个进程互相通信的前提条件是得让两个进程将信息传递起来。
2.进程间通信的目的
- 数据传输:一个进程需要将它的数据发送给另一个进程
- 资源共享:多个进程之间共享同样的资源。
- 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。
- 进程控制:有些进程希望完全控制另一个进程的执行(如Debug进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。
3.进程间通信的本质
因为我们都知道进程间具有独立性,那有如何保证进程间通信不违背进程的独立性呢?那么在协作的时候假设只有A进程和B进程,然后A进程需要B进程上面的执行任务的信息,那么他们之间需要的信息该如何获取呢?是A进程去访问B进程的数据,然后将需要的信息拷贝到自己进程上还是B进程去访问A进程将对应那部分数据拷贝给A进程呢?其实这两者都不对,都违背了进程的独立性。
下面我们来举个例子理解进程如何进行进程间通信呢?假设你叫张三,然后你爸你妈今天吵架了,谁也不爱理谁,这个时候你放学回家了,你妈妈刚好在煮饭菜,马上就要煮好了,然后你妈妈为了爱自己的面子不想跟你爸爸说话,然后就叫你去跟你爸爸说让你爸爸吃饭了,你就屁颠屁颠跑过去说:“爸爸,妈妈叫你吃饭了”,你爸爸就说:"不吃",然后你又跑过去跟你妈妈说:“爸爸说他不吃”,你妈妈又会说:“爱吃不吃”,然后你又难受的走过去说:“我妈说你爱吃不吃”。那么这个故事中,张三是在做什么呢?你在充当一个就是叫做进程间通信时的中间媒介,因为有了你的存在,所以你的爸爸妈妈之间的进程间的独立性得以保证,此时既保证了独立性,传递信息的目的也就达成了。在这个典型的例子当中,张三的爸爸妈妈就是典型的A进程,B进程,你是操作系统,因为A进程和B进程都是要在操作系统的调度之下去运行的,A进程不能看到B进程的代码和资源,但是它可以去访问操作系统的资源,B进程也是如此,所以让操作系统作为中间人,把要传递的信息交给操作系统,让需要接受传递信息的进程去操作系统那里去拿,这不就做到了进程间的通信了吗?
进程间通信的本质:让不同的进程先看到同一份资源。这份资源通常都由操作系统提供。
4.进程间通信的发展
- 管道
- System V进程间通信
- POSIX进程间通信
5.进程间通信的分类
管道
- 匿名管道pipe
- 命名管道
System V IPC
- System V 消息队列
- System V 共享内存
- System V 信号量
POSIX IPC
- 消息队列
- 共享内存
- 信号量
- 互斥量
- 条件变量
- 读写锁