共享内存多处理器计算机包含多个处理器。每个处理器均可访问计算机中的所有内存。在某些共享内存多处理器中,内存体系结构使每个处理器访问某些内存区域的速度快于访问其他区域的速度。因此,向访问内存的处理器分配其附近的内存,可以缩短延迟和提高应用程序性能。
Oracle Solaris 操作系统引入了地址组 (locality group, lgroup) 摘要,它属于 MPO 功能的一部分。lgroup 是一组类似处理器和类似内存的设备,在此类设备中,组中的每个处理器都可在有限的延迟间隔内访问该组中的任何内存。库 liblgrp.so 导出应用程序的 lgroup 摘要,以便进行观察和性能调优。应用程序可以使用 liblgrp.so API 执行以下任务:
遍历组分层结构
搜索给定 lgroup 的内容和特征
影响 lgroup 的线程和内存定位
缺省情况下,Oracle Solaris 操作系统尝试从线程的主 lgroup 为线程分配资源。例如,缺省情况下,操作系统会尝试调度线程在线程主 lgroup 中的处理器上运行,并在线程的主 lgroup 中分配线程的内存。
以下机制可用于发现和影响与 lgroup 有关的线程和内存定位方式:
meminfo() 系统调用可用于发现内存定位方式。
lgrp_home() 函数可用于发现线程定位方式。
通过设置线程与给定 lgroup 的关联性,lgrp_affinity_set() 函数可以影响线程和内存定位方式。
标准 C 库中的 madvise() 函数用于提醒操作系统:用户虚拟内存的区域遵守特定的使用模式。传递给 madvise() 的 MADV_ACCESS 标志用于影响 lgroup 之间的内存分配。例如,使用 MADV_ACCESS_LWP 标志调用 madvise() 将提醒操作系统:下一个访问指定地址范围的线程将是访问内存区域最多的线程。操作系统将放置与此范围对应的内存并会相应地放置线程。
有关 lgroup API 的更多信息,请参阅Oracle Solaris 11.3 Programming Interfaces Guide 中的第 4 章 Locality Group APIs。有关 madvise() 函数的更多信息,请参见 madvise(3C) 手册页。