Linux进程通信(IPC)的方式

来源:互联网 发布:更改mac地址 编辑:程序博客网 时间:2024/05/01 16:25

前言:Linux进程通信的方式

什么是进程通信?进程通信是指进程之间交换信息
进程通信方式共有6种:

  1. 管道(pipe),包括流管道(s_pipe)和有名管道(named pipe)
  2. 信号(signal)
  3. 消息队列
  4. 共享内存
  5. 信号量
  6. 套接字(socket)
  7. RPC

下面详细说说各种通信方式和区别

一、管道

管道是指连接一个读进程和一个写进程以实现他们之间通信的一个共享文件,又称为pipe文件,管道内数据以字符流形式传输

管道机制:
1. 互斥,一个进程在进行读/写操作,另一个线程必须等待
2. 同步,生产者消费者问题,写进程写完便挂起,知道读进程读取之后唤醒
3. 双方必须存在才能进行通信

缺点:
1. 半双工的通信,数据只能单向流动(写到读)
2. 只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。

于是出现了流管道(s_pipe)和有名管道(named pipe)

1. 1流管道(s_pipe)

可以双向传输

1.2 有名管道(named pipe)即FIFO

克服了管道没有名字的限制,允许无亲缘关系进程间的通信,但还是半双工的

二、信号量

主要作为进程间以及同一进程内不同线程之间的同步手段。

进程间通信处理同步互斥的机制。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

三、信号 ( singal )

主要作为进程间以及同一进程内不同线程之间的同步手段。

进程间通信处理同步互斥的机制。信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。

四、消息队列( message queue )

消息队列是消息的链表,包括Posix消息队列systemV消息队列。

有足够权限的进程都可以向队列中添加消息,有足够读权限的进程都可以读走队列中的消息。

消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

我们开发时常用各种mq

五、共享内存( shared memory )

  1. 共享数据结构,例如生产者消费者的缓冲区,生产者放入缓存区,消费者从缓冲区取出,实现了进程通信
  2. 共享存储区,在内存中划出一块共享内存,诸进程可通过对该共享区的读或写交换信息,实现通信,例如共享某个文件

是最快的可用IPC形式(因为共享内存区中的单个数据副本对于共享该内存的所有线程或进程都是可用的)

为什么会比其它的IPC形式更快?
一般IPC形式(管道、FIFO、消息队列)的问题在于,两个进程要交换信息,这些信息必须经由内核传递
而进程间共享内存时,交换数据就不再涉及内核。这些进程必须协调或同步对该共享内存区的使用。

就拿一个客户-服务器的文件复制流程来说:

对于共享内存,该共享内存区同时存在于客户和服务器的地址空间
数据只需复制两次
一次从输入文件到共享内存区,另一次从共享内存区到输出文件
这里写图片描述

对于其他IPC形式(管道、FIFO、消息队列)则需要四次复制
从输入文件复制到服务器中,服务器将其复制到IPC形式(管道、FIFO、消息队列),IPC形式中复制到客户机中,客户机再复制到输出文件中
这里写图片描述

六、套接字( socket )

套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

七、RPC

RPC(Remote Procedure Call)远程过程调用,基于Socket之上的一个协议,从一个系统(客户主机)上某个程序调用另一个系统上(服务器主机)某个函数的一种方法,它的调用进程和被调用进程可在不同主机上执行,客户和服务器运行在不同主机上,而且过程调用中涉及网络I/O,RPC是透明的,它使得远程过程调用看上去就像本地调用一样,给使用者屏蔽了底层的实现

举例:
两个老板手下各有一个负责接通MSN的秘书. 这两个秘书就是基于RPC协议建立的会话层通信. 老板不需要知道怎么使用MSN, 只要告诉秘书,秘书就会通过MSN与对方建立会话请求和相应. 而基于Socket的通信, 老板需要会使用MSN,这样,虽然老板需要实现培训一下关于MSN的知识, 但与对方通信时,就不用经过秘书了,效率会更高.

Socket和RPC的优缺点:
(Socket)越底层,代码越复杂、灵活性越高、效率越高;(RPC)越上层,抽象封装的越好、代码越简单、效率越差

例如可以用netty来实现RPC。
这种通信方式的具体事例,就如我之前写的 Netty实现服务器推Push(Android推送)

各种通信方式的总结

1. 管道

速度慢,只能承载无格式字节流,容量有限,只有父子进程能通讯,半双工

2. 流管道

缺点:管道有的缺点
优点:可以双向传递

3. 有名管道

缺点:管道有的缺点
优点:没有血缘关系的进程也可以通信

3. 消息队列

缺点:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
优点:可以传递有格式字节流

4. 信号量

不能传递复杂消息,只能用来同步

5. 共享内存区

优点:能够很容易控制容量,速度快(两次复制),而上面的IPC方式是四次复制
缺点:要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存

6. Socket

前面所说的IPC方式,都只能用于一台机器内部的进程通信,Socket可以实现不同计算机之间的进程通信

7.RPC

基于Socket,具有Socket的优点,具有透明性

原创粉丝点击