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

时间:2020-03-15 16:05:06

标签: linux multithreading operating-system multiprocess

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

比方说,我有一个进程P,从中产生了两个线程t1和t2,它是一个具有两个内核C1和C2的多核系统。我的问题是:

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

2 个答案:

答案 0 :(得分:1)

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

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

线程t1和t2是否与进程P在相同的内存空间中运行?

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

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

这个问题没有道理。

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

请记住:每个(活动的)POSIX进程都有至少一个线程。该过程从一个线程开始,并且该线程可以根据需要生成其他线程。线程到内核的实际分配是由操作系统完成的,并且会在进程的整个生命周期内发生变化。

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

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

(来自Wikipedia。)

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

答案 1 :(得分:0)

通常,这取决于操作系统调度程序中线程的实现方式。

也就是说,我所知道的所有现代OS都将明确地尝试以某种方式分配线程,以便在上下文切换的成本和良好的并行性之间取得良好的平衡。这意味着,如果至少有一个空闲核心,并且没有功率限制/功率消耗/功率保存模式处于活动状态,则等待线程将被调度到空闲核心。

如果实施了严格的电源管理,则调度程序可能会选择等待一两个滴答声,然后再唤醒空闲的内核-如果已经运行的内核释放出来,则可以节省很多精力。