由于 Python 的致命弱点之一是 GIL,因此有更好的多进程支持。例如有队列、管道、锁、共享值和共享数组。还有一种称为管理器的东西,它允许您包装大量 Python 数据结构并以 IPC 友好的方式共享它们。我想大多数这些都是通过管道或套接字工作的,但我并没有深入研究内部结构。
http://docs.python.org/2/library/multiprocessing.html
Linux 如何为 NUMA 系统建模?
内核检测到它在多核机器上运行,然后检测有多少硬件以及拓扑是什么。然后它使用节点的想法创建此拓扑的模型。节点是一个物理插槽,包含一个 CPU(可能具有多个内核)和连接到它的内存。为什么基于节点而不是基于核心?因为内存总线是将 RAM 连接到 CPU 插槽的物理线路,并且单个插槽中 CPU 上的所有内核对驻留在该内存总线上的所有 RAM 具有相同的访问时间。
一条内存总线上的内存如何被另一条内存总线上的内核访问?
在 x86 系统上,这是通过缓存。现代操作系统使用称为转换后备缓冲区 (TLB) 的硬件将虚拟地址映射到物理地址。如果缓存的任务是获取的内存是本地的,则它会在本地读取。如果它不是本地的,它将通过 AMD 系统上的 Hyper Transport 总线或 Intel 上的 QuickPath 到达远程内存以满足需求。由于它是在缓存级别完成的,因此理论上您不需要了解它。你当然无法控制它。但是对于高性能应用程序来说,理解最小化远程访问的数量是非常有用的。
操作系统实际上在哪里定位虚拟内存的物理页面?
当一个进程被分叉时,它会继承它的所有父页面(由于 COW)。内核知道哪个节点对于它是“首选”节点的进程是“最佳”的。这可以修改,但再次默认为与父级相同。内存分配将默认为与父节点相同的节点,除非它被显式更改。
是否存在移动记忆的透明过程?
不会。一旦分配了内存,它就会固定在分配它的节点上。您可以在另一个节点上进行新的分配,移动数据,然后在第一个节点上解除分配,但这有点麻烦。
有没有办法控制分配?
默认是分配给本地节点。如果您使用 libnuma,您可以更改分配的完成方式(例如循环或交错),而不是默认为本地。
我从这篇博文中获取了很多信息:
http://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/
我绝对建议您完整阅读它以收集更多信息。