从POSIX队列接收消息时如何节省内存?

时间:2011-02-11 13:07:31

标签: c posix memory-management message-queue

从POSIX队列接收邮件时如何节省内存?

似乎在多进程/多线程环境中使用POSIX队列时,没有线程安全的方法将消息出列到任何小于max_msgsize的缓冲区。

此问题是否有标准解决方案?或者甚至是一个问题?

我很清楚还有其他非常好的库可以做到这一点,但我只是想为用户提供一个完全标准的解决方案,如果他们不想处理依赖关系。

仅供参考,我正在尝试为每条消息排队数百兆字节,并且拥有一个包含多个线程的进程池,每个进程将消息出列以进行处理。

谢谢, Chenz

2 个答案:

答案 0 :(得分:2)

正如您所注意到的,POSIX队列界面不允许您查询消息的大小。

因此,实际上,所有消息都可能处于队列定义所配置的最大大小,并且您必须假设一个简单的实现可能会利用它来简化记录保存。

鉴于您正在处理多兆字节的消息,所以将这些消息放入队列中不太可能是一个好的解决方案(不幸的是)。

如果你的信息率很低(某些的定义)并且你确实有一个合理的上限,那么就去试试吧。

除此之外,您最好的选择是将队列用作工作订单队列,而不是工作项队列。您的工作项可能必须以不同方式存储在文件中。然后在队列中你有一个很好的短文件名,指向要处理的工作项的位置。

祝你好运

答案 1 :(得分:0)

我认为没有真正好的方法可以做到这一点。这是一个想法,但我认为你会发现它由于锁争用而表现不佳:

有一个静态缓冲区等于最大消息的大小。因为有共享缓冲区,所以现在您的出列过程必须如下所示:

  • lock sempaphore
  • 出列入静态缓冲区
  • 弄清楚消息的实际大小
  • 从静态缓冲区复制到线程本地缓冲区,该缓冲区是消息的实际大小
  • 解锁信号量

有静态缓冲区的开销,但依赖于消息大小的分布,您仍然可能会看到总内存使用量的减少。但是,现在你必须处理静态缓冲区的争用,这可能是很好的,特别是当一些大的消息连续到达时。如果非常大的消息很少,那么这可能不是一个糟糕的解决方案。