在进程调用之间传输数据

时间:2011-03-26 21:22:33

标签: linux performance process io pipe

我有一个多次调用的Linux进程,我需要尽快完成这个过程。

问题是我必须在调用之间保持一个状态(从前一次调用加载数据并将其存储到下一个调用中),而不运行另一个进程/守护进程。

你能建议快速的方法吗?我知道我可以使用文件进行I / O,并且由于显而易见的性能原因而希望避免使用它。应该(可以?)我创建一个命名管道来读取/写入,以避免真正的磁盘I / O吗?

3 个答案:

答案 0 :(得分:3)

管道不适合这个。如果您绝对确定文件太慢,请使用posix shared memoryposix message queue - 您应首先测试。

在共享内存的情况下,如果程序不存在,程序会使用shm_open()创建段,如果存在,则打开它。你mmap()内存并进行任何更改并退出。当你知道你的程序不再被调用并且不再需要共享内存时,你只需要shm_unlink()。

使用消息队列,只需设置队列即可。您的程序读取队列,进行任何更改,写入队列并退出。当你不再需要队列时Mq_unlink()。

这两种方法都具有内核持久性,因此您可以在重新启动时丢失共享内存和队列。

答案 1 :(得分:0)

听起来你有一个持续执行的过程。

为什么不创建一个生成工作线程的工厂? 工厂可以为工人提供所需的任何信息。

答案 2 :(得分:0)

  

...我可以将文件用于I / O,并希望避免使用它,原因很明显。

我想知道这些原因是什么......

Linux在page cache中缓存内核内存中的文件。写入首先转到页面现金,换句话说,write()系统调用是一个内核调用,只将数据从用户空间复制到页面缓存(当系统处于压力下时,它会有点复杂) 。一段时间后pdflush异步将数据写入磁盘。

文件read()首先检查页面缓存,以查看数据是否已在内存中可用以避免磁盘读取。这意味着如果一个程序将数据写入文件而另一个程序读取它,只要页面缓存保留这些文件,这两个程序就可以通过内核内存进行有效通信。

如果您想完全避免磁盘写入,也就是说,状态不需要在操作系统重新启动时保留,那么这些文件可以放在/dev/shm或{{1通常是内存文件系统的挂载点。