gpt4 book ai didi

linux - 为什么系统监视器不显示正确的 CPU 关联性?

转载 作者:太空宇宙 更新时间:2023-11-04 04:07:39 26 4
gpt4 key购买 nike

我搜索了有关 CPU 亲和性的问题/答案并阅读了结果,但我仍然无法让我的线程锁定单个 CPU。

我正在开发一个将在专用 Linux 机器上运行的应用程序,因此我不关心其他进程,只关心我自己的进程。该应用程序当前生成一个 pthread,然后主线程进入 while 循环以使用 POSIX 消息队列处理控制消息。这个 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 中运行的证据,这是错误的吗?或者我是否忘记做更多的事情来让它按我的预期工作?

谢谢

-安德烈斯

最佳答案

你没有答案,我会尽我所能:一些部分帮助

假设您检查了 pthread_setaffinity_np 的返回值:

如何分配 cpuset 非常重要,在主线程中创建它。为了你想要的。它将传播到连续的线程。您检查返回码了吗?

您实际获得的 cpuset 将是硬件可用 cpu 与您定义的 cpuset 的交集。下面代码中的 min.h 是通用构建包含文件。您必须定义_GNU_SOURCE - 请注意代码最后一行的注释。 CPUSETCPUSETSIZE 是宏。我想我在其他地方定义了它们,我不记得了。它们可能位于标准 header 中。

#define _GNU_SOURCE
#include "min.h"
#include <pthread.h>


int
main(int argc, char **argv)
{
int s, j;
cpu_set_t cpuset;
pthread_t tid=pthread_self();

// Set affinity mask to include CPUs 0 & 1

CPU_ZERO(&cpuset);
for (j = 0; j < 2; j++)
CPU_SET(j, &cpuset);

s = pthread_setaffinity_np(tid, sizeof(cpu_set_t), &cpuset);
if (s != 0)
{
fprintf(stderr, "%d ", s);
perror(" pthread_setaffinity_np");
exit(1);
}
// lets see what we really have in the actual affinity mask assigned our thread

s = pthread_getaffinity_np(tid, sizeof(cpu_set_t), &cpuset);
if (s != 0)
{
fprintf(stderr, "%d ", s);
perror(" pthread_setaffinity_np");
exit(1);
}

printf("my cpuset has:\n");
for (j = 0; j < CPU_SETSIZE; j++)
if (CPU_ISSET(j, &cpuset))
printf(" CPU %d\n", j);
// @Andres note: any pthread_create call from here on creates a thread with the identical
// cpuset - you do not have to call it in every thread.
return 0;
}

关于linux - 为什么系统监视器不显示正确的 CPU 关联性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20535789/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com