【问题标题】:Thread execution on single and multi core单核和多核线程执行
【发布时间】:2018-09-09 10:37:22
【问题描述】:

这是我在 Oracle 文档中看到的,想确认一下我的理解 (source):

计算机系统通常有许多活动的进程和线程。这 即使在只有一个执行核心的系统中也是如此,并且 因此在任何给定时刻只有一个线程实际执行。 单个内核的处理时间在进程之间共享,并且 线程通过称为时间片的操作系统功能。

这是否意味着在单核机器中,在给定时刻只能执行一个线程? 而且,这是否意味着在多核机器上可以在给定时刻执行多个线程?

【问题讨论】:

  • 您能修改一下您的报价吗?
  • 报价仍然有问题,我们不知道您指的是什么 Oracle 文档
  • 您想引用哪一部分?如果你愿意,我可以为你编辑你的帖子。
  • 是的,这部分 - “即使在只有一个执行核心的系统中也是如此,因此在任何给定时刻只有一个线程实际执行。单个核心的处理时间是共享的通过称为时间切片的操作系统功能在进程和线程之间进行“时间片”

标签: java multithreading jvm


【解决方案1】:

一个线程在任何给定时刻实际执行

想象这是一个游戏,其中 10 个人试图围成一圈坐在 9 把椅子上(我想你可能知道这个游戏) - 没有足够的椅子供每个人使用,但整个人群总是在移动.只是每个人都坐在椅子上一段时间时间切片的非常简化的版本)。

因此,多个进程可以在同一个内核上运行。

但即使您有多个处理器,这并不意味着某个线程在其整个生命周期内将在该处理器上运行。有一些工具可以实现这一点(即使在 java 中),它被称为 thread affinity,您可以将线程仅固定到某个处理器(这在某些情况下非常方便)。该线程可以移动(由操作系统调度)以在不同的核心上运行,在运行时,这称为上下文切换,对于某些应用程序,这会切换到不同的 CPU有时是不受欢迎的。

同时,当然,多个线程可以并行在不同的内核上运行。

【讨论】:

    【解决方案2】:

    这是否意味着在单核机器中,在给定时刻只能执行一个线程?

    不,您可以轻松地拥有比处理器更多的线程,前提是它们不执行 CPU 密集型工作。例如,如果您有两个线程主要等待 IO(来自网络或本地存储),另一个线程消耗前两个线程获取的数据,您当然可以在单核机器上运行它并获得比单线程。

    而且,这是否意味着在多核机器上可以在给定时刻执行多个线程?

    是的,您可以在任意数量的内核上执行任意数量的线程,前提是您有足够的内存为每个内核分配一个堆栈。显然,如果每个线程都大量使用 CPU,当线程数超过内核数时,它就会停止效率。

    【讨论】:

    • 我知道我可以有更多线程,但是从执行的角度来看,单核机器一次只能执行一个线程?
    • 好吧,如果您在 CPU 级别下降,则在单个内核上一次只执行一条指令,并且许多进程(以及在这些进程中,可能是许多线程)或者在其上运行一些指令处理器。
    • 在单个内核上一次只执行一条指令”——在一个非常简单的视图中。实际上,所有现代 CPU(考虑到过去两三年或近三十年都是现代的)在一个内核中都有流水线阶段和多个执行单元,实际上是一次处理多条指令。
    猜你喜欢
    • 2023-02-04
    • 1970-01-01
    • 1970-01-01
    • 2019-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多