2011-02-11 63 views
1

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

看来,当在多进程/多线程环境中使用POSIX队列时,没有线程安全的方式将消息出队到比max_msgsize小的缓冲区。

是否有任何标准解决此问题?或者它甚至是一个问题?

我很清楚还有其他非常棒的库可以做到这一点,但我只是想为用户提供一个完全标准的解决方案,如果他们不想处理依赖关系的话。我试图排队潜在的数百兆字节每个消息,并有一个进程池与多个线程每个出队消息进行处理。

感谢, Chenz

+0

为什么你不能只使用信号量来保护访问?也许我不太明白这个问题。 – frankc 2011-02-11 21:10:34

+0

无法查询队列中下一条消息的大小,因此我必须分配一个等于消息允许的最大大小的缓冲区。 – 2011-02-14 13:03:14

+0

谢谢,现在我明白了。 – frankc 2011-02-14 19:03:16

回答

2

的POSIX队列接口,为您注意,不允许你来查询消息的大小。

因此,实际上,所有的消息都可以按照队列定义配置的最大大小,并且您必须假定简单的实现可以很好地利用该消息来简化记录。

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

如果你的消息率低(至一些定义),你实际做有一个合理的上限,那么就继续前进,并尝试一下。

除了这个,你的下一个最好的选择就是使用队列作为工作队列,而不是作为工作项队列。您的工作项目将不得不以不同方式存储在文件中。然后在队列中有一个很好的短文件名,指向要处理的工作项目的位置。

好运

0

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

有一个静态缓冲区等于最大消息的大小。因为有一个共享的缓存,现在你出队的过程必须是这样的:

  • 锁sempaphore
  • 出队到静态缓冲区
  • 弄不清消息的真实尺寸
  • 副本从静态缓冲区线程本地缓冲区,则该消息的实际大小
  • 解锁旗语

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