芝士
per-CPU 和 task迁移
在运行时每一个CPU在不同的slab上操作以避免争用;被一个CPU使用的slab的freelist通常被指为一个per-CPU freelist;当一个CPU分配object的时候会首先从它的per-CPU的freelist中分配一个slot,释放一个object分配器会确认这个object所属的slab,然后将其放到所属的slab上。(也就是说分配内存会直接从当前CPU的slab上分配,释放则是各回各家)
在多核系统中,每一个CPU维护一个它的per-CPUyunxingduilie并且在运行队列中记录运行负载;当CPU的运行负载不平衡时,内核就会将一些任务从超负荷的CPU中迁移到其他CPU中,如果发生了迁移,那么后边分配的内存就会和前边分配的内存不属于同一个slab了,那么其地址很可能就不是连续的了。
CPU亲和性
CPU亲和性就是一个特定的任务要在某个给定的CPU上尽可能的长时间运行而不被迁移到其他处理器的倾向性,这也意味着进程或者线程不必在多个处理器之间频繁迁移。
对于每一个进程或者线程,使用task_struct中的cpus_allowed位掩码来表示,查看内核源代码:https://elixir.bootlin.com/linux/v6.13.1/source/include/linux/sched.h
do_set_spus_allowed函数定义位置为:https://elixir.bootlin.com/linux/v6.13.1/source/kernel/sched/core.c#L2752
其源代码如下: