1、管道是半双工的(即数据只能单向流动),有固定的读端和写端。它只能用于有关系的进程之间(也包括父子进程或兄弟进程之间)的通信。可以看成是一个特殊的文件,对其读写也可以使用read、write等普通函数。但它不是普通文件,不属于任何其他文件系统,只存在于内存中。应用场景:只能用于与亲人的交流,使用范围比较狭窄,实际开发中很少用到;2.FIFOFIFO,又称命名管道,是一种文件类型。与无名管道不同,FIFO可以在不相关的进程之间交换数据。FIFO有一个与之关联的路径名,它作为一个特殊的设备文件存在于文件系统中。应用场景:可用于任意进程间通信,大块数据传输效率高。可应用于单个进程传输大量数据,多个进程向一个进程传输数据;3.消息队列消息队列是一个消息链表,存储在内核中。消息队列由标识符(队列ID)标识。消息队列是面向记录的,其中的消息有特定的格式和特定??的优先级。消息队列独立于发送和接收进程。当进程终止时,消息队列及其内容不会被删除。消息队列可以实现消息的随机查询,消息不一定要按照先进先出的顺序读取,也可以按照消息的类型来读取。优点:A.我们几乎可以通过发送消息的方式完全避免命名管道的同步和阻塞问题。B、我们可以通过一些方法提前查看紧急消息。缺点:A.和管道一样,每个数据块都有最大长度限制。B、系统中所有队列包含的所有数据块的总长度也有上限。使用场景:在进程间传递简单的命令和控制消息,如配置更新通知、多进程到多进程通信等,可以简化代码逻辑;--建议改用全双工管道;4.Semaphore信号量(semaphore)不同于前面介绍过的IPC结构,它是一个计数器。信号量用于实现进程间的互斥和同步,而不是存储进程间通信数据。信号量用于进程间同步。进程间传递数据,需要结合共享内存。信号量是基于操作系统的PV操作,程序对信号量的操作都是原子操作。每次对信号量的PV操作不限于对信号量值加1或减1,还可以加减任意正整数。支持信号量组。使用场景:互斥与互斥量类似,但互斥量只能由locker解锁。Synchronization->Thread1andThread2->Thread3某资源数量为N,多个进程正在使用该资源。为了进行进程之间的互斥,可以使用一个初值为N的信号量;--建议改用记录锁;5.共享内存共享内存(SharedMemory)是指两个或多个进程共享一个给定的存储区域。共享内存是最快的IPC类型,因为进程直接访问内存。同步是必需的,因为多个进程可以同时运行。信号量+共享内存通常一起使用,信号量用于同步访问共享内存。消息队列和管道基本都复制了4次,而共享内存(mmap、shmget)只复制了2次。读取磁盘文件的第一步是通过系统调用。它首先将文件内容从磁盘拷贝到内核空间的缓冲区中,然后再将数据拷贝到用户空间,实际上是两次数据拷贝。第三步回写也需要经过两次数据拷贝。4次:1、write()从磁盘输入到A内核空间。2.写入B用户空间。3、B调用read()读入内核空间。4.从内核空间放磁盘。内存映射文件是操作系统提供的一种机制,可以减少这种不必要的数据拷贝,从而提高效率。它使用mmap()直接将文件映射到用户空间。mmap()不复制数据。真正的数据拷贝是在缺页中断时执行的。由于mmap()直接将文件映射到用户空间,所以被打断了。根据这个映射关系,处理函数直接将文件从硬盘复制到用户空间,所以只进行了一次数据拷贝,比读取两次数据拷贝好一倍。因此,内存映射的效率要高于读/写。.2次:1、输入到用户空间。2、用户空间输出。零拷贝?使用场景:传输大量数据,大量读取相同数据的场景下最高效的进程间通信方式。进程可以直接读写内存而无需任何数据复制。适用于多个进程共享数据,或者进程间频繁进行大规模操作。数据交互;--推荐使用mmap方式;6、信号使用场景:接收进程在某个时刻发生死掉。不能传输数据,信号类型有限,只适合完成一些简单的事件通知任务,比如配置和新信号通知,一个服务通过信号通知另一个服务自己的状态;7、Socket使用场景:如果系统需要支持分布式部署,服务可能在同一个设备上,也可能在不同的设备上。这时候使用网络套接字来提高扩展性就比较合适了;8、Unixdomainsocket使用场景:一个服务同时与多个服务通信。当需要维护多个通信通道时,使用unixsockets,可以使用linuxIO多路复用功能;--建议优先使用网络套接字;linux系统下的进程通信方式包括:信号量、管道(包括匿名管道和命名管道)、消息队列、共享内存、套接字。前四种方法用于本地进程间通信,属于同一台计算机内部的通信;socket一般默认是指TCP/IP套接字,用于不同计算机之间的网络通信。本质上,套接字也可以用于本地进程间通信,比其他IPC方式更高效、更灵活。用于本地进程间通信的套接字称为unix域套接字(unixdomainsocket)。与传统的基于TCP/IP协议栈的socket不同,unixdomainsocket使用文件系统作为地址空间,不需要经过TCP/IP头封装、消息ack确认、路由选择、数据校验和重传过程,所以传输速率不会受到网卡带宽的限制。Unixdomainsocket数据在传输时,通过系统文件系统的权限机制进行访问。内核根据socket路径名直接将数据拷贝到receiversocket的缓冲区中,数据传输效率远高于TCP/IPsocket。从数据传输模型和传输过程来看,unixdomainsocket类似于pipeline,因为pipeline的发送和接收数据也依赖于路径名。
