Multithreading 多线程相同地址空间

Multithreading 多线程相同地址空间,multithreading,virtual-memory,tlb,Multithreading,Virtual Memory,Tlb,正如我们所知,线程属于同一个进程,它们使用相同的共享地址空间同时运行,这是否意味着内存空间也在线程之间同时共享,如果是,那么如何共享呢?如果它们都能够同时使用内存空间,为什么我们需要上下文切换 每个线程都有自己的堆栈和可执行文件中的一个位置 上下文开关是处理器使用正确的堆栈和寄存器值获取该线程的正确指令 如果它们都能使用,为什么我们需要上下文切换 内存空间同步 线程上下文切换是关于CPU时间而不是内存映射的。假设您有两个同等重要的工作线程,为了使这两个线程都能完成任务,它们必须公平地从调度程序接

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

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

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

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

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

问题的另一部分已经在这个堆栈溢出线程中得到了回答

线程开关和进程开关之间的主要区别是 在线程切换期间,虚拟内存空间保持不变 相同,但在流程切换期间不会。这两种类型都涉及 将控制权移交给操作系统内核以执行 上下文切换。切换操作系统内核的过程 除此之外,关闭寄存器的成本也是最大的 执行上下文切换的固定成本

一个更模糊的代价是上下文切换会弄乱处理器 缓存机制。基本上,当您切换上下文时,所有 处理器在其缓存中“记住”的内存地址 实际上,它变得毫无用处。这里最大的区别是 您可以更改虚拟内存空间、处理器的转换 Lookaside Buffer(TLB)或等效缓冲区在内存中被刷新 在一段时间内,访问成本要高得多。这种情况在工作期间不会发生 线程开关


谢谢您的回答,但我想澄清一下,如果上下文切换都是关于CPU时间,那么线程必须按照优先级依次使用,这表明即使内存空间也不能同时使用,因为我们可能有许多线程同时处于运行状态,但仍有一个线程会在其他线程之前执行分配给它们的CPU时间。那么,为什么我们说线程同时运行。我们说线程同时运行是因为它们可以同时运行,但不是所有线程同时运行。CPU核心可以一次运行一个线程。如果您有一个双核CPU,那么两个线程可以同时运行。因此,如果我们有一个有三个线程的程序,那么必须有一个上下文开关来运行第三个线程。