八.linux的进程间通信之管道、消息队列、共享内存简介

版权声明:本文为博主原创文章,允许转载请注明。谢谢! https://blog.csdn.net/wangweijundeqq/article/details/89603698

http://note.youdao.com/noteshare?id=e776f7ddbdee26e3d3a3f102b27174be&sub=725B6C7D7A074448AE46FDEF0B8682D5

一、linux的进程间通信简介

(转载注明:https://blog.51cto.com/9291927/1811713

1、进程间通信简介

    Linux的进程通信方式基本上是从Unix平台上的进程通信方式继承而来的。在Unix发展过程中,贝尔实验室和BSD(加州大学伯克利分校的伯克利软件发布中心)是Unix发展的主要贡献者,但两者在进程间通信方面的侧重点有所不同。贝尔实验室对Unix早期的进程间通信方式进行了系统的改进和扩充,形成了 “system V IPC”,通信进程局限在本地计算机内;BSD则跳过了进程通信局限在本地计算机的限制,形成了可以在计算机间进行通信的基于套接口(socket)的进程间通信机制。Linux则继承了贝尔实验室的system V IPC和BSD Socket两者进程间通信机制。

    Linux进程间通信方式包括:

管道、FIFO、信号、System V消息队列、System V信号灯、System V共享内存、Socket通信

进程间通信的目的:

A、数据传输:进程间需要相互传输数据

B、共享数据:多个进程间操作共享数据

   C、通知事件:进程间需要通知某个事件的发生

   D、资源共享:多个进程之间共享同样的资源,需要内核提供锁和同步机制

   E、进程控制:有些进程需要完全控制另一个进程的执行(如Debug进程)

2、多进程编程的优缺点

1、优点

A、每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系

B、通过增加CPU,就可以容易扩充性能

C、可以尽量减少线程加锁/解锁的影响,极大提高性能

D、每个子进程都有4GB地址空间和相关资源,总体能够达到的性能上限非常大

2、缺点

A、逻辑控制复杂,需要和主程序交互

B、需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算

C、多进程调度开销比较大

二、linux的IPC机制1-管道

1、管道(无名管道)

(1)管道通信的原理:内核维护的一块内存,有读端和写端(管道是单向通信的)

(2)管道通信的方法:父进程创建管理后fork子进程,子进程继承父进程的管道fd

(3)管道通信的限制:必须是父子进程关系才能使用无名管道。、半双工(即在同一时刻只能在一个方向传输)

(4)管道通信的函数:pipe、write、read、close

2、有名管道(fifo)

(1)有名管道的原理:实质也是内核维护的一块内存,表现形式为一个有名字的文件

(2)有名管道的使用方法:固定一个文件名,2个进程分别使用mkfifo创建fifo文件,然后分别open打开获取到fd,然后一个读一个写

(3)管道通信限制:半双工(不是父子进程也能用的管道通信,任意2个进程都可)

(4)管道通信的函数:mkfifo、open、write、read、close

有名管道相对于无名管道,多一个文件,是为了让两个非父子进程接头、匹配作用。

三、SystemV IPC介绍

1、SystemV IPC的基本特点

(1)系统通过一些专用API来提供SystemV IPC功能

(2)分为:信号量、消息队列、共享内存

(3)其实质也是内核提供的公共内存

2、信号量

(1)实质就是个计数器(其实就是一个可以用来计数的变量,可以理解为int a)

例如A告诉a+1,B发现a加了1,就实现了通信 ,主要用于互斥和同步。

比如A在调用公共资源,B就不能调用。比如signal=0,B不可以用。 

同步:A走一步,signal+1。B看signal加了1,那么B走一步。 

3、消息队列

(1)本质上是一个队列,队列可以理解为(内核维护的一个)FIFO

(2)工作时A和B2个进程进行通信,A向队列中放入消息,B从队列中读出消息。

(转载注明:https://blog.51cto.com/9291927/1811716

消息队列用于同一台机器上的进程间通信,是一个在系统内核中用来保存消息的队列,在系统内核中是以消息链表的形式出现。消息链表中节点的结构用msg声明。消息队列是一种从一个进程向另一个进程发送数据块的方法。 每个数据块都被认为含有一个类型,接收进程可以独立地接收含有不同类型的数据结构。消息队列可以避免命名管道的同步和阻塞问题,但是每个数据块都有一个最大长度的限制。

4、共享内存

(转载注明:https://blog.51cto.com/9291927/1811716

共享内存允许两个或更多进程共享给定的内存区,数据不需要在不同进程间进行复制,是最快的进程间通信方式。使用共享内存唯一需要注意的是多个进程之间对给定存储区的同步访问,但共享内存本身没有提供同步机制,通常使用信号量来实现对共享内存访问的同步。

    共享内存编程流程:创建共享内存、映射共享内存、使用共享内存、撤销映射操作、删除共享内存

大片内存直接映射

这里的共享内存要比其他两种数据信息量要大很多。

比如A和B之间交换一些图像信息

网络摄像机为例:A发送图像给B,B处理图像编解码,C上传到网络。

A复制一份给B的话,在共享内存中对图像进行一份复制是很占用时间的

那么更好的方法就是大段的内存映射,重点是映射

A只负责图像数据存到哪个区域,B只要去拿就好了,不管资源去哪、或资源怎么来

猜你喜欢

转载自blog.csdn.net/wangweijundeqq/article/details/89603698