共计 1859 个字符,预计需要花费 5 分钟才能阅读完成。
一、管道
它是半双工的(即数据只能在一个方向上流动),具备固定的读端和写端。
它只能用于具备亲缘关系的过程之间的通信(也是父子过程或者兄弟过程之间)。
它能够看成是一种非凡的文件,对于它的读写也能够应用一般的 read、write 等函数。然而它不是一般的文件,并不属于其余任何文件系统,并且只存在于内存中。
利用场景:只能用于具备亲缘关系的进行通信,应用面绝对较窄,理论开发中较少应用;
二、FIFO
FIFO,也称为命名管道,它是一种文件类型。
FIFO 能够在无关的过程之间替换数据,与无名管道不同。
FIFO 有路径名与之相关联,它以一种非凡设施文件模式存在于文件系统中。
利用场景:能够用于任意过程间的通信,对于大块数据的传输效率较高,可利用于单过程大量数据传递,和多个过程向一个过程传递数据;
三、音讯队列
音讯队列,是音讯的链接表,寄存在内核中。一个音讯队列由一个标识符(即队列 ID)来标识。
音讯队列是面向记录的,其中的音讯具备特定的格局以及特定的优先级。
音讯队列独立于发送与接管过程。过程终止时,音讯队列及其内容并不会被删除。
音讯队列能够实现音讯的随机查问, 音讯不肯定要以先进先出的秩序读取, 也能够按音讯的类型读取。
长处:A. 咱们能够通过发送音讯来简直完全避免命名管道的同步和阻塞问题。B. 咱们能够用一些办法来提前查看紧急音讯。
毛病:A. 与管道一样,每个数据块有一个最大长度的限度。B. 零碎中所有队列所蕴含的全副数据块的总长度也有一个下限。
应用场景:过程间传递简略的命令和管制音讯,如配置更新告诉,多过程对多过程的通信等,能够简化代码逻辑;-- 倡议应用全双工管道代替;
四、信号量
信号量(semaphore)与曾经介绍过的 IPC 构造不同,它是一个计数器。信号量用于实现过程间的互斥与同步,而不是用于存储过程间通信数据。
信号量用于过程间同步,若要在过程间传递数据须要联合共享内存。
信号量基于操作系统的 PV 操作,程序对信号量的操作都是原子操作。
每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且能够加减任意正整数。
反对信号量组。
应用场景:互斥 相似于 mutex,然而 mutex 只能是加锁的人解锁
同步 -> 线程 1 和线程 2 -> 线程 3
某种资源数为 N,多个过程都在应用该资源,为了进行过程间的互斥,能够应用初始值为 N 的信号量;-- 倡议应用记录锁代替;
五、共享内存
共享内存(Shared Memory),指两个或多个过程共享一个给定的存储区。
共享内存是最快的一种 IPC,因为过程是间接对内存进行存取。
因为多个过程能够同时操作,所以须要进行同步。
信号量 + 共享内存通常联合在一起应用,信号量用来同步对共享内存的拜访。
音讯队列和管道基本上都是 4 次拷贝,而共享内存(mmap, shmget)只有两次。
第一步读磁盘文件是要通过一次零碎调用的,它首先将文件内容从磁盘拷贝到内核空间的一个缓冲区,而后再将这些数据拷贝到用户空间,实际上是两次数据拷贝。第三步回写也一样也要通过两次数据拷贝。
4 次:1,write()输出从磁盘到 A 内核空间。2,写进 B 用户空间。3,B 调用 read()读入内核空间。4,从内核空间中放入磁盘.
而内存映射文件是操作系统的提供的一种机制,能够缩小这种不必要的数据拷贝,从而提高效率。它由 mmap()将文件间接映射到用户空间,mmap()并没有进行数据拷贝,真正的数据拷贝是在缺页中断解决时进行的,因为 mmap()将文件间接映射到用户空间,所以中断处理函数依据这个映射关系,间接将文件从硬盘拷贝到用户空间,所以只进行了一次数据拷贝,比 read 进行两次数据拷贝要好上一倍,因而,内存映射的效率要比 read/write 效率高。
2 次:1,输出到用户空间。2,用户空间到输入。
零拷贝?
应用场景:
传递很大的数据
大量读同一数据的场景
最为高效的过程间通信形式,过程能够间接读写内存,不须要任何数据拷贝,实用于多个过程共享数据,或过程间频繁的进行大量的数据交互;-- 倡议应用 mmap 形式;
六、信号
应用场景:
接管过程某个工夫曾经产生,死亡。无奈传递数据,而且信号的品种无限,只实用于实现一些简略的事件告诉工作,如配置跟新信号告诉,一个服务通过信号告知另一个服务本身状态;
七、套接字
应用场景:
如果零碎须要反对分布式部署,服务可能在同一设施或者不同设施,此时应用网络套接字比拟适合,进步了扩展性;
八、unix 域套接字
应用场景:
某个服务与多个服务同时通信,此时须要保护多个通信通道,应用 unix 套接字,能够应用 linux IO 多路复用性能;-- 倡议优先思考网络套接字;