多线程相同的地址空间

问题描述:

正如我们所知,线程属于同一进程,为自己使用相同的共享地址空间同时运行,这是否意味着线程间同时共享内存空间,如果是,那么该怎么做?为什么我们需要上下文切换,如果他们都能够同时使用内存空间?多线程相同的地址空间

每个线程都有自己的堆栈和可执行文件中的一个地方。

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

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

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

你的问题的其他部分已经在这个堆栈溢出线程中得到了解答。

线程切换和处理开关之间的主要区别是 ,一个线程切换期间,虚拟内存空间保持 相同的,而它的处理切换期间没有。这两种类型都涉及 将控制交给操作系统内核执行 上下文切换。切换进出操作系统内核 的过程以及切换寄存器的成本是执行上下文切换的最大的固定成本。

更模糊的成本是上下文切换混淆缓存机制的处理器。基本上,当你进行上下文切换时,处理器在其缓存 中“记住”的所有内存地址实际上变得毫无用处。这里最重要的一点是当 您更改虚拟内存空间时,处理器的后备缓冲区(TLB)或等效缓冲区会被刷新,因此内存访问会花费很多时间。这在 期间不会发生线程切换。

thread context switch vs process context switch

+0

谢谢您的回答,但我想澄清一下,如果上下文切换是所有关于CPU的时间,然后线程必须使用它接二连三按照它们的优先级,这表明即使内存空间不能同时使用,因为我们可能有许多线程同时处于运行状态,但由于分配给它们的CPU时间,仍然会在别人之前执行。因此,为什么我们说线程正在同时运行。 – Manish

+0

我们说线程是同时运行的,因为它们可以同时运行,但并不是所有线程都一次运行。一个CPU内核可以一次运行一个线程。如果你有一个双核CPU,那么两个线程可以同时运行。所以如果我们有一个带有三个线程的程序,那么必须有一个上下文切换来运行第三个线程。 – shf301