操作系统提供多任务功能,进程和线程都是任务,进程有独立的内存空间。多任务被操作调度共享CPU,每个任务运行一个时间片,然后交出CPU,再由其他任务占用CPU。多任务又分为抢占式多任务和协作式多任务。

多任务解决的问题是什么?是多个任务对CPU的分时复用。

通常情况下任务的程序有和内存打交道和IO设备打交道,与内存相比,IO非常慢,如果任务长时间等待IO的就绪,对CPU资源是浪费的。也就是一个IO密集型任务的CPU利用率非常低,但是其他计算密集型的任务无法执行。

有了多任务,操作系统就可以对多个任务进行调度,每个任务执行一个时间片,再换队列中的下一个任务。在单CPU系统上就可以支持多个任务。

而Java的线程只不过是对操作系统线程的封装。

多核CPU是指一个CPU有多个核心(每个核心还可以有多个超线程),CPU早期计算能力的增长是随着主频的增长而增长,但是主频上升到一定程度,功耗和散热都是无法逾越的,于是CPU计算能力的增长转变了思路,变为主频不高的有多个核心的CPU。

在只有一个核的CPU时代,程序员写的程序不需要修改,就可以通过换成更高主频的CPU而获得性能的提升。但是,在多核CPU时代,如果程序写的程序只有一个线程,换成2核,4核,8核的CPU,程序的性能无法获得增长,于是就要求程序员写多线程的程序,将计算问题分解到多个线程上解决,这样才能获得性能的提升。

回到你的问题,当多任务操作系统运行在单CPU的计算机上,多个线程/进程是轮流按照时间片共享单个CPU的。当多任务操作系统运行在对称对处理器/核的计算机上,多个进程会被调度到不同的核心上运行。

也就是说,5个线程跑在4个内核上,可能一个内核有两个线程,其他3个内核各有一个线程。