首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程上下文切换Vs。进程上下文切换

线程上下文切换Vs。进程上下文切换
EN

Stack Overflow用户
提问于 2011-03-26 11:07:49
回答 10查看 100.4K关注 0票数 147

谁能告诉我在这两种情况下到底做了什么?它们每一个的主要成本是多少?

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2011-03-26 11:18:52

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

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

票数 227
EN

Stack Overflow用户

发布于 2014-08-24 11:57:07

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

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

票数 18
EN

Stack Overflow用户

发布于 2016-10-27 18:16:20

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

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

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

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5440128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档