【问题标题】:Memory mapping, virtual and physical memory in C++C++ 中的内存映射、虚拟内存和物理内存
【发布时间】:2013-07-26 12:09:25
【问题描述】:

我正在尝试解决以下问题:拥有一个管理泛型类型的自定义数据容器,我需要允许其他应用程序组件检索容器的内部指针并将其用作简单的 T* 数组区域(不将其视为更智能的阵列持有人)。问题是,在一个非常特殊的情况下,这个记忆被移到了其他地方并被删除了。因此,有大量组件知道旧数据指针,并将使用该指针来访问它们所需的信息。

设置看起来,伪代码,像这样:

container<T>
{ 
  T* ptr;
  public:
  ContainerInterfaceCode..
}

假设:

T* ptr 是一个伪地址(我可以称之为“虚拟”吗?),它被映射到物理空间 A。

当一个事件发生时,T* ptr 的映射将被设置为另一个物理空间 B。

任何使用T* ptr 的组件都会忘记物理位置的变化,“认为”其数据存储在该虚拟地址。

结论:

因此,我想知道是否存在一种涉及内存映射(虚拟到物理)的机制,它允许处理T* ptr 的映射,从而使其他应用程序组件保持不变。简单地说,T* ptr 应该指向一个在某个部分被映射的内存区域,并且,根据请求,相同的指针将被映射到另一个地方(为了一致性而复制底层数据的地方)。这必须允许无缝过渡。

注意:我不能使用包装器、智能指针、句柄等,因为这意味着修改一个巨大的代码库只是为了一个相当小的修改。

由于我没有找到足够的资源来处理这种情况,也许任何人都可以提供一个简短的网络图,其中包含一些关于该主题的相关阅读材料?

【问题讨论】:

  • 我不确定我是否遵循这个问题,但我想说不,这是不可能的。
  • 我会用一个小“数字”编辑问题
  • 涉及内存映射的机制(虚拟到物理)?
  • @HAL:这个线程osdir.com/ml/linux.drivers.modem.hcf/2002-07/msg00005.html 中提到的函数OSMapMemory() 听起来像是我假设场景的潜在解决方案。这就是为什么我觉得这样的事情是有效的,可以用 C++ 实现。但我没有其他线索。
  • @teodron 可以有两个不同的虚拟地址引用同一个物理内存。你问的是这个吗?

标签: c++ memory-management memory-mapping


【解决方案1】:

在linux中可以使用共享内存。共享内存是一种允许两个进程访问同一块内存区域的机制,是一种IPC方法。你可以找到更多 详情在这里http://en.wikipedia.org/wiki/Shared_memory

【讨论】:

  • 对于多进程的情况(我已经为 IPC 使用共享内存而不是套接字,因为它更快),这是一个解决方案。我有一个具有多个组件的进程(因此,基本上,相同的地址空间)..因此您的解决方案可能不起作用(因为它并没有真正让数据指针本身保持不变)。
  • 因为你有多个组件,所以如果你想使用共享内存你应该自己管理内存,比如创建一个数组或者其他结构,你必须使用信号量来保护内存避免2个进程一次写入。另一个甚至共享内存比socket快,但是比较难处理,我更喜欢用socket做,因为它更稳定,好用。
  • 如果没有某种句柄/智能指针和专门的管理器/观察器来跟踪指向与我的容器T* ptr 相同的内存的所有指针,这是不可能的。这种机制方式过于复杂,需要大量关注细节和专业知识。我希望避免这种情况,因为这也意味着对需要每天维护的庞大代码库进行大量更改。
  • 在我之前的项目中,我们在共享内存中创建了一个 rb-tree 来管理内存,我们使用 serval semaphores 来保护它不被多次写入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-08
  • 2015-05-24
  • 1970-01-01
相关资源
最近更新 更多