上下文切换、页表与 TLB
线程比进程轻,轻在切换之后 TLB 和缓存还能接着用,不在切换本身。TLB 没有 MESI:同一个进程里任何一个线程改了页表,此刻还装着这份页表的核都要被打断一次,绑核和 isolcpus 挡不住,所以热路径进程跑起来以后地址空间只读不改。
标签
2 篇
线程比进程轻,轻在切换之后 TLB 和缓存还能接着用,不在切换本身。TLB 没有 MESI:同一个进程里任何一个线程改了页表,此刻还装着这份页表的核都要被打断一次,绑核和 isolcpus 挡不住,所以热路径进程跑起来以后地址空间只读不改。
这篇里的每一种技术,都是在不同的层面上做同一件事:把一个不确定的、牵涉内核的操作从热路径上挪走,强制它在开头一次性发生完,不让它伏击任何一个请求。对象池用永远 O(1) 的空闲链表,换掉 malloc 那种耗时可变的搜索。mlockall 加上仔细的 mallopt 调优,阻止内核悄悄把页收回——预先缺页则补上 mlock 单独留下的那个口子。手写的 arena 分配器让 STL 本身配合一个由 bump 指针内存支撑的自定义分配器。std::pmr 用标 …
