之前我对单进程、多进程、单线程、多线程,单核、多核、并发、并行;总是没有详细的认知;因此准备归纳总结下,加强自己的记忆。(这里的并发不是网络并发,请区别对待)
CPU
可以分为单核和多核;Application
可以分为单进程和多进程;进程
可以分为单线程和多线程;而并发和并行是指进程或者线程在不同个数CPU
或者不同核数CPU
中的执行方式;
我们先理解下进程在CPU
中的并行方式:
当应用的进程状态是
Running
时(使用系统命令top
可以查看),调度器
会让进程进行排队
,然后进入就绪队列
,通过分派器
,进程控制块
处理后,交给CPU
,当CPU
计算完后,移出队列。到此程序就完成了一次执行。
其实我们不难发现,如果多个进程同时进来,那
CPU
时间片也是一个一个的运行。由于时间片的切换非常快,基本上都是在ms间完成的,所以进程的执行在宏观
上是并发的,但是在微观
上是串行的。
结论:
-
调度器
将CPU
分成一段段的时间片;每个时间片有最大时间和最小运行时间(linux下是5ms-800ms)。(时间片算法,咱也不懂,咱也不知道找谁问) -
os
调度系统依次选择每个进程,最多执行时间片指定的时长。 - 通过
进程控制块
,我们可以看出一个进程是可以包含多个线程的。 - 进程是资源分配的基本单位;这里的资源是指:内存、硬盘、显卡、GPS等等,这也就是程序上下文(后面会讲线程是
CPU
调度和分配的基本单位,要注意区分)
到这里理解了进程在单
CPU
的运行方式;在单CPU
单核中进程的并发;如果是多CPU
,进程是可以并行的
进程执行需要系统资源,但是不同的进程间是无法共享CPU
,怎么样才能共享资源和CPU
呢?线程(有些程序中叫协程)的概念就出现了,线程是被包含在进程中,同一进程中的不同线程可以共享CPU
和程序上下文
(进程被分配到的资源)
在单核单CPU
中,在同一个进程中的不同线程想要使用CPU
核心,则会进行线程切换,但是由于共享了程序执行环境,这个线程切换会比进程切换开销小很多。注意:由于CPU
是单核的,所以同时刻只能执行一个线程,所以说这里依然是并发。
如果我们的CPU
是多核的呢?那么进程中的不同线程就可以同时运行了,真正的并行就出现了
到这里理解了同一进程中的单线程和多线程在单
CPU
的运行方式;在单CPU
多核中进程的并行;
文章的开头我们提到过线程是CPU调度和分配的基本单位。要和进程是操作系统进行资源分配的最小单位区分;假设我是CPU
,操作系统调度器将一个进程分配给我之后,我拿到进程后,能看到什么,是不是只能看到进程中的多个线程,那么我现在能调度和分配的是不是只能是线程。如果我是4核的,把线程ABCD
分配到核心1234,其他的线程依然要等待分配。所以线程是CPU
调度和分配的基本单位。
总结
单CPU
中进程只能是并发,多CPU
中进程可以并行。
单CPU
单核中线程只能并发,单CPU
多核中线程可以并行。
- 多核CPU同时可以执行多个线程,有几个核就能执行几个线程。
- 这些线程分属不同进程的话就是执行了多个进程。
- 这些线程分属同一个进程的话就是只执行了一个进程的不同线程。
- 多核CPU和多个CPU运行机制相同也不同,单就运行多线程任务来讲原理是差不多的。
理解了上面这些关系,再去看看 从浏览器多进程到JS单线程,JS运行机制最全面的一次梳理,思路会更加清晰
网友评论