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

时间:2012-05-24 11:14:35

标签: design-patterns ipc

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

但你如何有效地使用它呢?我的意思是,一个进程没有获得共享内存更改的事件,他总是要对它进行轮询,对吧?但是,如果所有进程一直在轮询共享内存,那么资源是否过于密集?还有什么其他选择?

2 个答案:

答案 0 :(得分:1)

要在Unix或Linux系统上使用IPC获取更改通知,我可以在不使用轮询的情况下考虑不同的技术。

第一次阻止阅读

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

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

第二次信号

生产者发出的信号会唤醒消费者。生成器在更新共享内存后向消费者发送信号(例如SIGUSR1)。消费者先前订阅了信号并可以处理该请求。处理起来有点复杂,因为偶数可以随时触发,因此消费者的设计更加困难。

答案 1 :(得分:1)

文件和数据库是为存储数据而设计的,并且将它们用于IPC只能作为帮助者,其中使用其他机制(互斥,事件,信号量等)来同步对数据的访问和发出有关变化的信号。这些机制正在被“收听”,等待这样的信号并不耗费资源。另一方面,读取文件试图捕获更改(这适用于内存映射文件或共享内存)既浪费资源又可能导致问题,如果您不同步读写访问(这会带您回到互斥锁和事件等。)