IPC通信

从严格意义上来说,一个系统有多个独立的进程组成,而且进程之间有数据交互的逻辑,那么不管这几个进程是否部署在一个主机上,这样的系统都可以叫分布式系统。IPC(Inter-Process Communication)就是为了解决单主机上多进程之间的通信问题而诞生的一种古老技术。由于进程与操作系统是密切相关的,因此操作系统的不同会导致IPC的具体实现也各有不同,但不管是Windows系统还是Linux系统,都支持一下几种进程间的通信技术。

  • 管道(Pipe)及有名管道(Named pipe):管道可用于具有亲缘关系进程间的通信,有名管道客服了管道没有名字的限制,因此,除了有管道所具有的功能,他还允许无亲缘关系进程间的通信。由于管道存在只能承载无格式字节流及缓冲区大小受限等缺点,使用管道进行IPC通信的做法已经不太普遍。
  • 套接字(Socket):起初是有Unix系统的BSD分支开发出来的,现在Linux和Windows系统都支持Socket,Socket如果用于本地进程间通信,则要比普通的TCP/IP快很多,这也是一种比较通用的进程间通信方式。
  • 共享内存:将文件映射到内存中,多个进程通过共享文件的方式使得多个进程可以访问同一块内存空间,这是最快的可用IPC形式。

1. 管道用作IPC通信时,有以下缺点。

  • 只支持单向数据流(双向通信就需要两个管道)。
  • 匿名管道的缓冲区是有限的(匿名管道存在于内存中,在管道创建时,为缓冲区分配一个页面大小的内存)。
  • 管道所传送的是无格式字节流,这就要求管道的读出方和写入方必须事先约定好数据的格式,比如多少字节算作一个消息。

2. Socket API原本是为网络通信设计的,但后来在Socket的框架上发展出一种IPC机制,就是Unix Domain Socket。Unix Domain Socket也提供面向流和面向数据两种API接口,类似TCP/UDP。虽然普通的TCP Socket也可用于同一台主机的进程间通信(通过loopback地址127.0.0.1),但Unix Domain Socket在同一台主机上的传输速度是TCP Socket的两倍,这是因为Unix Domain Socket不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程复制到另一个进程,所以速度更快。

Unix Domain Socket用于IPC通信的具体编程方式与普通的TCP Socket编程方式没太大差别,性能又高,还容易从单机通信扩展为多主机间的通信,所以这种方式逐步替代了管道的方式。

3.  共享内存可以说是最有用的进程间通信方式,也是最快的IPC形式。两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反之亦然。由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以。

采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存,而不需要任何数据的复制。对于像管道和套接字这种方式,需要在内核和用户空间进行4次数据复制,而共享内存只需复制两次数据:一次从输入文件到共享内存区,另一次从共享内存区到输出文件。实际上,进程之间在共享内存时始终保持共享区域,直到通信完毕为止,这样,数据的内容一直保存在共享内存中,并没有写回文件。共享内存中的内容往往是在解除映射时才写回文件的。因此采用共享内存通信方式的效率是非常高的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

村里小码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值