操作系统 - 详解进程之间的通信方式
一、管道
管道类似于一种特殊的文件(并不是),它存在于内存中,进程可以对它进行读写,它提供流控制,保证进程的正确读写,即管道为空时读进程会阻塞,管道为满时写进程会阻塞,以此实现进程之间的通信。
管道有三种:1.普通管道(无名管道、也常直接称管道) 2.流管道 3.命名管道(FIFO)
- 普通管道
它是半双工的,即只能单向传输。
它是有进程关系限制的,只能在父子进程之间使用。
- 流管道
相对于普通管道而言,它不止是单向传输,可以双向传输。
- 命名管道(FIFO):
相对于普通管道而言,它没有进程关系限制,可以在无关进程之间进行数据交换。
二、消息队列
类似于用链表的结构存储消息。
它相比于管道,不止只能传输字节流,也没有缓冲区大小的限制。
它独立于进程存在,进程终止时,消息队列及其内容并不会被删除。
它实现了消息的随机读取。
三、套接字(socket)
与其它通信机制不同是,套接字可用于不同机器间的进程通信,即可用于网络之间的进程通信。
四、信号量
信号量用于实现进程间的互斥与同步,而不是用于存储进程间通信数据。它是一个计数器,用来控制多个进程对共享资源的访问,常作为一种锁机制,实现进程间的同步和互斥。(JUC的Semaphore的设计思想来源吧)
五、共享内存
即多个进程共享某块内存,共享内存是通信方式中最快的一种。
操作系统建立一块共享内存,并将其映射到参与通信的每个进程的地址空间上,进程就可以直接对这块共享内存进行读写。
那么,共享内存这种方式为什么是最快的呢?
这是因为共享内存的整个通信过程对消息的复制只有两次。
1.从数据来源复制到共享内存
2.从共享内存复制到数据目的地
而管道、消息队列等方式对消息的复制需要四次,因为有缓冲区的存在,读写都要经过缓冲区。