不同的 CPU 访问不同地址主存的速度各不相同,我们把采用这种设计的内存叫做非一致性访存(Non-uniform memory access,NUMA)。
物理内存最重要的三个部分是:
- 从 640K(0xa0000)到 1M(0xfffff)区间,是被 ISA 设备的 RAM 和 ROM 占据的;
- 从 1M 开始才是主存(System RAM)
- 物理内存的最后 256M(0xf0000000 到 0xffffffff)保留给了 PCI 设备,用于 IO 内存映射。
IO 端口主要用于状态读取和设置等控制命令的通讯,而 IO 内存映射主要用于大量的数据传输。
一致性是指,同一个 CPU 对所有内存的访问的速度是一样的,因为物理内存是连续且集中的。而非一致性是指,内存在物理上被分为了多个节点 node,CPU 可以访问所有节点,但是为了提升访问效率,CPU 可以有选择地优先访问离自己近的内存节点。
NUMA 在扩展时只需要关注 CPU 之间的连接,不占用总线带宽,自然就成为现代处理器的选择。
绑核的意思就是将进程的运行环境和特定的 CPU 组,内存节点捆绑在一起。实际应用中,我们可以根据自身需求,调整绑核策略,来提升应用程序的性能。
内存分配策略:
libnuma 是一套封装了 NUMA 相关操作的共享库,目的是为开发者提供一套绑核操作的 API。使用也非常简单,只要在源码文件中引入相应的头文件,并且在编译时加入链接选项。就可以进行使用了。可以采用libnuma所提供的API来自主控制NUMA策略。
此文章为7月Day17学习笔记,内容来源于极客时间《编程高手必学的内存知识》