我刚开始研究多核架构并且有一个问题。 我有一个测试应用程序,它将线程数作为参数,创建这些线程,设置亲和力(借助sched_setaffinity),然后在每个线程任务中都有一个繁忙的循环(while(1))。 我正在使用带有4个处理器的Fedora 19 VM(3.11.9-200.fc19.x86_64)。现在,当我创建4个线程时,将它们的关联设置为4个不同的处理器,CPU利用率不均匀。 就像,
PID用户PR NI VIRT RES SHR S%CPU%MEM TIME + COMMAND
2113 root 20 0 0 0 0 R 92.90 0.000 18:22.91 multicoretest
2114 root 20 0 0 0 0 R 92.23 0.000 18:07.29 multicoretest
2112 root 20 0 0 0 0 R 49.28 0.000 9:41.48 multicoretest
2111 root 20 0 0 0 0 R 48.61 0.000 9:42.17 multicoretest
2110 root 20 0 0 0 0 Z 0.000 0.000 0:00.00 multicoretest
任何人都可以给我一个解释,为什么第3和第4核心没有前两个核心那么繁忙,尽管它们具有相同的线程功能?
这真的会有很大的帮助。
由于
答案 0 :(得分:3)
我至少可以想到这种行为的几个可能原因:
您的程序不是唯一执行的程序。任何其他程序以及操作系统本身都使用处理器,这可能不允许程序充分利用可用的CPU功率。即使设置了CPU亲和性,进程调度程序仍然会影响线程可用的CPU时间。
CPU核心是虚拟的,因此不是完全独立的。例如,英特尔处理器中的hyper-threaded cores共享其大多数物理逻辑网络。由于您的任务既简单又完全相同,因此在同一物理核心上执行的线程将争夺其资源。