如何在 OS X 上设置处理器亲和性?

如何在 OS X 上设置处理器亲和性?

如何在 MacBook Pro 上的 Snow Leopard 中设置处理器亲和性?我知道在 Windows 中您只需在任务管理器中切换它即可。

答案1

OS X 支持线程亲和性API自 10.5 版以来。以下是我链接到的网页上的一些相关材料。

亲和力集

亲和性集是共享内存资源并希望共享二级缓存的线程的集合。不同的亲和性集代表不同的亲和性 — 也就是说,属于不同集的线程应使用单独的二级缓存,因此应在不同的逻辑处理器上运行。

亲和性集由“标签”标识。通过为线程分配标识该集的标签,可以将线程分配到特定的亲和性集。一个线程最多可以属于一个亲和性集;也就是说,它有一个亲和性标签。

设置不同亲和性标签的效果

例如,如果应用程序想要在单独的 L2 缓存上运行 2 个线程,则应为这些线程设置不同的关联标签。在双核机器上,此关联标签实际上将被忽略。但是,在 4 核 MacPro 上,调度程序将尝试在单独的程序包上运行线程。同样,在 8 核 MacPro 上,调度程序将尝试在单独的芯片上运行这些线程(这些芯片可能位于同一物理 CPU 程序包中,也可能不位于同一物理 CPU 程序包中)。

示例用法

想要在每个可用处理器上放置一个线程的应用程序将执行以下操作:

  • 使用 sysctl(3) 获取系统上的处理器数量。
  • 创建该数量的线程。
  • 为每个线程设置不同的亲和力标签。
  • 启动所有线程。

具有默认亲和性策略的线程将在任何处理器上更自由地调度。这些线程将优先迁移到空闲处理器上运行。具有亲和性标记的线程将倾向于留在原地。

查阅源代码以获取代码列表以及有关父子进程之间共享亲和标签、获取 CPU 缓存配置等的信息。

答案2

http://developer.apple.com/mac/library/releasenotes/Performance/RN-AffinityAPI/

Mac OS X 不导出识别处理器或控制线程放置的接口——不支持显式线程到处理器的绑定。相反,内核管理所有线程布局。应用程序期望调度程序在大多数情况下使用与缓存亲和性相关的良好处理器布局来运行其线程。

答案3

到目前为止,XNU(1504.3.12)调度程序还没有实现对进程和线程的处理器亲和性。

所以 MacOSX 没有提供任何方法来实现这一点。

答案4

http://images.apple.com/macosx/docs/OSX_for_UNIX_Users_TB_July2011.pdf

• 高效的内核线程。每个 POSIX 线程都排队到特定的 CPU,从而提高处理器亲和性和可扩展性,同时减少锁争用。线程符合 POSIX (1c),包括对取消和共享互斥的支持。

对我来说这看起来像是广告,我的运行 Lion 的 iMac 大部分时间都尊重这一点,但它不会将进程“固定”到核心。

无论如何,我找不到任何 API 来控制 darwin 的进程亲和性。

相关内容