有没有人告诉我在这两种情况下究竟做了什么?每个人的主要成本是多少?
答案 0 :(得分:172)
线程切换和进程切换之间的主要区别在于,在线程切换期间,虚拟内存空间保持不变,而在进程切换期间则不然。 两种类型都涉及将控制权交给操作系统内核以执行上下文切换。切换进出OS内核的过程以及切换寄存器的成本是执行上下文切换的最大固定成本。
更模糊的代价是上下文切换与处理器缓存机制混淆。基本上,当您进行上下文切换时,处理器在其缓存中“记住”的所有内存地址实际上都变得无用。这里的一个很大的区别是,当您更改虚拟内存空间时,处理器的转换后备缓冲区(TLB)或等效内容会被刷新,从而使内存访问在一段时间内变得更加昂贵。在线程切换期间不会发生这种情况。
答案 1 :(得分:12)
进程上下文切换涉及切换内存地址空间。这包括内存地址,映射,页表和内核资源 - 相对昂贵的操作。在某些体系结构中,它甚至意味着刷新在地址空间不可共享的各种处理器缓存。例如,x86必须刷新TLB,而某些ARM处理器必须刷新整个L1缓存!
线程切换是在同一进程中从一个线程切换到另一个线程的上下文切换(跨进程切换从线程到线程只是进程切换)。切换处理器状态(例如程序计数器和寄存器内容)通常非常有效。
答案 2 :(得分:8)
首先,操作系统将内存模式中的传出线程带入其中,因为线程切换只能在内核模式下运行的线程之间执行。然后调用调度程序以决定将执行切换的线程。在做出决定之后,内核将位于CPU(CPU寄存器)中的部分线程上下文保存到内存中的专用位置(通常位于传出线程的内核堆栈的顶部)。然后内核执行从传出线程的内核堆栈切换到传入线程的内核堆栈。之后,内核将先前存储的传入线程的上下文从内存加载到CPU寄存器中。最后将控制权返回到用户模式,但是在新线程的用户模式下。 在OS确定传入线程在另一个进程中运行的情况下,内核执行一个额外步骤:设置新的活动虚拟地址空间。
两种情况下的主要成本都与缓存污染有关。在大多数情况下,传出线程使用的工作集将与传入线程使用的工作集显着不同。结果,传入的线程将以高速缓存未命中率开始其生命,从而从高速缓存中清除旧的和无用的数据并从存储器加载新数据。对于TLB(在CPU上的Translation Look Aside Buffer)也是如此。在重置虚拟地址空间(线程在不同进程中运行)的情况下,惩罚甚至更糟,因为虚拟地址空间的重置导致整个TLB的刷新,如果新线程实际需要,则甚至只加载几个新条目。结果,新线程将开始其时间量,有很多TLB未命中和频繁的页面遍历。线程切换的直接成本也是不可忽略的(从大约250到大约1500-2000周期)并且取决于CPU复杂性,它们实际使用的线程和寄存器组的状态。
P.S。:关于上下文切换开销的好帖子:http://blog.tsunanet.net/2010/11/how-long-does-it-take-to-make-context.html
答案 3 :(得分:3)
答案 4 :(得分:2)
在线程上下文切换中,虚拟内存空间保持不变,而不是在进程上下文切换的情况下。此外,进程上下文切换比线程上下文切换更昂贵。
答案 5 :(得分:1)
上下文切换涉及存储进程的上下文或状态,以便可以在需要时重新加载它,并且可以从较早的同一点恢复执行。这是多任务操作系统的一项功能,并允许多个进程共享一个CPU。
答案 6 :(得分:0)
我认为主要区别在于调用switch_mm()
时,它处理旧任务和新任务的内存描述符。对于线程来说,虚拟内存地址空间是不变的(线程共享虚拟内存),因此只需要做很少的工作,因此成本更低。
答案 7 :(得分:0)
尽管线程上下文切换需要更改执行上下文(寄存器,堆栈指针,程序计数器),但是它们不需要像进程上下文切换一样更改地址空间。切换地址空间,更多的内存访问(分页,分段等),并且在进入或退出新进程时必须刷新TLB,这会产生额外的费用。
答案 8 :(得分:-1)
简而言之,线程上下文切换不会分配一组全新的内存和pid,它使用与父进程相同的内容,因为它在同一进程中运行。一个进程产生一个新进程,从而分配新的mem和pid。
还有更多的loooooot。他们写了书。
至于成本,流程上下文切换>>>>线程,因为你必须重置所有堆栈计数器等。
答案 9 :(得分:-1)
假设操作系统运行的CPU已经附加了一些高延迟设备,
运行进程地址空间的另一个线程是有意义的,而高延迟设备会响应。
但是,如果高延迟设备的响应速度快于需要为新进程设置虚拟到物理内存的表+转换的时间,那么开关是否必不可少是值得怀疑的。
此外,HOT缓存(运行流程/线程所需的数据可在更短的时间内到达)是更好的选择。