linux - 在几个核心上运行进程

时间:2014-08-19 18:21:14

标签: linux multithreading

我对内核,进程和线程的工作方式存在误解:

  • 进程有线程数。
  • 所有这些线程共享相同的内存部分
  • Core拥有自己的缓存和内存地址空间。

因此,当我在Linux操作系统上运行一个进程(包含多个线程)时,检查" top -H"命令,我可以看到线程分布在多个核心上。

那么它如何运作? (相同进程的线程,共享相同的进程地址空间,在不同的内核上运行?)?

我想念的是什么?

由于

2 个答案:

答案 0 :(得分:4)

Linux内核调度程序正在安排任务。请参阅this answer一个几乎相同的问题,该问题解释了哪些任务。

任务可以在某个单核上运行(在给定时刻)。调度程序可以将任务从一个核心移动到另一个核心(但很少这样做,因为预热核心及其L1缓存需要时间)。

多线程进程通常有几个任务(每个线程一个),通常可以在多个核心上运行。

你可能应该避免每个进程有大量的线程。我建议最多十几个线程,特别是如果它们中的一些是可运行的(但细节因硬件和系统而异)

另请阅读processor affinity

答案 1 :(得分:1)

每次操作系统将CPU切换到另一个线程时,它都会为该线程设置CPU上的所有寄存器。这包括当前堆栈,内存访问权限,所有这些。

因此,当同一进程的两个线程在两个不同的CPU内核上运行时,每个内核都设置为访问该进程内存。

当操作系统确定其中一个线程占用了太多CPU时间时,它会挂起线程并将所有CPU寄存器复制到内存中。然后它将另一个线程加载到CPU内核中。