1

可以在 linux 中为每个线程在每个内核上运行的多线程程序设置 cpu 亲和性,从而有效地阻止任何其他进程被该内核上的操作系统调度。实际上,我想保证在我的进程中使用一个核心,并将所有其他非关键程序绑定到最少数量的核心。

或者我是否缺少 linux 调度程序的某些内容,或者我需要自己的调度程序。

4

2 回答 2

4

可以在 linux 中为多线程程序设置 cpu 亲和性,其中每个线程在每个内核上运行有效地阻止任何其他进程被该内核上的操作系统调度

不,设置 cpu 亲和性会阻止调度程序为您的线程使用一些内核。也就是说,它只会在某些核心上安排你的线程——它不会对其他线程做任何事情。

您可能可以使用setpriority. 如果您的要求如此严格,您可能会考虑sched_setscheduler并选择SCHED_RRor SCHED_FIFO

于 2012-06-04T06:38:18.220 回答
1

当调度器积极参与时,taskset 和 nice 只会向调度器提示您的偏好。调度程序可以根据工作负载自由地重新调度任何可用内核上的任何线程。您可以使用perf来监控上下文切换和 cpu 迁移。

你有两个选择:

  1. 您可以按照 user417896 的建议强制调度程序通过 sched_setscheduler 遵循您的订单。
  2. 您可以使用 cgroups/cpuset 定义两个 cpuset,例如systemisolated,并通过将所有系统线程移动到系统cpuset 来隔离目标内核,并在隔离的 cpuset 上使用 cgexec 运行您的程序。您可以将内核和内存分配给一个 cpuset,并为了隔离它设置 cpu_exclusive 位,然后一切就绪。如果您使用较旧的内核为您自动执行此过程,您还可以使用 cset (http://code.google.com/p/cpuset/ )。

我希望它有所帮助。

于 2012-06-04T18:15:54.547 回答