进程是否绑定到内核?

vol*_*gas 2 linux process

假设我有一个有很多内核的 CPU。给定的进程一旦启动,是否绑定到其中一个核心?

这是否意味着即使有多个未使用的内核,进程也会变得缓慢?例如,core0 正在被进程 A 和 B 使用,进程 A 正在使用 100% 的核心,而进程 B 无法运行,即使 core1 是完全空闲的。

这样对吗?

roa*_*ima 5

进程本质上并不绑定到内核。每当一个进程被调度执行时,它可以由其亲和列表中的任何内核执行。如果未明确设置关联列表,则进程可以在任何核心上运行。

您可以使用该taskset命令检查或设置进程的亲缘关系集(请参阅man taskset其文档)。特别是,它写道,

Linux 调度程序将遵守给定的 CPU 关联性,并且该进程不会在任何其他 CPU 上运行。请注意,Linux 调度程序还支持自然 CPU 亲和性:出于性能原因,调度程序尽可能将进程保持在同一 CPU 上。因此,强制特定的 CPU 关联仅在某些应用程序中有用。

例子

sleep 1000 & slpid=$!
echo "PID of sleep is $slpid"            # 5221

taskset --pid $slpid
pid 5221's current affinity mask: 3      # bitmask

taskset --cpu-list --pid $slpid
pid 5221's current affinity list: 0,1    # list of potential cores

taskset --cpu-list --pid 0 $slpid
pid 5221's current affinity list: 0,1
pid 5221's new affinity list: 0          # bound now only to core 0

kill $slpid                              # all done, tidy up
Run Code Online (Sandbox Code Playgroud)