线程的上下文切换和进程的上下文切换有什么区别?

3

我知道 这里 有一个关于这个问题的解释。但是我对其中的一些点还感到困惑 -:

假设我有线程 T(1-a) 和 T(1-b) 属于进程 P1,线程 T(2-a) 和 T(2-b) 属于进程 P2。

现在我的问题是 -:

  1. 线程 T(1-a) 想要进行上下文切换到线程 T(1-b)。根据 这个 回答,

    这两种类型(进程上下文切换和线程上下文切换)都涉及将控制权交给操作系统内核来执行上下文切换(我主要说的是线程上下文切换)。

疑问

如果 T(1-a) 和 T(1-b) 是用户级线程,则内核将无法区分 T(1-a) 和 T(1-b),那么如何进行上下文切换?

  1. 假设所有线程 T(1-a)、T(1-b)、T(2-a) 和 T(2-b) 都是内核级线程,如果线程 T(1-a) 想要上下文切换到 T(2-b)。

疑问

成本/延迟不会与进程上下文切换的成本/延迟相同,因为不仅虚拟内存空间会改变,而且 TLB 也会被清除吗?


1
线程切换意味着重新加载指向堆栈的寄存器,而进程切换还意味着重新加载所有虚拟内存机制。 - Alexei Kaigorodov
1个回答

4
这个问题的关键在于用户线程和内核线程是两种完全不同的实体。在术语的正常和惯常意义下,用户线程没有上下文切换。
无论是进程上下文切换还是线程上下文切换,都需要将控制权交给操作系统内核来执行上下文切换(我主要说的是线程上下文切换)。
我理解你的困惑。首先,这里描述的只适用于内核线程。其次,(这个问题显然是措辞问题而不是整体信息问题),在内核线程中,没有“进程上下文切换”,只有“线程上下文切换”。
在古老的时代,当没有线程时,调度的变化意味着进程上下文的变化。用于此目的的硬件指令具有诸如Load Process Context和Save Process Context之类的名称。但是,在安排线程(内核线程)的操作系统中,我们只剩下这个旧术语,它已经不再非常精确了。(在解释操作系统时,这是发生在许多地方的问题)。
如果T(1-a)和T(1-b)是用户级线程,则内核不知道也不关心它们。它们之间的切换由用户库处理。“线程”的切换不是上下文切换。
希望操作系统足够智能,知道在切换同一进程中的线程时不要清除内存缓存。
我相信学者们需要放弃内核/用户线程(甚至更糟糕的是1对1,多对1和多对多[yuk])构造。我建议使用术语“真正的线程”和“模拟线程”来代替。

“如果线程T(1-a)想要切换到T(2-b),那么代价/延迟不会和进程上下文切换的代价/延迟一样吗?因为不仅虚拟内存空间会改变,而且TLB也会被清除。” 我是在这个背景下提出这个问题的。 - laura
我在这里有些困惑。TLB是一个特定于系统的构造。希望操作系统在同一进程的线程之间切换时不会执行刷新。 - user3344003

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