繁体   English   中英

需要管理一块“理论”记忆

[英]Need to manage a slab of 'theoretical' memory

我需要管理位于单独内存空间中的内存。 另一个程序具有大量连续内存,我的代码无法直接访问它们,并在初始化期间将其大小通知我的代码。 另一个程序将要求我的代码从平板上“分配” X个字节,并稍后通知我的代码以取消分配所分配的块。 分配和释放将或多或少不可预测,就像使用常规mallocfree 由我的代码来管理其他进程的动态内存。 预期的用途与GPU上的设备内存有关,但我不想提出具体的问题。 我想要一个通用的答案,也许甚至足够,从理论上讲,我也可以将其用作网络API的后端,用于管理远程计算机上的虚拟内存。

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

显然,我不能“抽象地”使用malloc()free() 我也不希望我的实际过程内存的管理干扰我的抽象板的管理。

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

笔记:

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

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

联网系统不应关注远程节点的内存管理。 远程节点应该自由选择是通过在最快但最稀缺的内存上还是在更大但更慢的存储中分配内存来满足请求的要求,这取决于其自身的启发式方法,同时发生的其他请求,优先级/安全策略集由网络管理员执行,依此类推。

关于malloc和free的思考将限制远程服务器可以做什么以有效地服务请求。

请注意,严格来说,malloc本身仅管理“理论” /“虚拟”内存。 OS内核可以分页用malloc分配的内存进出交换空间,并在MMU上分配或移动其物理地址。 “ malloc”返回的内存“地址”实际上只是一个虚拟地址,与实际的物理地址不对应。

与网络系统不同,在管理硬件时,您通常希望非常明确地指示硬件在每个步骤中应执行的操作,因为假定硬件仅连接到单个系统,所以任何争用都只是本地争用以及有关性能的注意事项吞吐量通常胜过其他一切。 在网络系统和本地硬件上管理远程资源的性质是相似的,但有很大的不同。

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

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

当然,没有什么阻止您编写gpu_malloc() / gpu_free() 它理论上应该可以mmap远程系统的地址空间到进程的虚拟内存地址空间,使得程序可以只使用远程存储,就像任何其他的内存。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM