我知道这里,这个问题有一个解释。但我对一些观点有点困惑——:
让我有属于进程 P1 的线程 T(1-a) 和 T(1-b),以及属于进程 P2 的线程 T(2-a) 和 T(2-b)。
现在我的问题是-:
- 线程 T(1-a) 想要将上下文切换到线程 T(1-b)。根据这个答案,
这两种类型(进程上下文切换和线程上下文切换)都涉及将控制权移交给操作系统内核以执行上下文切换(我主要谈论线程上下文切换)。
怀疑
如果 T(1-a) 和 T(1-b) 是用户级线程,内核将无法 区分 T(1-a) 和 T(1-b),那么上下文切换将如何完成?
- 让所有线程 T(1-a)、T(1-b)、T(2-a) 和 T(2-b)
- 成为内核级线程,如果线程 T(1-a) 想要上下文切换到 T(2-b)。
怀疑
成本/交易不会与进程上下文切换的成本/交易相同,因为不仅虚拟内存空间被更改,而且 TLB 也会被刷新??
思考这个问题的方法是,用户线程和内核线程是两种完全不同的动物。
根据该术语的正常和习惯含义,用户线程中没有上下文切换。
这两种类型(进程上下文切换和线程上下文切换)都涉及将控制权移交给操作系统内核以执行上下文切换(我主要谈论线程上下文切换)。
我看到你的困惑。首先,这里描述的内容仅适用于内核线程。其次,(这个问题显然是措辞的结果,而不是整体信息),在内核线程中,没有"进程上下文切换",只有"线程上下文切换"。
在没有线程的旧时代,调度的变化意味着流程上下文的改变。执行此操作的硬件指令具有"加载进程上下文"和"保存进程上下文"等名称。但是在调度线程(内核线程)的操作系统中,我们留下了这个不再非常精确的旧术语。(这是解释操作系统时在许多地方出现的问题)。
如果 T(1-a) 和 T(1-b)是用户级线程,内核将无法区分 T(1-a) 和 T(1-b),那么上下文切换将如何完成?
如果它们是用户级线程,内核就不知道或不关心它们。它们之间的切换由用户库处理。"线程"的切换不是上下文切换。
成本/交易不会与进程上下文切换的成本/交易相同,因为不仅虚拟内存空间被更改,而且 TLB 也会被刷新??
希望操作系统足够聪明,知道在同一进程中的线程之间切换时不要刷新内存缓存。
我相信学者们需要放弃内核/用户线程(更糟糕的是,1对1、多对一和多对多[yuk])结构。在他们的位置,我建议使用这些术语
">真实线程"和"模拟线程"。