全新分配库:

​tcmalloc​​和​​jemalloc​​,是10年前的技术,比​​林操​​默认的​​ptmalloc​​快.​​je​​在分配​​4~8kb​​时实际分配​​8kb​​,浪费.​​tc​​内部有​​80​​多个大小分类,折腾.同时为了支持​​大页​​如​​2m/1g​​分配.大型软件需要​​大页​​分配.目标是​​全自动​​.更小更稳定的​​申请/释放​​内存时间.​​ns​​级返回可用内存块,不调用​​sbrk()和brk()​​,而是用​​mmap()​​方式.最好​​16字节对齐​​,对​​sse​​更友好.

技术方案:​​位图​​+​​首适/下适​​,调用​​释放​​后,下次​​首适​​,可重新利用释放掉内存.再次分配相同内存时,用​​下适​​.取消​​链表​​,用​​向量​​(连续的).

位图,就是​​搜索连续的0​​,释放时​​自动合并​​,这样​​碎片小,合并数据块性能极高​​,连续多位搜索慢,用​​高速多位搜索​​(自己设计).​​ns​​检索.单​​位​​检索更快,​​192字节-->1位​​.

优化手段:​​预取内存,cpu多发射性,优化设计缓存行,将数据集中到缓存行中,尽量在L1中跑,尽量用短,优化读写缓存行,汇编优化(用sse加速处理)​​,​​tlb(页表缓存)​​,放弃​​优化numa​​.

分配实现:用​​mmem​​,​​1g~2m~4k​

用户层:用线程局部​​thread_local​​用于分配​​<2M​​内存,这一层​​分配​​,均​​无锁​​.共​​16​​种类型,均​​位图​​.​​0~14​​为小内存.单次申请最大​​63b​​,分配​​16kb​​以下内存,主内存从​​15​​类型分配,每个子块​​512b​​,刚好一个​​缓存行​​.每种类型,同时拥有​​N​​块.​​15​​是​​N*4k​​,​​从4k到2m-32kb​​,使用​​查询跳表​​.

​位图​​支持​​自动复合利用​​.

​多线程​​中:​​tls,无锁队列/无锁释放​​,​​2m以下不需要锁​​.跨线程释放不需要锁.直接送达对方​​无锁队列​​.​​内部分配​​比操作系统分配快​​百倍​​.用​​静态链接​​,因为​​动态​​链接有巨大的额外开销​​(12ns)​​.​​后台服务线程>16M​​开启,从操作系统申请​​2m​​,需要​​几百微秒​​,用后台,只需要​​ns​​时间,

清理​​无用缓存​​,后台线程判断​​不再复用​​内存,通知​​cpu​​清理垃圾.

内存页提前分配.如​​缺页再分配​​.都是先进行​​预处理​​,出现情况后,有对应处理方式.

import core.stdc.stdio : puts;

void main()
{
scope (exit) puts("Hello, World!");
throwError();
}

void throwError()
{
throw new Error("");
}

这是怎么回事?