需要管理一个理论上的平板'记忆

时间:2014-06-13 17:48:51

标签: c++ c memory-management gpgpu

我需要管理单独内存空间中的内存。另一个程序有一大块连续的内存,我的代码无法直接访问,并在初始化期间通知我的代码大小。另一个程序会要求我的代码"分配"来自slab的X个字节,稍后将通知我的代码释放已分配的块。分配和解除分配或多或少是不可预测的,就像使用常规mallocfree一样。由我的代码来管理其他进程的动态内存。预期用途与GPU上的设备内存有关,但我宁愿不提出具体的问题。我想要一个通用的答案,甚至可能在理论上将它用作网络API的后端来管理远程机器上的虚拟内存。

我需要的基本功能是能够使用slab size初始化管理器,执行等效的malloc()free(),并获得一些统计信息,如剩余可用内存和可能的最大可分配大小

显然,我无法抽象地使用malloc()free()'。我也不希望管理我的实际过程记忆来干扰我的抽象板的管理。

最好的方法是什么?而且,更具体地说,标准库或Boost是否具有这种设施?

备注:

  • 此时分配策略并不是非常重要。我的意思是,也许是,但首先我需要弄清楚我将如何开展这项业务。
  • 我将使用它来分配每秒数十到数千个缓冲区,大小不同;一些小到几个字节,一些大到千兆字节。很长一段时间内不会积累分配的空间。

1 个答案:

答案 0 :(得分:0)

  

用于管理远程计算机上的虚拟内存的网络API的后端

网络系统不应该关注远程节点的内存管理。远程节点应该可以自由选择是通过在最快但最稀缺的内存上分配内存还是在较大但较慢的存储中分配内存,或者根据其自身的启发式方式分配内存,同时发生的其他请求,优先级/安全策略集由网络管理员,等等。

考虑malloc和free将限制远程服务器可以做什么来有效地提供请求。

请注意,严格来说,malloc本身只管理"理论" /"虚拟"记忆。 OS内核可以将分配了malloc的内存分配到交换空间中,并在MMU上分配或移动其物理地址。记忆"地址"由" malloc"返回实际上只是一个与实际物理地址不对应的虚拟地址。

与网络系统不同,在管理硬件时,您通常需要非常仔细地指示硬件应该在每个步骤上执行的操作,因为,可能是硬件仅连接到单个系统,因此任何争用都只是本地争用,并且关于性能吞吐量的考虑通常胜过其他一切。在网络系统和本地硬件上管理远程资源的性质是相似的,但却完全不同。

如果您对网络共享内存的设计感兴趣,则可能需要签出内存数据库(例如Redis)或联网文件系统。网络共享内存通常可以使用用户友好的字符串键指向内存块;硬件共享内存通常希望通过使用简单的数字句柄来保持简单和快速。

网络和硬件都需要处理安全地为多个独立进程分割单个资源。在许多流行的操作系统中,负责管理硬件分配的代码通常是内核。用户空间程序很难成为负责管理单片操作系统硬件的人。也许你应该写一个设备驱动程序?许多GPGPU设备现在都有一个MMU。

当然,没有什么能阻止你写gpu_malloc() / gpu_free()。理论上应该可以将mmap远程系统的地址空间放入进程的虚拟内存地址空间,这样程序就可以像使用任何其他内存一样使用远程内存。

  

我将使用它来分配每秒数十到数千个缓冲区,大小不同;一些小到几个字节,有些大到千兆字节。

通常,您不希望有数千个小额分配。如果涉及远程系统,与内存管理相关的系统调用可能会很昂贵,因此可能需要让客户端程序分配大型slab并进行自己的子分配(malloc这样做,小型malloc通常会导致一个系统调用分配更大的内存比请求和malloc然后suballocates slab)。