现在 Python 中内存分配的最核心组件 pool 的工作原理大致清楚了,在 Python 中存在很多 pool,每个内存池内部有有大小相同的 block,不同内存池的 block 尺寸可能不同。
那么下来就有一个问题了,内存池是按照 block 划分的,一个 block 要么是通用内存,要么是 freeblock 链表节点,通用内存中没有看到任何有关 pool 的相关信息啊!一块通用内存是如何找到它的组织————pool 呢?
其实 pool 的内存被对齐到内存分页位置,即 pool 的地址都是形如 FFFF F000, 低 3 字节均为 0,那么任意内存地址按位与 FFFF F000 , 截断地址的低 3 字节,就可以得到 pool 在内存中的位置。这一点在稍后介绍 arenas 的时候会看到。
这是一种非常巧妙的做法,内存池都是 4k 整数倍的地址,一块通用内存的地址本身就隐含了 pool 的信息。 接下来就是将这块 block 添加到 pool 的 free block 链表,主要的内存 “释放” 工作就结束了。