Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 需要管理一块“理论”内存_C++_C_Memory Management_Gpgpu - Fatal编程技术网

C++ 需要管理一块“理论”内存

C++ 需要管理一块“理论”内存,c++,c,memory-management,gpgpu,C++,C,Memory Management,Gpgpu,我需要管理单独内存空间中的内存。另一个程序有一大块连续内存,我的代码无法直接访问,并在初始化期间通知我的代码其大小。另一个程序将要求我的代码从slab分配X字节,然后通知我的代码取消分配分配的块。分配和解除分配或多或少是不可预测的,就像使用常规malloc和free一样。由我的代码来管理另一个进程的动态内存。预期用途与GPU上的设备内存有关,但我不想让问题具体到这一点。我想要一个通用的答案,理论上我甚至可以将其用作远程机器上管理虚拟内存的网络API的后端 我需要的基本功能是能够使用slab大小初

我需要管理单独内存空间中的内存。另一个程序有一大块连续内存,我的代码无法直接访问,并在初始化期间通知我的代码其大小。另一个程序将要求我的代码从slab分配X字节,然后通知我的代码取消分配分配的块。分配和解除分配或多或少是不可预测的,就像使用常规malloc和free一样。由我的代码来管理另一个进程的动态内存。预期用途与GPU上的设备内存有关,但我不想让问题具体到这一点。我想要一个通用的答案,理论上我甚至可以将其用作远程机器上管理虚拟内存的网络API的后端

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

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

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

注:

此时,分配策略并不十分重要。我的意思是,也许是这样,但首先我需要弄清楚我要怎么做这件事。 我将使用它来分配每秒数十到数千个不同大小的缓冲区;有些小到几个字节,有些大到千兆字节。在很长一段时间内不会累积分配的空间。 网络API的后端,用于管理远程计算机上的虚拟内存

联网系统不应关心远程节点的内存管理。远程节点应该可以自由选择是在最快但最稀少的内存上分配内存,还是在更大但速度较慢的内存中分配内存,或者根据其自身的启发式、同时发生的其他请求、网络管理员设置的优先级/安全策略,两者的混合,来服务请求

考虑malloc和free将限制远程服务器有效地为请求提供服务

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

与网络系统不同,在管理硬件时,您通常希望非常严格地规定硬件在每个步骤上应执行的操作,因为据推测,硬件仅连接到单个系统,因此任何争用都只是本地争用,有关性能吞吐量的考虑通常胜过其他一切。在网络系统和本地硬件上管理远程资源的性质类似,但有很大不同

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

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

当然,没有什么可以阻止你写一个gpu\umalloc/gpu\free。理论上,应该可以将远程系统的地址空间映射到进程的虚拟内存地址空间中,这样程序就可以像使用任何其他内存一样使用远程内存

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


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

具体地说,关于编程库的问题是允许的,enco
乌拉尔。然而,有关推荐图书馆的问题并不符合本网站的目标。如果你提出了一个只有一个正确答案的问题,你仍然可以得到帮助,比如库X可以用来做Y吗?我正在阅读这个问题,我可以实现一个远程内存管理器吗?计算机a有一个巨大的内存板,并要求计算机B从板中返回malloc并返回一个指针,a从中写入和读取,完成后,它告诉计算机B释放指针。因此,计算机B正在管理板外的各个分配,尽管所有内存实际上都在A的虚拟内存中。有点奇怪,但这是有道理的。@MooingDuck:是的,基本上就是这样,尽管没人说A是电脑。也许这只是一个家伙要求一台计算机去malloc并释放他的笔记本的页面。我最近创建了一个由PC和多个应用程序组成的系统,要求一台PC(控制器)用于监控并向其他PC上运行的应用程序发出命令。该体系结构使用TCP/IP服务器和客户端,以及一个自定义协议,该协议有助于跨网络运行的应用程序之间的消息传递。您是否可以对控制器应用程序执行类似操作,该应用程序通过一组套接字服务器/客户端连接和自定义消息来监视和指导其他进程?您假设远程节点可以管理内存。假设它不能。另外,是的,malloc和free正在管理虚拟内存;但是我并没有问到如何管理进程的虚拟内存…至于需要拆分单个硬件资源以供多个进程同时使用-1。情况可能并不总是这样,2。拆分可能不同于计算机内存中的拆分,也就是说,您没有需要内存空间并希望在内存中分配的进程,您可以查看GPU内核,这些内核只访问几个被传递地址的缓冲区。它们可能会在其他空间分配内存,但这不是主机的问题。