单核和多核,单进程和多进程,单线程与多线程
之前我对单进程、多进程、单线程、多线程,单核、多核、并发、并行;总是没有详细的认知;因此准备归纳总结下,加强自己的记忆。 (这里的并发不是网络并发,请区别对待)
我们先理解下进程在 CPU 中的并行方式:
进程执行需要系统资源,但是不同的进程间是无法共享 CPU ,怎么样才能共享资源和 CPU 呢? 线程 (有些程序中叫 协程 )的概念就出现了,线程是被包含在进程中,同一进程中的不同线程可以共享 CPU 和 程序上下文 (进程被分配到的资源)
在单核单 CPU 中,在同一个进程中的不同线程想要使用 CPU 核心,则会进行线程切换,但是由于共享了程序执行环境,这个线程切换会比进程切换开销小很多。注意:由于 CPU 是单核的,所以同时刻只能执行一个线程,所以说这里依然是并发。
如果我们的 CPU 是多核的呢?那么进程中的不同线程就可以同时运行了,真正的 并行 就出现了
文章的开头我们提到过 线程是CPU调度和分配的基本单位 。要和 进程是操作系统进行资源分配的最小单位 区分;假设我是 CPU ,操作系统调度器将一个进程分配给我之后,我拿到进程后,能看到什么,是不是只能看到进程中的多个线程,那么我现在能调度和分配的是不是只能是线程。如果我是4核的,把线程 ABCD 分配到核心1234,其他的线程依然要等待分配。所以线程是 CPU 调度和分配的基本单位。
单 CPU 中进程只能是并发,多 CPU 中进程可以并行。
单 CPU 单核中线程只能并发,单 CPU 多核中线程可以并行。
理解了上面这些关系,再去看看 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理 ,思路会更加清晰