【问题标题】:MultiCore CPUs, Multithreading and context switching?多核 CPU、多线程和上下文切换?
【发布时间】:2014-02-20 06:36:04
【问题描述】:

假设我们有一个具有 20 个内核的 CPU 和一个具有 20 个 CPU 密集型线程且彼此独立的进程:每个 CPU 内核一个线程。 我试图弄清楚在这种情况下是否发生上下文切换。我相信这是因为操作系统中的系统进程也需要 CPU 时间。

我知道有不同的 CPU 架构,有些答案可能会有所不同,但请您解释一下:

  • 上下文切换是如何发生的,例如在 Linux 或 Windows 以及一些已知的 CPU 架构上?现代硬件的底层又会发生什么?
  • 如果我们有 10 个内核和 20 个线程,或者反过来呢?
  • 如果我们有 n 个 CPU,如何计算需要多少线程?
  • 上下文切换后 CPU 缓存(L1/L2)是否为空?

谢谢

【问题讨论】:

    标签: multithreading multiprocessing cpu context-switch


    【解决方案1】:

    上下文切换是如何发生的,例如在 Linux 或 Windows 和一些已知的 CPU架构?现代硬件的底层又会发生什么?

    上下文切换发生在中断发生时,并且该中断连同内核线程和进程状态数据一起指定了一组运行线程,这些线程与中断前运行的线程集不同。请注意,在操作系统术语中,中断可能是导致驱动程序运行并且驱动程序请求调度运行的“真实”硬件中断,也可能是来自已经运行的线程的系统调用。在任何一种情况下,操作系统调度状态机都会决定是否更改在可用内核上运行的线程集。

    内核可以通过停止线程并运行其他线程来更改正在运行的线程集。它可以通过排队抢占请求并生成该内核的硬件中断来强制内核运行其处理器间驱动程序来处理请求,从而停止在任何内核上运行的任何线程。

    如果我们有 10 个内核和 20 个线程呢?

    取决于线程在做什么。如果它们处于就绪/运行之外的任何其他状态(例如,在 I/O 或线程间通信上阻塞),它们之间将没有上下文切换,因为没有任何东西在运行。如果它们都准备好/正在运行,其中 10 个将在 10 个内核上永远运行,直到出现中断。大多数系统都有一个周期性的定时器中断,它可以产生共享线程周围可用内核的效果。

    反之亦然

    10 个线程在 10 个内核上运行。其他 10 个内核已停止。操作系统可以在内核周围移动线程,例如。以防止芯片上的不均匀散热。

    如果我们有 n 个 CPU,如何计算需要多少线程?

    依赖于应用程序。如果所有内核总是在与内核一样多的就绪线程上被 100% 用完,那就太好了,但是,由于大多数线程被阻塞的时间比它们运行的​​时间长得多,所以这很困难,除非在某些最终情况下,(例如 -您的“20 个内核上的 20 个 CPU 密集型线程”),得出任何最佳数量。

    上下文切换后 CPU 缓存(L1/L2)是否为空?

    也许——这完全取决于线程的数据使用情况。像往常一样,缓存将按需重新加载。没有“上下文切换总缓存重新加载”,但是,如果线程在运行时访问不同的大型数据数组,那么(至少 L1)缓存确实会在线程运行期间完全重新加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 1970-01-01
      • 1970-01-01
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多