【发布时间】:2015-11-09 02:21:06
【问题描述】:
我们知道线程属于同一个进程,同时使用相同的共享地址空间运行,这是否意味着内存空间也在线程之间同时共享,如果是,那么如何?如果它们都能够同时使用内存空间,为什么我们需要上下文切换?
【问题讨论】:
标签: multithreading virtual-memory tlb
我们知道线程属于同一个进程,同时使用相同的共享地址空间运行,这是否意味着内存空间也在线程之间同时共享,如果是,那么如何?如果它们都能够同时使用内存空间,为什么我们需要上下文切换?
【问题讨论】:
标签: multithreading virtual-memory tlb
每个线程都有自己的堆栈和可执行文件中的位置。
上下文切换是处理器使用正确的堆栈和寄存器值为该线程获取正确的指令
【讨论】:
如果它们都能够使用,为什么我们需要上下文切换 内存空间?
线程上下文切换是关于 CPU 时间而不是内存映射。 想象一下,您有两个同等重要的工作线程,为了让两个线程都完成它们的工作,它们必须从调度程序公平地接收 CPU 时间。这就是为什么你需要线程上下文切换。与进程上下文切换相比,它们在同一进程中工作的事实使得该上下文切换更轻,但是线程上下文切换是必要的。在线程上下文切换期间,虚拟内存空间保持不变,但是 IP(指令指针)、SP(堆栈指针)、通用寄存器等寄存器会重新加载,因为其他“执行程序”会占用 CPU 时间。
您的问题的另一部分已在此 Stack Overflow 线程中得到解答。
线程切换和进程切换的主要区别是 在线程切换期间,虚拟内存空间仍然是 相同,但在进程切换期间不会。两种类型都涉及 将控制权交给操作系统内核来执行 上下文切换。进出操作系统内核的过程 连同切换出寄存器的成本是最大的 执行上下文切换的固定成本。
更模糊的代价是上下文切换与处理器混淆 缓存机制。基本上,当您进行上下文切换时,所有 处理器在其缓存中“记住”的内存地址 有效地变得无用。这里的一大区别是,当 你改变虚拟内存空间,处理器的翻译 Lookaside Buffer (TLB) 或等效缓冲区被刷新以生成内存 访问更昂贵了一段时间。这不会发生在 线程切换。
【讨论】: