【问题标题】:Transferring data between process calls在进程调用之间传输数据
【发布时间】:2011-07-23 15:47:09
【问题描述】:

我有一个 Linux 进程被多次调用,我需要使这个进程尽可能快。

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

您能建议快速的方法吗?我知道我可以将文件用于 I/O,并且出于明显的性能原因想避免它。我应该(可以吗?)创建一个命名管道来读取/写入并避免真正的磁盘 I/O?

【问题讨论】:

  • fast 是相对的,你的要求是什么?在许多情况下,将状态信息存储在文件中可能是一个合适的解决方案。

标签: linux performance process io pipe


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 好主意,但我无法在该机器上生成更多进程。
    【解决方案3】:

    ...我可以将文件用于 I/O,但出于明显的性能原因,我想避免它。

    请问这些原因是什么...

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

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

    如果你想完全避免磁盘写入,也就是说,状态不需要在操作系统重新启动后保持,这些文件可以放在/dev/shm/tmp中,这通常是内存中文件系统的挂载点。

    【讨论】:

    • 我认为这是一个经验法则,与 RAM 访问相比,磁盘访问确实很慢。我不认为我可以依靠页面在我的进程调用之间停留在缓存中,因为我不知道同时会发生什么以及如何发生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    相关资源
    最近更新 更多