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

问题描述 投票:0回答:2

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

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

  1. 胎面t1和t2可以和进程P运行在相同的存储空间上吗?
  2. 线程t1是否可以在与运行进程P不同的内核中执行?例如:进程P在核心C1上运行,线程t1在核心C2上运行?
linux multithreading operating-system multiprocess
2个回答
1
投票

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

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

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

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

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

此问题没有道理。

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

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

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

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

(来自Wikipedia。]

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


0
投票

通常,这取决于在操作系统调度程序中如何实现线程。

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

如果实施了严格的电源管理,则调度程序可能选择在唤醒空闲的内核之前等待一两秒钟,如果已经运行的内核释放出来,则可以节省很多时间。

© www.soinside.com 2019 - 2024. All rights reserved.