这是我在Oracle文档中看到的并且想要确认我的理解(source):
计算机系统通常具有许多活动进程和线程。即使在只有一个执行核心的系统中也是如此,因此在任何给定时刻只有一个线程实际执行。通过称为时间切片的OS功能,在进程和线程之间共享单个核的处理时间。
这是否意味着在单个核心机器中只能在给定时刻执行一个线程?而且,这是否意味着在多核机器上可以在给定时刻执行多个线程?
一个线程在任何给定时刻实际执行
想象一下,这是一个游戏,10个人试图坐在9个椅子上(我想你可能知道游戏) - 每个人都没有足够的椅子,但整个人群总是在移动。这只是每个人坐在椅子上一段时间(非常简化的时间切片版本)。
因此,多个进程可以在同一个核心上运行。
但即使您有多个处理器,也不意味着某个线程在整个生命周期内仅在该处理器上运行。有一些工具可以实现这一点(即使在java中)并且它被称为线程亲和性,您可以将线程仅固定到某个处理器(在某些情况下这非常方便)。该线程可以移动(由OS调度)以在不同的核心上运行,在运行时,这称为上下文切换,对于某些应用程序,这种切换到不同的CPU有时是不需要的。
当然,同时,多个线程可以在不同的内核上并行运行。
这是否意味着在单个核心机器中只能在给定时刻执行一个线程?
不,你可以轻松拥有比处理器更多的线程,假设他们没有做CPU限制工作。例如,如果你有两个线程主要等待IO(来自网络或本地存储)和另一个线程消耗前两个线程获取的数据,你当然可以在具有单个内核的机器上运行它,并获得比用一个线程。
而且,这是否意味着在多核机器上可以在给定时刻执行多个线程?
好吧,你可以在任意数量的内核上执行任意数量的线程,前提是你有足够的内存来为每个内核分配一个堆栈。显然,如果每个线程大量使用CPU,当线程数超过内核数时,它将停止有效。