同一进程的线程可以运行在不同的核心上吗?

aja*_*aja 4 linux multithreading operating-system multiprocess

进程产生的线程可以在多核系统的不同核心上运行吗?

假设我有一个进程 P,从中生成了两个线程 t1 和 t2,它是一个具有两个核心 C1 和 C2 的多核系统。我的问题是:

  1. t1 和 t2 是否可以与进程 P 运行在同一内存空间上?
  2. 线程 t1 是否可以在与进程 P 运行的不同内核中执行?例如:进程 P 运行在核心 C1 上,线程 t1 运行在核心 C2 上?

Ste*_*n C 7

进程产生的线程可以在多核系统的不同核心上运行吗?

是的。假设硬件有多个核心,并且操作系统支持/允许。(现代操作系统确实支持它。是否允许通常取决于管理策略。)

线程 t1 和 t2 会与进程 P 运行在同一内存空间吗?

是的。他们将使用相同的内存/虚拟地址空间。

线程 t1 是否可以在与进程 P 运行的不同内核中执行?例如,进程P运行在核心C1上,线程t1运行在核心C2上?

这个问题没有意义。

POSIX 进程没有执行代码的能力。执行代码的是进程线程。因此,“进程在核心 C1 上运行”的想法是荒谬的。

请记住:每个(实时)POSIX 进程至少有一个线程。该进程从一个线程开始,如果需要,该线程可以生成其他线程。线程到核心的实际分配是由操作系统完成的,并且会随着进程的生命周期而变化。

这就是线程在现代操作系统中的工作方式。对于 Linux,当前(符合 POSIX 标准)线程实现方法是在 2003 年的 Linux 2.6 中引入的。在 Linux 2.6 内核之前,Linux 没有真正的本机线程。相反,它有一个名为 LinuxThreads 的工具:

“LinuxThreads 存在许多问题,主要是由于实现方式,它使用clone系统调用来创建共享父进程地址空间的新进程。例如,线程具有不同的进程标识符,导致信号处理出现问题;LinuxThreads 使用信号 SIGUSR1 SIGUSR2 用于线程间协调,这意味着这些信号不能被程序使用。”

(来自维基百科。)

在(2003 年之前!)LinuxThreads 模型中,“线程”实际上是一个进程,进程可以与其他进程共享其地址空间。