我希望在具有严格关联规则的应用程序中添加对 CPU 热插拔的支持。每个物理核心都固定有一个线程,但我用于将线程固定到 CPU 的逻辑相当幼稚,如果 0..N 之间的 CPU 离线,则会失败。
我选择了一种方法,其中我有一个 size 数组,MAX_CPU
系统上的每个 CPU 通过其标识符映射到一个插槽。例如,CPU0 ->threads[0]
和 CPU1 ->threads[1]
等等。这个想法是反映系统的设置。
for (i = 0; i < N; ++i)
set_affinity(threads[i], i);
但是,如果在任何地方遇到离线 CPU,它就会失败。
更糟糕的是,当 CPU 在运行时脱机时,固定线程的关联掩码会在没有通知的情况下重置。
最终,我希望支持复杂的设置,例如:
CPU0 CPU1 CPU2 CPU3
ONLINE OFFLINE ONLINE OFFLINE
如何将在线和离线 CPU:s 的意识整合到我的应用程序中?
我正在避免/proc
并且/sys
因为我有兴趣移植到其他平台,特别是各种 BSD:s。我现在使用 x86_64,所以该cpuid
指令可能有用。