将线程绑定到处理器

时间:2009-09-22 08:37:21

标签: c linux multithreading pthreads

当我运行多线程代码时,系统(linux)有时会将线程从一个处理器移动到另一个处理器。由于我拥有与处理器一样多的线程,因此没有充分理由使缓存失效,并且使我的跟踪活动混乱。

你知道如何将线程绑定到处理器,为什么系统会这样做?

2 个答案:

答案 0 :(得分:17)

使用sched_setaffinitythis is Linux-specific)。

为什么调度程序会在不同处理器之间切换线程?好吧,想象一下你的线程最后在处理器1上运行,并且当前正在等待再次安排执行。同时,当前在处理器1上运行不同的线程,但处理器2是空闲的。在这种情况下,调度程序将您的线程切换到处理器2是合理的。但是,复杂的调度程序将尽量避免在处理器之间“跳动”超过必要的线程。

答案 1 :(得分:8)

你可以用bash做到这一点。我在this问题中熟悉了一个很棒的taskset命令(您也可以找到关于调度程序应该如何在那里运行的有价值的讨论)。该命令接受进程的pid并将其绑定到特定的处理器。

taskset -c 0 -p PID

将进程与PID绑定到处理器(核心)编号0。

与线程有什么关系?为每个线程分配一个与pid具有相同权限的标识符,也称为“tid”。您可以使用gettid系统调用来获取它。或者你可以通过按 H top程序中观察它(某些进程会分裂成许多看似相同的条目,这些条目具有不同的pids ---那些是线程)。