我期待着了解动态内存管理在gnu/linux系统中如何在低级别工作(又称ptmalloc如何工作)。
当然,我读过代码,但我有很多疑问。我,或多或少,了解数据结构,但我有许多信息泄漏!
我的问题是是否有人知道任何详细解释实现的资源。例如,我读过一些论文,如“通过打破堆来理解堆”或“malloc malleficarum”系列和post系列。他们做得很好,但是,当然,他们更专注于开发,而不是解释许多实现细节。
如果你不知道任何资源,这里是我的一些问题。
竞技场到底是什么?在heap_info struct中变量ar_ptr的代码中,有一个注释说“arena for this heap”,因此arena不能是堆(到处都这么说)。
为什么在堆信息结构中没有下一个指针和上一个指针?是因为主竞技场吗?什么是主竞技场?
每个堆信息结构可以有多个竞技场(指向不同的malloc状态结构)?
什么时候创建新闻竞技场,什么代码处理它?我读过当一个请求存储数据的arena被锁定(因为进程或进程线程正在处理它)时创建新的arena,我也读过每个进程线程都有一个不同的arena。这里最重要的是你是否知道什么代码可以处理这些情况。
我也不明白人们怎么说所有的内存操作都是从最上面的块或最原始的块产生的。你知道我在哪里能找到这个密码吗?
顺便说一句,我不想深入了解互斥锁的细节。
我在回顾glibc 2.12.1中ptmalloc的实现。我想做一些关于所有东西的整体结构的图表,所以我需要理解这些东西!
谢谢您。
最佳答案
好吧,我做了一些调查,我有很多问题的答案。
竞技场是存储进程所有动态数据的内存区域。简而言之,竞技场是过去称为堆的内存结构。考虑到现在(使用多线程技术)您希望每个进程有多个堆,您可以通过创建一个称为arena的东西来处理它,但是这个arena只不过是一个堆。HeAPuxFipe结构只管理进程的多个存在的区域。
我不知道为什么只有一个prev指针。我知道的是,通常情况下,所有的动态数据都存储在主竞技场中,它是为该进程创建的竞技场。我不知道在什么情况下不使用main_arena,我知道的是,如果内存块中的size字段设置了非main_arena位,则不使用main_arena,并且算法通过heap_ptr()宏清除内存块指针中20个不太重要的位,从而获得新的arena地址。总而言之,在正常情况下,主竞技场将一直使用。
是的,正如我所说,每个堆信息结构可以有多个arena。这是因为锁争用。如果你有足够的空闲时间,你可以在[1]中读到。
我不记得这个了。但事实是,如果竞技场在使用中被锁定,就会创建一个新的竞技场。搜索对类似new_arena()或new_heap()的函数的任何调用。我记得函数名与此类似。
我认为这只意味着在开始时堆的所有内存空间都是最上面的块(或荒野块),所以当进程需要新的内存请求时,最上面的块会被分割和碎片化。所以一切都从最上面的部分开始。
我不想夸大其词,我想,三个月后,我的答案是更适合我的问题,所以我会把它作为正确的答案。另一方面,感谢所有其他答案。他们真的很有帮助。
顺便说一句,我把所有的研究都写在一篇论文里了,但是考虑到它是西班牙语的,我认为它在这里没有用处,我不知道它是否会被认为是垃圾邮件。[二]
[1]http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.16.4439
[2]这是报纸:http://overflowedminds.net/papers/newlog/linux_heap_exploiting_revisited.pdf
关于c - ptmalloc实现的代码描述,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11438372/