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

4

一个进程产生的线程能否在多核系统的不同核上运行?

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

  1. 线程t1和t2是否将在与进程P相同的内存空间上运行?
  2. 线程t1是否会在与进程P不同的核心上执行?例如:进程P正在核心C1上运行,而线程t1正在核心C2上运行?

请在每个帖子中只提出一个问题。这是该网站的规定。 - bolov
2个回答

6

进程生成的线程能否在多核系统的不同核心上运行?

可以。假设硬件具有多个核心,并且操作系统支持/允许此功能。(现代操作系统都支持它。是否允许通常取决于管理员策略。)

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模型中,“线程”实际上是一个进程,而一个进程可以与其他进程共享其地址空间。

2
一般来说,这取决于操作系统调度程序中线程的实现方式。话虽如此,我所知道的所有现代操作系统都会明确地尝试以某种方式分配线程,以实现上下文切换成本和良好并行性之间的良好平衡。这意味着,如果至少有一个空闲核心且没有激活电源限制/电源打盹/电源保护模式,则等待线程将被调度到空闲核心。如果存在严格的电源管理,调度程序可能会选择在唤醒空闲核心之前等待一两个滴答声-如果已经运行的核心释放,它可以节省大量电力。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接