我需要在Linux下为C++编写Hoard分配器。虽然算法很简单,但我不知道在哪里(以及如何)存储分配器数据(例如堆)。
我的理解是:分配器不是进程,它是一组函数,任何应用程序都可以使用。每个应用程序都有自己的堆。
- 应用程序启动时发生了什么?
- 分配器如何找出已经创建了堆?
- 分配器如何创建、存储和销毁(关闭应用程序时)堆?
- 调用函数时,如何确定它在哪个线程(或处理器)上运行?
我需要在Linux下为C++编写Hoard分配器。虽然算法很简单,但我不知道在哪里(以及如何)存储分配器数据(例如堆)。
我的理解是:分配器不是进程,它是一组函数,任何应用程序都可以使用。每个应用程序都有自己的堆。
sbrk
。(严格来说,在 Linux 上,sbrk
是对 brk
系统调用的库函数包装器 - 这可能或可能不是你关心的重要区别。)sbrk
调用从操作系统获取内存。之后,它就自行管理该内存。当应用程序退出时,操作系统会回收内存 - 它知道通过 sbrk
调用分配的内存,因此它知道需要收回哪些内存。mmap
/dev/zero
来获取非常大的内存块。不过这只是一个边缘情况。 - Omnifarioussbrk
系统调用。内存分配器的工作是在适当的时候进行该系统调用,并维护描述使用sbrk
调用获得的内存的哪些部分是空闲的,哪些是已分配的内部数据结构。 - Omnifarioussbrk
看作是malloc
的malloc
......如果这有任何意义的话。=) - Carl Norum您可以通过线程特定数据或调用平台特定的“获取线程ID”函数来查找线程。至于哪个处理器,这非常依赖于平台,而且信息可能在您获得它时已经过时了。大多数平台确实有这样的功能 - 只需记住,您只能将其用作优化(以减少锁争用或提高缓存命中率)。关键是,您不能使用它来绕过锁定,因为线程随时可以从一个处理器移动到另一个处理器。
老实说,提供良好性能并可在各种平台上移植的内存分配确实是一种重度巫术。如果您不是该领域的专家,则很难开发出为生产应用程序提供所需性能和稳定性的分配器。