Linux 20 几种IPC的区别

进程间通信(IPC,InterProcess Communication)

是指在不同进程之间传播或交换信息。

IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。

总结1:
管道:只能单向传递,且只能在有亲缘关系的进程中使用
有名管道:也是单向传递,但可以在非亲缘进程中使用
信号量:可以用来控制多个进程对共享资源的访问
消息队列:消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点;
信号:信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
共享内存:由一个进程创建,但多个进程都可以访问。往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
套接字:套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。

总结2:
1.管道:速度慢,容量有限,只有父子进程能通讯
2.FIFO:任何进程间都能通讯,但速度慢
3.消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
4.信号量:不能传递复杂消息,只能用来同步
5.共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

管道

管道通常分类两种,一种有名管道,一种无名管道无名管道:主要用于父子进程间的通信方式,主要的数据方式是一般是通过一个二维数组来进行通信,比如int pipefd[2],pipefd[0]主要是用来读数据,pipefd[1]主要是用来写数据。有名管道:也叫命名管道,这个主要是应用于非父子进程之间的一种数据通信方式,通常管道的使用过程总共分为三步:第一,创建管道,需要指定管道文件,第二步,打开管道文件,通常会有两种常见方式,以阻塞的方式打开或者非阻塞的方式开,第三步,就是管道的写,也会两种常见方式,以阻塞的方式写或者非阻塞的方式写,其中阻塞的读写指的是在读或者写的时候必须有一个个进程在写或者读操作。管道主要是进程间数据同步的一种方式,比如一个写数据,另一个读数据。

特点:
它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。
它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。
它可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write 等函数。但是它不是普通的文件,并不属于其他任何文件系统,并且只存在于内存中。
FIFO,也称为命名管道,它是一种文件类型。
FIFO可以在无关的进程之间交换数据,与无名管道不同。
FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中。

信号量

信号量也是常见的进程直接的一种数据共享方式,信号量的操作通常也是分为了三步,第一步创建信号量semget,这里面主要是需要确定key,第二步是初始化信号量semctl其中需要注意的就是第二个参数,一般使用0,表示这个一个唯一的信号量,第二个参数semun,一般采用默认值,这个联合结构体一般会在sem.h头文件中进行定义,可以直接使用即可,有关信号量的操作主要是第三步,就是信号量的操作了semop,这个里面主要是使用了

struct sembuf
{ 
    short sem_num;
    short sem_op;
    short sem_flg;
}

第一个参数,表示信号量编号,除非你使用一组信号量,一般使用0;第二个参数是信号量值的改变操作即P(+1)和V(-1)操作,第三个参数一般是SEM_UNDO,使得系统跟踪当前这个信号量使用情况,如果在当前进程结束情况下,这个信号量没有进行释放,则由系统自动释放该进程持有的这个信号量。信号量主要是进程间对于临界区代码权限访问控制的一种方式,确保了唯一访问以及操作性。

特点:
信号量用于进程间同步,若要在进程间传递数据需要结合共享内存。
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数。
支持信号量组。

消息队列

消息队列在使用上与管道有很多相似的地方,但是比管道使用起来方便了很多,减少了管道的打开和关闭的操作,但是消息队列仍然没有解决在使用管道时遇见的管道满时的阻塞问题,消息队列与管道不同之处在于它独立于发送和接受进程,管道的阻塞模式则需要依赖于进程的发送和接收。消息队列使用的方式一般也是分为三步:

第一步:创建消息队列msgget
第二步:发送消息,即把消息添加到消息队列中去使用msgsnd
第三步:就是消息接受函数msgrcv

特点:
消息队列是面向记录的,其中的消息具有特定的格式以及特定的优先级。
消息队列独立于发送与接收进程。进程终止时,消息队列及其内容并不会被删除。
消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

共享内存

共享内存是在进程这几个通信方式中速度以及效率最高的一种方式,使用操作一般也分为三部分,第一步:创建共享内存,主要是设置共享内存的key以及大小,第二步绑定共享内存到指定内存地址,一般默认使用系统自己选择的地址,第三步:有两种操作方式1、shmdt将共享内存从当前进程剥离掉,但是未删除它,2、shmctl可以删除共享内存,直接物理删除该内存段。

进程间数据同步方式一般使用的都是共享内存,主要原因就是因为高效,但是共享内存在使用的时候有一个问题就是它无法确保数据的唯一性,没有提供数据同步的机制,通常情况下结合信号量或者互斥锁来进行数据的同步。

特点:
共享内存是最快的一种 IPC,因为进程是直接对内存进行存取。
因为多个进程可以同时操作,所以需要进行同步。
信号量+共享内存通常结合在一起使用,信号量用来同步对共享内存的访问。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值