关于ipc:作为进程间通信的文件和缓存的软件开发模式

 2021-04-26 

Softwaredevelopment patterns for Files and Caches as Inter-Process-Communication

使用数据库或文件作为简单的数据持久层很容易理解。但是,还有一些方法可以将它们用作通信通道,以将数据从一个正在运行的进程传输到另一个进程,甚至发送命令和请求,尤其是在此通道比普通的Unix套接字(例如共享内存)快的情况下。

但是您如何有效地使用它呢?我的意思是,进程没有获得共享内存更改的事件,他总是必须轮询它,对吗?但是,如果所有进程一直都在轮询其共享内存,那不是太耗费资源吗?还有什么其他选择?


文件和数据库旨在存储数据,并且只能将其用于IPC,而其他机制(互斥体,事件,信号量等)则用于同步对数据的访问并发出有关更改的信号。这些机制正在被"监听",等待此类信号并不消耗资源。另一方面,读取试图捕获更改的文件(这适用于内存映射文件或共享内存)既浪费资源,而且如果您不同步读写访问权限,可能会造成麻烦(这会使您回到互斥体和事件等)。


要获得在Unix或Linux系统上使用IPC进行更改的通知,我可以考虑采用其他技术,而不必借助轮询。

第一个阻塞读取

可以使用文件描述符(文件,Unix套接字,管道或命名管道,IPC队列等)。使用者将以阻塞方式读取此文件(可能建议超时)。一旦生产者更新了共享内存,它将向该文件描述符写入一些内容。因此,当发生这种情况时,消费者将从读取中唤醒,然后去读取共享内存。使用者将处于睡眠状态,因此在等待时不会消耗资源(如CPU)。

一个人甚至可以使用select来让使用者同时等待多个文件描述符。

第二信号

生产者发出的信号将唤醒消费者。一旦生产者更新了共享内存,生产者就会向消费者发送一个信号(例如SIGUSR1)。消费者先前已经订阅了该信号,并且可以处理该请求。由于偶数可以随时触发,因此处理起来有点复杂,因此使用者的设计更加困难。