线程上下文切换Vs. 进程上下文切换

Leo*_*eon 112 multithreading process context-switch

谁能告诉我在这两种情况下究竟做了什么?每个人的主要成本是多少?

Abh*_*uch 194

线程切换和进程切换之间的主要区别在于,在线程切换期间,虚拟内存空间保持不变,而在进程切换期间则不然.两种类型都涉及将控制权交给操作系统内核以执行上下文切换.切换进出OS内核的过程以及切换寄存器的成本是执行上下文切换的最大固定成本.

更模糊的成本是上下文切换与处理器缓存机制混淆.基本上,当您进行上下文切换时,处理器在其缓存中"记住"的所有内存地址实际上都变得无用.这里的一个很大的区别是,当您更改虚拟内存空间时,处理器的转换后备缓冲区(TLB)或等效内容会被刷新,从而使内存访问在一段时间内变得更加昂贵.在线程切换期间不会发生这种情况.

  • 很好的答案.我希望我很了解这些东西! (24认同)
  • 这都是假设TLB和缓存不存储每个条目的pid. (6认同)
  • 恕我直言@dramzy 是对的,操作系统可能支持快速上下文切换,这里简要提到:https://youtu.be/3akTtCu_F_k?t=46m8s(从头开始观看以了解有关虚拟内存、页表和 TLB 的更多信息)。 (2认同)
  • @dramzy您是说OS还是硬件可以存储pid?[this](http://stackoverflow.com/a/22421360/336527)是否相关? (2认同)

小智 14

进程上下文切换涉及切换内存地址空间.这包括内存地址,映射,页表和内核资源 - 相对昂贵的操作.在某些体系结构中,它甚至意味着刷新在地址空间不可共享的各种处理器缓存.例如,x86必须刷新TLB,而某些ARM处理器必须刷新整个L1缓存!

线程切换是在同一进程中从一个线程切换到另一个线程的上下文切换(跨进程切换从线程到线程只是进程切换).切换处理器状态(例如程序计数器和寄存器内容)通常非常有效.


Zar*_*trA 10

首先,操作系统将内存模式中的传出线程带入其中,因为线程切换只能在内核模式下运行的线程之间执行.然后调用调度程序以决定将执行切换的线程.在做出决定之后,内核将位于CPU(CPU寄存器)中的部分线程上下文保存到内存中的专用位置(通常位于传出线程的内核堆栈的顶部).然后内核执行从传出线程的内核堆栈切换到传入线程的内核堆栈.之后,内核将先前存储的传入线程的上下文从内存加载到CPU寄存器中.最后将控制权返回到用户模式,但是在新线程的用户模式下.在OS确定传入线程在另一个进程中运行的情况下,内核执行一个额外步骤:设置新的活动虚拟地址空间.

两种情况下的主要成本都与缓存污染有关.在大多数情况下,传出线程使用的工作集将与传入线程使用的工作集显着不同.结果,传入的线程将以高速缓存未命中率开始其生命,从而从高速缓存中清除旧的和无用的数据并从存储器加载新数据.对于TLB(在CPU上的Translation Look Aside Buffer)也是如此.在重置虚拟地址空间(线程在不同进程中运行)的情况下,惩罚甚至更糟,因为虚拟地址空间的重置导致刷新整个TLB,即使新线程实际上只需要加载少量新条目.结果,新线程将开始其时间量,有很多TLB未命中和频繁的页面遍历.线程切换的直接成本也是不可忽略的(从大约250到大约1500-2000周期)并且取决于CPU复杂性,它们实际使用的线程和寄存器组的状态.

PS:关于上下文切换开销的好帖子:http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html