【七彩虹教育】Linux操作系统内存分配方式(成都七彩虹教育)

在Linux操作系统下进程通过C标准库中的内存分配函数 malloc 向系统申请内存(malloc() 并不是系统调用,也不是运算符,而是C库里的函数,用于动态分配内存。),但真正与内核交互之间,其实还隔了一层,即内存分配管理器(memory allocator)。

目前Linux系统常见的内存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。

分别介绍下大致的功能:

1.ptmalloc(glibc malloc)

GNU Libc 的内存分配器(allocator)—ptmalloc,起源于Doug Lea的malloc。由Wolfram Gloger改进得到可以支持多线程。

内存分配器中只有一个主分配区(main arena),每次分配内存都必须对主分配区加锁,分配完成后释放锁,在SMP多线程环境下,对主分配区的锁的争用很激烈,严重影响了malloc的分配效率。ptmalloc增加了动态分配区(dynamic arena),主分配区与动态分配区用环形链表进行管理。每一个分配区利用互斥锁(mutex)使线程对于该分配区的访问互斥。每个进程只有一个主分配区,但可能存在多个动态分配区,ptmalloc根据系统对分配区的争用情况动态增加动态分配区的数量,分配区的数量一旦增加,就不会再减少了。而动态分配区每次使用mmap()向操作系统“批发HEAP_MAX_SIZE大小的虚拟内存,如果内存耗尽,则会申请新的内存链到动态分配区heap data的“strcut malloc_state”。如果用户请求的大小超过HEAP_MAX_SIZE,动态分配区则会直接调用mmap()分配内存,并且当free的时候调用munmap(),该类型的内存块不会链接到任何heap data。

Chunk说明:

一个arena 中最顶部的 chunk 被称为「top chunk」。它不属于任何 bin 。当所有 bin 中都没有合适空闲内存时,就会使用 top chunk 来响应用户请求。当top chunk 的大小比用户请求的大小小的时候,top chunk 就通过 sbrk(main arena)或 mmap( thread arena)系统调用扩容。

优点:

ptmalloc是GNU C库(glibc)中的默认内存分配器,广泛用于Linux系统。

基于Doug Lea的malloc实现,采用了多种技术,如自由链表、分离器和堆的延迟绑定等。

ptmalloc的特点是成熟、稳定,并且与GNU C库紧密集成。

缺点:

如果后分配的内存先释放,无法及时归还系统。因为ptmalloc收缩内存是从top chunk开始,如果与top chunk相邻的 chunk不能释放, top chunk 以下的 chunk 都无法释放。

内存不能在线程间移动,多线程使用内存不均衡将导致内存浪费。

每个chunk至少8字节的开销很大。

不定期分配长生命周期的内存容易造成内存碎片,不利于回收。

加锁耗时,无论当前分区有无耗时,在内存分配和释放时,会首先加锁。

从上述来看ptmalloc的主要问题其实是内存浪费、内存碎片、以及加锁导致的性能问题。

2.tcmalloc(Google malloc)

tcmalloc是Google开发的内存分配器,在Golang、『Chrome』中都有使用该分配器进行内存分配。有效的优化了ptmalloc中存在的问题。

tcmalloc是专门对多线并发的内存管理而设计的,tcmalloc主要是在线程级实现了缓存,使得用户在申请内存时大多情况下是无锁内存分配。整个 TCMalloc 实现了三级缓存,分别是ThreadCache(线程级缓存),Central Cache(中央缓存:CentralFreeeList),PageHeap(页缓存),最后两级需要加锁访问

特点:

tcmalloc是Google开发的内存分配器,主要用于Google的C++代码。

tcmalloc通过减少锁的竞争和减少内存碎片来提高性能。

它使用线程本地缓存(Thread-Caching Malloc)的概念,将内存分配的任务分散到不同的线程中,以减少对共享数据结构的竞争。

tcmalloc还有其他一些优化策略,如小对象合并、高效的分配器缓存等。

tcmalloc也带来了一些问题,使用自旋锁虽然减少了加锁效率,但是如果使用大内存较多的情况下,内存在Central Cache或者Page Heap加锁分配。而tcmalloc对大小内存的分配过于保守,在一些内存需求较大的服务(如推荐系统),小内存上限过低,当请求量上来,锁冲突严重,CPU使用率将指数暴增。

3.jemalloc

jemalloc是facebook推出的,目前在firefox、facebook『服务器』、android 5.0 等服务中大量使用。 jemalloc最大的优势还是其强大的多核/多线程分配能力. 以现代计算机硬件架构来说, 最大的瓶颈已经不再是内存容量或cpu速度, 而是多核/多线程下的lock contention(锁竞争). 因为无论CPU核心数量如何多, 通常情况下内存只有一份. 可以说, 如果内存足够大, CPU的核心数量越多, 程序线程数越多, jemalloc的分配速度越快。

jemalloc解决方法是将一把global lock分散成很多与线程相关的lock。而针对多核心, 则要尽量把不同线程下分配的内存隔离开, 避免不同线程使用同一个cache-line的情况

jemalloc 按照内存分配请求的尺寸,分了 small object (例如 1 – 57344B)、 large object (例如 57345 – 4MB )、 huge object (例如 4MB以上)

jemalloc是一款通用的内存分配器,由FreeBSD社区开发,并逐渐被其他系统广泛采用。

jemalloc致力于提供高度可扩展性和低碎片化的内存分配。

它使用了多个技术,如分离的内存区域、伙伴分配器、线程本地缓存等。

jemalloc还提供了高级特性,如背景线程执行释放、空间利用统计和分析等。

多线程下加锁大大减少

特别声明:[【七彩虹教育】Linux操作系统内存分配方式(成都七彩虹教育)] 该文观点仅代表作者本人,今日霍州系信息发布平台,霍州网仅提供信息存储空间服务。

猜你喜欢

长得漂亮却做尽坏事,后被切除四个器官,小十五岁老公也出轨(长的漂亮没用)

即使在缓刑期,她依旧没有戒断毒品,这不再是胆量的问题,而是完全失去了对生命的敬畏和对自我的控制。 身体是最诚实的账本📒,它不会容忍你一次又一次地透支。接连曝出的诈骗案和性侵丑闻,如同一记记响亮的耳光,狠狠打…

长得漂亮却做尽坏事,后被切除四个器官,小十五岁老公也出轨(长的漂亮没用)

『周也』出征巴黎『迪奥』大秀——毛绒领里的一抬眸,把“冬日晚霞”穿在了身上(『周也』 lv)

26日,『周也』在微博甩出一组“神图”九宫格,坐标巴黎,寒意未退的塞纳河畔瞬间升温——原来,美真的可以自带暖气。镜头定格第一秒:她裹着奶油白毛绒领外套🧥,领口蓬松到像把一团云披在肩上,衬得一张小脸只有巴掌大。 …

『周也』出征巴黎『迪奥』大秀——毛绒领里的一抬眸,把“冬日晚霞”穿在了身上(『周也』 lv)

女性♀️肾不好有哪些症状(女性♀️肾不好有什么)

腰酸腿痛可能是因为肾精亏虚导致内分泌失调,雌激素分泌减少,钙质吸收减少并流失,骨骼得不到充分滋养而出现的症状。肾主生殖,肾虚时女性♀️的泌尿生殖系统功能失常,可能会引起月经不调、月经过多等问题

女性♀️肾不好有哪些症状(女性♀️肾不好有什么)

『赵丽颖』和赵德胤分手了?男方与前女友复合拍新片,一切早有迹可循(赵德胤)

因为 2025 年上半年她虽然有电影播出,然而都没有收获很好的成绩。所以很多人就觉得『赵丽颖』应该是和赵德胤没有关系了,但其实当时都只是绯闻而已。 很多人觉得『赵丽颖』好像现在演技来到了瓶颈期,因为 2026 年…

『赵丽颖』和赵德胤分手了?男方与前女友复合拍新片,一切早有迹可循(赵德胤)

月经量少慌兮兮 关于受孕真相你一定要知道(月经量少慌兮兮的正常吗)

  月经是女性♀️周期的重要生理现象,它不仅反映着女性♀️生殖系统的健康状况,还与受孕能力有着千丝万缕的联系。当月经量减少时,不少备孕女性♀️会心生担忧:月经量少到底能不能受孕呢?这个问题不能简单地给出肯定或否定的答案,需要深入了解月经量少的原因及其对

月经量少慌兮兮 关于受孕真相你一定要知道(月经量少慌兮兮的正常吗)