代码之家  ›  专栏  ›  技术社区  ›  SF.

如何在共享内存中获取共享对象

  •  1
  • SF.  · 技术社区  · 16 年前

    独立地,它使用共享内存块与外部CGI模块协作,其中几乎所有的易失性状态都保存在共享内存块中,因此外部模块可以读取它并在适用的情况下修改它。

    问题是CGI模块需要大量来自的永久配置数据。因此,主应用程序在两个内存区域之间执行大量完全不必要的复制,以使数据可用。其思想是将整个共享对象加载到共享内存中,并使其直接可供CGI使用。问题是:怎么做?

    • dlopen和dlsym不提供任何工具来指定SO文件的加载位置。
    • 我们试过shmat()。它似乎只有在某些外部CGI真正尝试访问共享内存时才起作用。然后,指向的区域看起来就像从未共享过一样私密。也许我们做错了什么?
    • 因此在每个需要它的脚本中加载。结构的绝对大小,与调用频率有关(一些脚本每秒调用一次以生成实时更新),而这是一个嵌入式应用程序,因此无法实现。
    • 简单地memcpy()将.so转换成shm也不好——一些结构和所有函数都是通过指针互连的。
    4 回复  |  直到 16 年前
        1
  •  2
  •   mloskot    16 年前

    Creating STL Containers in Shared Memory

    也有优秀的离子Gazta±aga's Boost.Interprocess 图书馆 shared_memory_object 以及相关特征。IN提出了未来TR的C++标准化委员会的解决方案: Memory Mapped Files And Shared Memory For C++

        2
  •  4
  •   doron    16 年前

    在使用共享内存时,首先要记住的是,相同的物理内存可以作为不同的地址映射到两个进程的虚拟地址空间中。这意味着,如果指针在数据结构中的任何位置使用,它们将导致问题。一切都必须通过索引或偏移来正常工作。要使用共享内存,必须清除代码中的所有指针。

    加载.so文件时,只加载.so文件代码的一个副本(因此称为“共享对象”)。

    fork ,当一个进程写入给定的数据段时,数据段仅复制到单独的物理内存中。

        3
  •  2
  •   anon anon    16 年前

    将实际C++对象放置在共享内存中是非常困难的,正如您所发现的。我强烈建议您不要这样做——将需要共享的数据放在共享内存或内存映射文件中要简单得多,而且可能更健壮。

        4
  •  0
  •   Paul    16 年前

    Serialization 序列化函数将对象转换为字节,然后您可以在SharedMemory中写入字节,并让CGI模块将字节反序列化回对象。