- 论坛徽章:
- 0
|
线程虚拟空间的碎片是指空间被划分成了很多不连续的空间导致不能找到一块连续的空间, 因为用户空间的地址范围很大, 所以这种几乎不可能出现.
用户态的malloc/free是基于libc做的, 一般来说libc会批发一块内存当做自己的缓存, 一般不会发生频繁地分配释放导致内存碎片的现象, 除非频繁分配的数据一会儿很大一会儿很小触发到了内核中再分配动作.
不管是用户态要内存要是内核要内存, 归根到底是要调用到kmalloc来分配一块连续的物理页映射给虚拟地址区间, 用户态空间的内存没有物理上连续空间的要求可以调用vmalloc.
物理内存是由伙伴系统管理的, 当你把内存打碎, 某些动作又要分配连续的物理页比如线程的PCB, 这时就会出现分配失败, 但其实是有内存的. 一般是在内存相当紧张的时候又频繁地动态分配时发生, 特别是内核中的某些ko直接调用kmalloc扰乱了内核分配器, 用户态的malloc理论上也会扰动到内核分配器, 但毕竟有个libc的缓冲.
很多tcmalloc或者ptmalloc这样的库,已经实现了freelist管理内存块的功能,为什么还要使用自己定义的内存池,这不是重复工作嘛??
这是重复工作, 但是自己定义内存池仍然有意义, 因为并不是所有人都明白tcmalloc工作原理, 它到底在什么时候会向内核申请或者释放你判断不出来, 你不能预测它对cpu和其他空闲内存会在何时会造成怎样的干扰, 而在某些苛刻的条件下, 自己控制是有益的, 必须要求内存固化线程池化好对资源有个精确的控制, 否则你会发现cpu莫名其妙地冲高, oom不断. |
|