【问题标题】:Multi-threading same address space多线程同一地址空间
【发布时间】:2015-11-09 02:21:06
【问题描述】:

我们知道线程属于同一个进程,同时使用相同的共享地址空间运行,这是否意味着内存空间也在线程之间同时共享,如果是,那么如何?如果它们都能够同时使用内存空间,为什么我们需要上下文切换?

【问题讨论】:

    标签: multithreading virtual-memory tlb


    【解决方案1】:

    每个线程都有自己的堆栈和可执行文件中的位置。

    上下文切换是处理器使用正确的堆栈和寄存器值为该线程获取正确的指令

    【讨论】:

      【解决方案2】:

      如果它们都能够使用,为什么我们需要上下文切换 内存空间?

      线程上下文切换是关于 CPU 时间而不是内存映射。 想象一下,您有两个同等重要的工作线程,为了让两个线程都完成它们的工作,它们必须从调度程序公平地接收 CPU 时间。这就是为什么你需要线程上下文切换。与进程上下文切换相比,它们在同一进程中工作的事实使得该上下文切换更轻,但是线程上下文切换是必要的。在线程上下文切换期间,虚拟内存空间保持不变,但是 IP(指令指针)、SP(堆栈指针)、通用寄存器等寄存器会重新加载,因为其他“执行程序”会占用 CPU 时间。

      您的问题的另一部分已在此 Stack Overflow 线程中得到解答。

      线程切换和进程切换的主要区别是 在线程切换期间,虚拟内存空间仍然是 相同,但在进程切换期间不会。两种类型都涉及 将控制权交给操作系统内核来执行 上下文切换。进出操作系统内核的过程 连同切换出寄存器的成本是最大的 执行上下文切换的固定成本。

      更模糊的代价是上下文切换与处理器混淆 缓存机制。基本上,当您进行上下文切换时,所有 处理器在其缓存中“记住”的内存地址 有效地变得无用。这里的一大区别是,当 你改变虚拟内存空间,处理器的翻译 Lookaside Buffer (TLB) 或等效缓冲区被刷新以生成内存 访问更昂贵了一段时间。这不会发生在 线程切换。

      thread context switch vs process context switch

      【讨论】:

      • 感谢您的回答,但我想澄清一下,如果上下文切换完全与 CPU 时间有关,那么线程必须根据其优先级一个接一个地使用它,这表明即使内存空间也无法使用同时,因为我们可能有许多线程同时处于运行状态,但由于分配给它们的 CPU 时间,仍然有一个会在其他线程之前执行。那么,为什么我们说线程同时运行。
      • 我们说线程同时运行是因为它们可以同时运行,但并非所有线程都同时运行。一个 CPU 内核可以一次运行一个线程。如果你有一个两核 CPU,那么两个线程可以同时运行。因此,如果我们有一个具有三个线程的程序,则必须进行上下文切换才能运行第三个线程。
      猜你喜欢
      • 2012-10-01
      • 2012-03-06
      • 2017-08-11
      • 2011-09-29
      • 1970-01-01
      • 2011-09-08
      • 2013-02-22
      • 2018-04-23
      • 1970-01-01
      相关资源
      最近更新 更多