1. 什么式内存分配以及内存碎片
内存分配是虚拟内存分配vma,虚拟内存在内核是一个连续的空间(这里内核只是管理vma的其实地址和结束地址,所以占用很小)。在运行过程中mmap时,由于虚拟内存各个线程式共享的,所以分配vma会加锁,在多线程中表现不佳。第二,在长期运行过程中,vma导致碎片会,在分配中,查找vma可用gap的时间可能很长,最坏时间时o(n), 同时也会引起vma红黑树的深度增加,查找,删除,增加时长增加。所以减少内存碎片在提高性能和内存利用率十分重要。 同时由于碎片导致页表项变大,tlb miss概率变大,导致内存访问速度降低。
2. 减少内存碎片
ptmalloc和jemalloc内存管理器通常的解决思路:自己管理内存,根据分配的内存大小,把管理器分成阶梯大小的内存管理器,比如2,4,8,...字节进行管理,分配的时候,按照best-fit在对应的阶段块分配内存,这样做的好处基本减少了内存碎片,而且是个通用的管理内存方法,但是内存利用率相对较低。
slab的解决思路:在内核中,内存分配基本是一样的,比如各类文件系统的分配,大小相同,opt成员大部分一样。使用malloc的思路可以解决内存碎片问题,但是初始化成本很高。slab利用专有的这类场景,管理自身的缓存池,避免成员大量重复的初始化。
附录:
1. mmap源码分析 mmap内核源码分析,基于内核版本3.10(二)_SweeNeil-CSDN博客
2. malloc内存管理 内存优化总结:ptmalloc、tcmalloc和jemalloc | bhpike65