Linux中线程之间的切换比进程之间的切换效率高很多吗?

问题描述 投票:0回答:1

这个问题我们知道线程和进程在内核中被视为相同的调度单元,并且在调度方案上没有什么区别。但是,我很好奇在线程和进程之间切换的一般成本。

例如,当在2个不同的进程之间切换时,内核需要更改PTBR(在x86中是CR3寄存器)来切换进程页表,导致TLB被重新刷新。但是在同一进程的不同线程之间切换似乎不需要这种额外的成本,因为这些线程应该共享相同的虚拟地址空间。

linux multithreading linux-kernel operating-system cfs
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.