龙空技术网

进程间通讯方式及特点

王三五 138

前言:

当前我们对“进程消息传递”大概比较看重,兄弟们都需要分析一些“进程消息传递”的相关资讯。那么小编在网摘上收集了一些有关“进程消息传递””的相关内容,希望看官们能喜欢,同学们一起来学习一下吧!

进程间通讯方式总体来说分为以下几种:

管道:

管道分为有有名管道(FIFO)和无名管道(PIPE)

无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无名管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。

有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。

管道通信的特点:

1.管道通信是单向的,有固定的读端和写端。

2.数据被进程从管道读出后,在管道中该数据就不存在了

3.当进程去读取空管道的时候,进程会阻塞;

4.当管道往满管道写数据时,进程会阻塞;

5.管道的容量是64KB

信号量:

信号量的本质是一种数据操作锁,它本身不具有数据交换的功能,而是通过控制其他的通信资源(文件,外部设备)来实现进程间通信,它本身只是一种外部资源的标识。信号量在此过程中负责数据操作的互斥、同步等功能。

信号量通信的特点:

1.本质是一个计数器,内存中有多少个临界资源,信号量的数字就是多少。

2.信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作

3.信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。

消息队列:

消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.

消息队列通讯的特点:

1.它提供有格式的字节流,减少了开发人员的工作量;消息具有类型(system V)或优先级(posix)。其他方式都没有这些优点。

2.具备同步机制。

3.生命周期随内核。

4.消息队列允许一个或多个进程向它写入或者读取消息。

5.与无名管道、命名管道一样,从消息队列中读出消息,消息队列中对应的数据都会被删除。

6.每个消息队列都有消息队列标识符,消息队列的标识符在整个系统中是唯一的。

消息队列是消息的链表,存放在内存中,由内核维护。只有内核重启或人工删除消息队列时,该消息队列才会被删除。若不人工删除消息队列,消息队列会一直存在于系统中。

共享内存:

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.

共享内存通信特点:

1.共享内存没有提供任何的保护机制

2.是临界资源

3.没有同步互斥机制

4.生命周期随内核(同消息队列)

优缺点总结:

1.无名管道:速度慢,容量有限,只能用于具有亲缘关系的进程间通信。

2.有名管道:任何进程间都能通信,但速度慢。

3.消息队列:容量受到系统限制。

4.信号量:不能传递复杂消息,只能用来同步。

5.共享内存区:能够很容易控制容量,速度快,但要自己处理同步互斥逻辑

标签: #进程消息传递