gpt4 book ai didi

c++ - C++ 中用于可变长度记录的无锁共享内存

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:33 27 4
gpt4 key购买 nike

我是 IPC 的新手。 Writer进程将数据写入共享内存,许多reader进程读取数据。要写入的数据具有唯一标识符,必须通过唯一键进行索引以便更快地访问(如用于查找的 STL::map 或 hashmap)。数据也是可变长度记录 (XML)(平均长度为 200-250 字节)。操作系统是英特尔至强四核服务器上的 solaris 10 (i86pc)。

总数据量超过200G。但是我们将只在共享内存中保留最新数据。历史数据驻留在文件中。共享内存大小在4G~6G左右。

没有像 Boost::interprocess 这样的外部库可用

我有几个问题,可能很多

  1. 哪个更有效:shared_memory 或 mmap(内存映射文件)
  2. 如何为变长记录建立索引。 [我不知道,可能是一些散列?]。
  3. 如果将 XML 转换为固定大小的结构(权衡 - 结构的大小会很大,将近 300 多个可能的字段),这会不会很整洁?
  4. 我们能否通过提供自定义分配器将任何 STL 放入共享内存中?
  5. 是否可以在没有信号量的情况下实现(使用 CAS 的无锁实现)。

谢谢

这个怎么样。

|--------------------------|
| start_id | end_id | -> range of msg id present in the segment
|--------------------------|
| id1 | start_mem | length | ->
|--------------------------| ->
| id2 | start_mem | length | -> table of index for the actual data
|--------------------------| ->
| id3 | start_mem | length | ->
|--------------------------| ->
| id4 | start_mem | length | ->
|--------------------------| ->
| |
| |
| |
| data segment |
| varibale length |
| xml are stored |
| |
| |
|--------------------------|

当新数据到达且段已满时。最旧的数据以循环方式被删除。可能需要删除超过 1 条记录。

最佳答案

最简单的解决方案,如果你需要复杂的索引和其他类似的东西,你真的应该考虑一个面向服务的架构而不是共享内存。只需指定一个进程作为您的主缓存进程,并让它接受来自其他需要数据的进程的本地连接(通过 unix 域套接字或 TCP 套接字或其他)。这让事情变得简单得多。

如果您不选择这条路线,请注意共享内存很难。您所要求的在共享内存中绝对可行 - 您可以在此 shmem block 中创建堆分配器,等等。STL 分配器可能可以工作,但不要指望任何第三方库会满意使用自定义指针类型的 STL 分配器。您需要锁(如果您很聪明,您可能在某些情况下可以避免使用它们,但不是全部,在这种情况下肯定与 STL 告别),并且您将不得不重建一切你通常认为理所当然。

再次强调,我强烈建议您从一个简单的缓存守护进程开始。这在大多数情况下都很好,只是增加了一点延迟。

关于c++ - C++ 中用于可变长度记录的无锁共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9113912/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com