【问题标题】:Difference between context switch of thread and context switch of process线程上下文切换和进程上下文切换的区别
【发布时间】:2017-09-09 23:29:27
【问题描述】:

我知道here,这个问题有一个解释。但是我对某些观点有点困惑-:

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

现在我的问题是——:

  1. 线程 T(1-a) 想要做上下文切换到线程 T(1-b)。根据this 的回答,

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

怀疑

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

【问题讨论】:

  • 线程切换意味着重新加载指向堆栈的寄存器,进程切换也意味着重新加载所有虚拟内存机制。

标签: multithreading operating-system computer-science context-switch


【解决方案1】:

考虑这一点的方式是,用户线程和内核线程是两种完全不同的动物。

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

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

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

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

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

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

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

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

我相信学者们需要放弃内核/用户线程(更糟糕的是,一对一、多对一和多对多 [yuk])结构。在他们的位置,我建议使用这些术语

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

【讨论】:

  • :" 成本/交易不会与进程上下文切换的成本/交易相同,因为不仅虚拟内存空间会发生变化,而且 TLB 也会被刷新??“我在“如果线程 T(1-a) 想要上下文切换到 T(2-b)。" ???会一样吗?
  • 我在这里很困惑。 TLB 是系统特定的构造。希望操作系统在同一进程的线程之间切换时不会执行刷新。
猜你喜欢
  • 2011-07-23
  • 2011-07-27
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2012-01-12
  • 2018-04-18
  • 2014-12-05
相关资源
最近更新 更多