将线程绑定到处理器

Ben*_*Ben 7 c linux multithreading pthreads

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

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

Mar*_*n B 17

使用sched_setaffinity(这是特定于Linux的).

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

  • @Ben:除非你编写了自己的操作系统,否则没有"比处理器更少的线程".系统上的其他内容不断地采用时间片,这可能会导致部分或全部线程被取消调度.当它们被重新安排时,它们最后运行的核心可能会也可能不会. (6认同)

P S*_*ved 8

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

taskset -c 0 -p PID
Run Code Online (Sandbox Code Playgroud)

使用PID将进程绑定到处理器(核心)编号0.

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