首页 > 解决方案 > 将特定逻辑核心专门分配给特定进程、Windows、C++

问题描述

如果可能的话,我确实希望将逻辑核心专门分配给单个进程。

我知道 Winbase.h 包含 Get/SetProcessAffinityMask 和 SetThreadAffinityMask。

我可以在启动特定进程时让所有进程运行并将它们的亲和性设置为其他逻辑核心,但是,我不想定期检查所有进程,例如为了处理在我的启动后启动的进程过程。

此外,还有其他进程只需要专门使用特定的逻辑核心(其他进程不得在该逻辑核心上浪费资源)。例如,我的进程应在核心 15 上运行,但另一个进程应仅在核心 14 上运行。

有没有比上面提到的 Get/SetProcessAffinityMask 方案更好、更持久的方法来为特定进程分配特定的逻辑核心。

标签: c++windowsmultithreading

解决方案


Windows 不是实时操作系统。Windows 旨在通过隔离进程执行抢先式多任务处理,就像基本上任何其他现代桌面操作系统一样。一个进程不应该仅仅锁定来自特定核心的所有其他进程,因此,没有 API 可以明确地这样做(至少我不知道有一个)。由操作系统调度程序决定何时何地运行哪些线程。这就是整个想法。您可以使用线程优先级告诉调度程序某些线程应该有机会超越其他线程。您可以使用关联掩码告诉调度程序可以将线程调度到哪些内核。您甚至可以为您的线程设置首选核心。但是你不能自己安排线程。

请注意,显然有一种方法可以让您在 Linux 上工作的东西有点像您正在寻找的东西(有关更多信息,请参阅此问题)。我认为 Windows 上不存在类似的可能性。是的,您可以尝试基于后台任务组合一些解决方案,该任务持续监控和调整系统中所有线程的优先级和亲和掩码以接近所需的行为(如上面 Ben Voigt 链接的问题中的人显然已经尝试过,但未能实现)。但是你为什么要这样做呢?它完全违背了像 Windows 这样的操作系统旨在做的一切事情的本质。对我来说,您所问的听起来很像您真正要寻找的是一种完全不同的操作系统,甚至可能根本没有操作系统。将 CPU 直接启动到您自己的映像中,您就可以以任何您喜欢的方式驱动所有内核……


推荐阅读