线程上下文切换和进程上下文切换的区别

lau*_*ura 4 multithreading computer-science operating-system context-switch

我知道这里对这个问题有一个解释。但我对一些点有点困惑-:

令i有属于进程P1的线程T(1-a)和T(1-b)以及属于进程P2的线程T(2-a)和T(2-b)。

现在我的问题是——

  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 也被刷新?

use*_*003 5

思考这个问题的方法是,用户线程和内核线程是两种完全不同的动物。

根据该术语的正常和习惯含义,用户线程中不存在上下文切换。

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

我看到你的困惑。首先,这里描述的内容仅适用于内核线程。其次,(这个问题显然是措辞的结果,而不是整体消息),在内核线程中,没有“进程上下文切换”,只有“线程上下文切换”。

在过去没有线程的时代,调度的改变意味着进程上下文的改变。执行此操作的硬件指令的名称如“加载进程上下文”和“保存进程上下文”。但在调度线程(内核线程)的操作系统中,我们留下了这个不再非常精确的旧术语。(这是讲解操作系统时很多地方都会出现的问题)。

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

如果它们是用户级线程,内核不知道也不关心它们。它们之间的切换由用户库处理。“线程”的切换不是上下文切换。

成本/交易不会与进程上下文切换相同吗,因为不仅虚拟内存空间发生变化,而且 TLB 也被刷新?

希望操作系统足够聪明,知道在同一进程中的线程之间切换时不要刷新内存缓存。

我确信学术界需要放弃内核/用户线程(甚至更糟糕的是,一对一、多对一和多对多 [yuk])结构。我建议使用这些术语来代替它们

“真实线程”和“模拟线程”。