目录
IPC(Inter-Process Communication,进程间通信)是指进程之间的信息交换。由于进程的互斥与同步,需要在进程间交换一定的信息,对于同一个进程的线程我们可以通过之间共享内存来通信,但对于进程来说,默认情况下是不能共享内存的,所以有了下面的这些进程间通信方法。
1. 共享文件
相信大家对文件的操作已经很熟悉了,考虑一下下面这样一个相对简单的例子,其中一个进程(生产者 producer
)创建和写入一个文件,然后另一个进程(消费者 consumer
)从这个相同的文件中进行读取,这样就实现了进程间的通信。
共享文件可能是最为基础的 IPC 机制。在使用这个 IPC 机制时竞争条件可能会发生,如:生产者和消费者同时访问该文件,从而使得输出不确定。
为了避免竞争条件的发生,我们可以在生产者写文件时获得一个写锁,该锁最多只能有一个进程持有;
消费者读取时获取一个读锁,多个读取者可同时获取读锁,但读写锁互斥。
读锁可以提升效率。假如一个进程只是读入一个文件的内容,而不去改变它的内容,可以允许其它进程同时读取。但如果需要写入内容,则很显然需要文件有写锁。
2. 共享内存
该方法通过在内存中划出一块共享存储的区域,进程可以通过对该共享区的读或写来交换信息,实现通信。
但内存共享同样会有竞争条件的风险,我们可以引入信号量来实现对共享内存的同步协调获取。
3. 管道
管道(pipe)是连接需要通信的进程之间半双工的通道。在内核中申请一块固定大小的缓冲区,程序拥有写入和读取的权利,管道拥有一个写端用于写入字节数据,还有一个读端用于按照先入先出(FIFO)的顺序读入这些字节数据。
管道有两种类型,无名管道和命名管道。
无名管道没有备份文件,系统将维持一个内存缓存来将字节数据从写方传给读方。一旦写方和读方终止,这个缓存将会被回收,进而无名管道消失。
而命名管道有备份文件和一个不同的 API。
4. 消息队列
消息队列是消息的链接表,它可以做出和管道相同的表现,但它又足够灵活,可以实现随机查询,使得字节块可以不以先入先出的次序来接收。
5. 套接字
套接字(Scoket)是 UNIX 操作系统下的网络通信接口,一开始套接字被设计用在同一主机上多个应用程序间的通信(即进程间通信),主要为了解决多对进程同时通信时端口和物理线路的多路复用问题。
套接字的优势在于,其不仅适用于同主机下的进程通信,也适用于网络环境中不同计算机间的进程通信。
6. 信号
进程与进程之间还可以通过信号来通信,如用户可以通过 Ctrl + C 来终止一个从命令行中启动的程序,其中Ctrl + C 就是产生了一个 SIGTERM(终止) 信号,然后对应进程收到该信号就会做出相应的处理。
总结
这个内容光看没什么感觉,就是概念,得自己去敲一遍,实现以上各种模型来学习,下面的网站有对应的模型代码,可以试着敲一遍。
https://linux.cn/article-10826-1.html 共享存储