在标准化无线通信板时,关注过程序占用ram的问题,当时 发现每一个线程都会分配8M栈空间,这次换rk3568后,偶尔看了下RAM占用,吓了一跳,不但每个线程有8M栈空间,几乎每个线程都占用了64MB的一个RAM未知空间,如下:
网上找了很多资料,也没弄清楚,我综合分析了下,猜了个大概,不一定确定。
Linux早期的堆分配与回收由Doug Lea实现,但它在并行处理多个线程时,会共享进程的堆内存空间。因此,为了安全性,一个线程使用堆时,会进行加锁。然而,与此同时,加锁会导致其它线程无法使用堆,降低了内存分配与回收的高效性。同时,如果在多线程使用时,没能正确控制,也可能引起内存分配和回收的正确
为了解决上述问题, globc-2.3.x之后,glibc中继承了ptmalloc2,堆会提前分配空间,每一个线程分配64MB空间,malloc会直接在此64MB空间内分配。提高速度、效率。
这种机制在多线程竞争锁激烈的场景下会带来一个问题:非主分配区开辟越来越多,因为它一旦开辟了就不会释放,一个分配区就是64MB。
在ptmalloc机制下,每个进程都有一个内存主分配区Main_arena和若干个非主分配区thread_arena,