进程之间需要通信,主要有以下方式:
生产者-消费者模型就是通过信号量来通信,当一个进程需要其他进程完成操作后才能执行的时候,就自我阻塞,进入睡眠状态。当其他进程完成操作后,会像进程发送信号,进程会被唤醒,然后继续执行。
匿名管道
管道就是在内核中开辟的一块缓存,提供了两个文件描述符,一个用于写入,一个用于读取。
然后将进程fork,子进程会复制对应的FD,然后将父进程的读端关闭,子进程的写段关闭,就可以进行通信了。
命名管道
命名管道引入了路径的概念来标识一个管道,就是给管道起了一个名字。
有什么好处呢?
不存在血缘关系的进程也可以通过路径来找到对应的管道,从而写入或者读取数据。
命名管道和匿名管道的区别:
1、匿名管道只能父子或者兄弟进程之间进行通信, 命名管道所有进程之间都可以通信。
匿名管道和命名管道都是半双工的,一个进程写入的时候,另一个进程只能读取。
IPC中多个进程可以通过同一个key申请同一个物理内存,然后和自己的虚拟地址进行映射,多个进程之间共享一片内存。
由于多个进程有可能同时访问内存,所以要设置信号量来保证内存的线程安全。
多个进程之间也需要一个key来同时申请一个信号量,然后通过信号量来安全的进行读取和写入数据。
1、 共享内存速度块。共享内存是基于用户空间的,可以直接读取和写入。而管道是在内核空间由内核维护的一个缓存,进程还需要内核空间拷贝和用户空间之间的拷贝。
2、 共享内存是全双工的,而管道是半双工的。
3、 共享内存没有提供同步机制,需要用户自己实现,而管道内核提供了同步机制。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_40276626/article/details/120536402
内容来源于网络,如有侵权,请联系作者删除!