C++内存分配器体系结构

C++ memory allocator architecture

本文关键字:体系结构 分配器 内存 C++      更新时间:2023-10-16

我需要在Linux下为C++编写Hoard分配器。虽然算法很简单,但我不明白在哪里(以及如何)存储分配器数据(例如堆)

这就是我的看法:分配器不是一个进程,它是一组函数,任何应用程序都可以使用。每个应用程序都有自己的堆。

  1. 应用程序启动时发生了什么
  2. 分配器是如何发现堆已经创建的
  3. 分配器如何创建、存储和销毁(关闭应用程序时)堆
  4. 当函数被调用时,如何找出它在哪个线程(或在哪个处理器上)中运行
  1. 在应用程序启动期间,可能不会发生太多事情,除非分配器被设计并挂接到应用程序启动代码中,以抢先从操作系统请求一些内存
  2. 堆并不是真正创建的。当操作系统需要一些内存时,分配系统会发出请求,要求操作系统提供一些内存——无论是初始设置,还是以后需要额外内存来完成请求的分配。在类unix系统上,经常使用的系统调用称为sbrk。(严格地说,在linux上,sbrkbrk系统调用的库函数包装器,这对您来说可能是一个重要区别,也可能不是。)
  3. 分配器使用上面提到的sbrk调用从操作系统获取内存。在那之后,它就可以自己管理内存了。当应用程序退出时,操作系统回收内存——它知道通过sbrk调用分配了什么,所以它知道需要收回什么内存
  4. 一段给定的代码在哪个线程或处理器上运行几乎从来都不重要——如果你再解释一下你所要求的内容,我会尽力回答

"编写囤积分配器"是什么意思?有人已经编写了这个分配器。您是否试图使用C++中的?Emery Berger的Hoard的内部工作在白皮书中有很多详细描述Hoard:一个用于多线程应用程序的可扩展内存分配器。任何没有答案的问题都可以通过阅读来源或联系作者来解决。如果没有邮件列表,我会很惊讶。

应用程序启动时发生了什么?

当应用程序启动时,分配器会对自己进行初始化。如果您愿意,可以在第一次调用分配器时执行此操作。

分配器是如何发现堆已经创建的?

我不确定我是否理解了这个问题。如果你谈论的是由使用这个分配器的代码管理的堆,那么它会发现,因为它在创建堆时会创建跟踪条目。如果您谈论的是其他进程中的堆或由其他分配器创建的堆,它并不在乎,因为它无论如何都不能使用这些堆。

分配器如何创建、存储和销毁(关闭应用程序时)堆?

一般来说,您有一个低级和高级分配器。低级分配器只是从操作系统中获取原始内存块。确切的机制是特定于平台的。高级分配器管理堆,并从低级分配器获得内存来保存堆结构。

当函数被调用时,如何找出它在哪个线程(或在哪个处理器上)中运行?

您可以找到哪个线程具有特定于线程的数据,或者通过调用特定于平台的"获取线程ID"函数。至于哪个处理器,它是非常特定于平台的,当你得到它时,信息可能已经过时了。大多数平台都有这样的功能——只需记住,你只能将其用作优化(以减少锁争用或提高缓存命中率)。至关重要的是,不能使用它来绕过锁定,因为线程可以随时从一个处理器移动到另一个处理器。

不过,老实说,提供良好性能并可跨平台移植的内存分配确实是一种巨大的魔法。如果您不是该领域的专家,那么您不太可能开发出一个分配器来提供生产应用程序所需的性能和稳定性。