【发布时间】:2011-07-23 08:17:41
【问题描述】:
谁能告诉我在这两种情况下到底做了什么?他们各自的主要成本是多少?
【问题讨论】:
标签: multithreading process context-switch
谁能告诉我在这两种情况下到底做了什么?他们各自的主要成本是多少?
【问题讨论】:
标签: multithreading process context-switch
上下文切换涉及存储进程的上下文或状态,以便在需要时可以重新加载它,并且可以从之前的同一点恢复执行。这是多任务操作系统的一个特性,允许多个进程共享一个 CPU。
【讨论】:
虽然线程上下文切换需要更改执行上下文(寄存器、堆栈指针、程序计数器),但它们不需要像进程上下文切换那样更改地址空间。当您切换地址空间、更多内存访问(分页、分段等)以及进入或退出新进程时必须刷新 TLB 时,会产生额外的成本...
【讨论】:
线程切换和进程切换的主要区别在于,在线程切换期间,虚拟内存空间保持不变,而在进程切换期间则不同。 这两种类型都涉及将控制权移交给操作系统内核以执行上下文切换。切换进出操作系统内核的过程以及切换出寄存器的成本是执行上下文切换的最大固定成本。
一个更模糊的成本是上下文切换与处理器缓存机制混淆。基本上,当您进行上下文切换时,处理器在其缓存中“记住”的所有内存地址实际上都变得无用。这里的一大区别是,当您更改虚拟内存空间时,处理器的转换后备缓冲区 (TLB) 或等效缓冲区会被刷新,从而使内存访问在一段时间内变得更加昂贵。这不会在线程切换期间发生。
【讨论】:
首先,操作系统会在内核模式下将传出线程带入内核模式,因为线程切换只能在内核模式下运行的线程之间执行。然后调用调度程序来决定将执行切换到哪个线程。做出决定后,内核将位于 CPU(CPU 寄存器)中的部分线程上下文保存到内存中的专用位置(通常位于传出线程的内核堆栈的顶部)。然后内核执行从传出线程的内核堆栈到传入线程的内核堆栈的切换。之后,内核将先前存储的传入线程的上下文从内存加载到 CPU 寄存器中。最后将控制权返回到用户模式,但在新线程的用户模式下。 在操作系统确定传入线程在另一个进程中运行的情况下,内核执行一个额外的步骤:设置新的活动虚拟地址空间。
这两种情况的主要成本都与缓存污染有关。在大多数情况下,传出线程使用的工作集与传入线程使用的工作集有很大不同。结果,传入的线程将以大量缓存未命中开始其生命,从而从缓存中刷新旧的和无用的数据并从内存中加载新数据。 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
【讨论】:
我认为主要区别在于调用switch_mm() 处理旧任务和新任务的内存描述符时。在线程的情况下,虚拟内存地址空间是不变的(线程共享虚拟内存),所以要做的事情很少,因此成本更低。
【讨论】:
在线程上下文切换中,虚拟内存空间保持不变,而在进程上下文切换中则不同。此外,进程上下文切换比线程上下文切换成本更高。
【讨论】:
假设操作系统运行的 CPU 连接了一些高延迟设备,
运行进程地址空间的另一个线程是有意义的,而高延迟设备会响应。
但是,如果高延迟设备的响应速度快于为新进程设置表 + 将虚拟内存转换为物理内存所需的时间,那么是否需要切换就值得怀疑了。
此外,HOT 缓存(运行进程/线程所需的数据可在更短的时间内访问)是更好的选择。
【讨论】:
进程上下文切换涉及切换内存地址空间。这包括内存地址、映射、页表和内核资源——这是一项相对昂贵的操作。在某些架构上,这甚至意味着刷新不能跨地址空间共享的各种处理器缓存。例如,x86 必须刷新 TLB,而一些 ARM 处理器必须刷新整个 L1 缓存!
线程切换是在同一进程中从一个线程到另一个线程的上下文切换(跨进程从线程切换到线程只是进程切换)。切换处理器状态(例如程序计数器和寄存器内容)通常非常有效。
【讨论】:
【讨论】:
简而言之,线程上下文切换不会分配一组全新的内存和 pid,它使用与父进程相同的内存,因为它在同一个进程中运行。一个进程产生一个新进程,从而分配新的 mem 和 pid。
还有更多内容。他们为此写了书。
至于成本,进程上下文切换 >>>> 线程,因为您必须重置所有堆栈计数器等。
【讨论】: