【发布时间】:2013-12-30 09:48:52
【问题描述】:
我已经搜索了有关 CPU 亲和性的问题/答案并阅读了结果,但我仍然无法让我的线程确定单个 CPU。
我正在开发一个将在专用 linux 机器上运行的应用程序,因此我不关心其他进程,只关心我自己的进程。此应用程序当前产生一个 pthread,然后主线程进入一个 while 循环,以使用 POSIX msg 队列处理控制消息。这个while循环阻塞等待控制消息进入然后处理它。所以主线程非常简单且非关键。我的代码运行良好,因为我可以发送这个应用程序消息,它会很好地处理它们。所有控制消息的大小都非常小,仅用于控制应用程序的功能,也就是说,只有少数控制消息被发送/接收。
在进入这个 while 循环之前,我使用 sched_getaffinity() 来记录所有可用的 CPU。然后我使用 sched_setaffinity() 将此进程设置为单个 CPU。然后我再次调用 sched_getaffinity() 来检查它是否设置为仅在一个 CPU 上运行并且确实正确。
生成的单个 pthread 执行类似的操作。我在新创建的 pthread 中做的第一件事是调用 pthread_getaffinity_np() 并检查可用的 CPU,然后调用 pthread_setaffinity_np() 将其设置为不同的 CPU,然后调用 pthread_getaffinity_np() 以检查它是否按需要设置并且确实如此正确。
这是令人困惑的。当我运行应用程序并在系统监视器中查看 CPU 历史记录时,我发现与运行应用程序时没有所有这些设置的关联性内容没有区别。调度程序仍然在这个四核机器上的 4 个 CPU 中的每一个中运行几秒钟。因此,调度程序似乎忽略了我的亲和力设置。
我期望看到一些证据证明主线程和 pthread 实际上是在它们自己的单个 CPU 中运行,我错了吗?还是我忘了做更多的事情来让它按我的意图工作?
谢谢,
-安德烈斯
【问题讨论】:
标签: linux multithreading pthreads