进程间通讯:总结

来源:互联网 发布:owncloud php版本 编辑:程序博客网 时间:2024/05/21 17:54

一、进程间通讯方式总览以及各自优点:

1.信号 : 内核实现,及时传递状态信号
2.管道: 在同步机制下实现数据的传递
3.信号量:用于进程间同步控制
4.消息队列:可选择地接收含有不同类型的数据结构。
5.共享存储(共享内存): “共用内存”,快速传递数据
6.套接字(socket):用于网络间通讯

二、进程间通讯方式的相互对比

1.信号:

信号是系统响应某些条件而产生的一个事件,接收到该信号的进程会相应地采取一些行动。通常信号是由一个错误产生的。但它们还可以作为进程间通信或修改行为的一种方式,明确地由一个进程发送给另一个进程。一个信号的产生叫生成,接收到一个信号叫捕获,进程还可以发送信号给进程本身。
可以得出,信号并不能传递整型变量、字符数组这样的数据,它传递的是一种状态,可以用来得知某一进程是否结束,或者KILL一个进程。正是这一特征,可以简洁的使用信号来处理僵死进程。

2.管道:

具有默认大小,无名管道用于父子进程之间,有名管道可用于不同进程之间。
管道是由内核管理的一个缓冲区(buffer),相当于我们放入内存中的一个纸条。管道的一端连接一个进程的输出。这个进程会向管道中放入信息。管道的另一端连接一个进程的输入,这个进程取出被放入管道的信息。一个缓冲区不需要很大,它被设计成为环形的数据结构,以便管道可以被循环利用。当管道中没有信息的话,从管道中读取的进程会等待,直到另一端的进程放入信息。当管道被放满信息的时候,尝试放入信息的进程会等待,直到另一端的进程取出信息。当两个进程都终结的时候,管道也自动消失。
管道是一种半双工的通讯方式,其操作类似与文件操作,相比较共享内存,速度较慢,但是有同步机制从而更加安全。其发送的消息是无类型的,接收进程只能“照单全收”,并不能自主选择,这也是它不同于消息队列的地方。

具体内容,可参考——进程间通讯:管道

3.信号量:

首先信号量与信号并不是“近亲”,信号量用来调协进程对共享资源的访问的。程序对其访问都是原子操作,且只允许对它进行P操作(获取临界资源)和V操作(释放临界资源)。
不同于锁,它可以有N个有限值,信号量类似一个停车场,而锁类似停车场中的一个停车位,当车辆进入停车场时,停车位数量减一,但是在有其它空余停车位时,车辆依然可以进入停车场。而一个停车位有车辆时,其它车辆不可以进入这个停车位。
信号量的通讯信息是资源的可访问数量,整型变量、字符数组这样的数据。PV操作不是简单的资源数减一加一,还要明白这俩个操作自带的阻塞机制,这样才能合理的应用。

具体内容,可参考——进程间通讯:信号量

4.消息队列:

消息队列和管道类似,但是管道发送的数据无类型,而消息队列每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。就好比管道是发送到群里的无口令红包,消息队列则是一个带口令的红包。
与信号量对比,都是以内核对象来确保不同进程访问同一个消息队列,但二者传递的消息并不同。消息队列传递的消息包括数据和类型俩部分。

具体内容,可参考——进程间通讯:消息队列

5.共享内存:

共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用malloc函数分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。
不同于管道的是,共享内存的操作都不是原子操作,往往需要信号量等方式来控制进程间的同步。

具体内容,可参考——进程间通讯:共享内存

从最初的处理僵死进程,引出了信号的概念,到一步一步学习,直至消息队列和共享内存,进程间的通讯内容告一段落,接下来进行线程的学习。

原创粉丝点击