如何在C++中访问有关内存的元数据

How to access metadata about memory in C++

本文关键字:内存 元数据 访问 C++      更新时间:2023-10-16

我有一个工作流,它有多个通过数据边连接的计算任务;使得一个任务正在为另一个任务产生数据。每个任务都绑定到一个单独的线程。其中一个任务是从内存池中获取内存,该内存由释放该内存的另一个任务回收。

CCD_ 1在存储器池内用于存储诸如存储器起源于何处(GPU地址空间/CPU地址空间)和释放规则(指示何时可以回收存储器)之类的信息。

任务1从池中获取内存:

std::shared_ptr<MemoryData<Type>> m = memGet<Type>("MemoryManagerName", ruleForReleasingMemory);
// Store the memory to passed along with data
data->setMemory(m);

m必须在数据中从一个任务传递到另一个任务,直到它到达释放它的任务

任务2释放内存:

std::shared_ptr<MemoryData<Type>> m = data->getMemory();
memRelease("MemoryManagerName", m);

我想做的是将memGet的返回类型更改为仅返回Type。然后在发布过程中,它可以使用一些方法来获得MemoryData来回收内存。这将允许我简化Data表示,这样我就不必存储std::shared_ptr<MemoryData<Type>>

到目前为止,我已经考虑了两种设计:

(1) 使用指针算术来使用指向指针**的指针并由此计算MemoryData的起始地址。

(2) 在指向Type的指针和指向MemoryData的指针之间创建一个映射,这将需要将这些信息发送到每个任务,如果我必须添加动态内存分配,那么这将有点挑战

(默认情况下)没有关于内存的元数据(如果有,则是特定于实现的)。

您可以编写自己的内存分配器(在现有操作系统基元之上,如Linux上的mmap(2),MemoryData0也使用这些基元),并自己管理元数据。

你可以在内存地址上玩一些把戏(例如,比特和右移,作为一些uintptr_t广播,等等)来获得当前的竞技场或内存块。我想的是,如果你有一些任意void* p指针指向分配器提供的内存区域内的某个东西,你可能会使用(uintptr_t)p >> 14来获得一些较小的索引到你的元数据中,等等。

当然,这种地址位处理是特定于处理器和操作系统的(这取决于页面大小以及操作系统如何处理它们)。