深入学习掌握JUC并发编程系列(一) -- 了解进程与线程概念
一、进程(Process)
- 程序 = 数据 + 指令(数据结构 + 算法)
- 指令:运行(加载至CPU)
- 数据:读写(加载至内存)
- 进程:加载指令、管理内存、管理IO
- 进程:运行程序(.exe),即从磁盘加载程序的代码至内存(资源分配的基本单位)
- 进程是程序的实例:静态存储(程序)——动态运行(进程)
二、线程(Thread)
- 线程:操作系统进行运算调度的最小单位,包含在进程之中,是进程的实际运作单位
- 一个线程就是一个指令流:线程负责将指令流中的一条条指令按顺序交给CPU执行
- 一个进程可以有多个线程,每条线程执行不同的任务
三、两者对比
- 进程是操作系统资源分配的最小单位(加载指令)
- 线程是CPU任务调度和执行的最小单位(执行指令)
- 进程是相互独立的,相互通信复杂,上下文切换成本高,正在运行的程序实例
- 线程是共享内存的,相互通信简单,上下文切换成本低,真正执行任务的单位
- 进程是线程的容器
四、并行并发概念
- 串行(Serial):CPU按顺序处理任务
- 并行(Parallel):多个CPU(多核CPU)同时处理多个任务
- 并发(Concurrent):单核CPU“同时”处理多个任务(线程按时间片轮流使用CPU)
- 并发同时的原理:任务调度器(操作系统中组件),将CPU的时间片(最小约为15毫秒)分给不同的程序使用,由于CPU在线程间(时间片很短)的切换非常快,宏观上感觉是同时运行的
- 区别:(一般程序运行中既有并行又有并发)
- 并行:微观并行,宏观并行(多个CPU,同一时间动手做(doing)多件事情的能力)
- 并发:微观串行,宏观并行(一个CPU,同一时间应对(dealing with)多件事情的能力 )
- 例子:
- 并发:家庭主妇做饭、打扫卫生、给孩子喂奶,她一个人轮流交替做多件事
- 既有并发,也有并行(大部分情况):家庭主妇雇了个保姆,她们一起这些事,这时会产生竞争,例如锅只有一口,一 个人用锅时,另一个人就得等待
- 并行:雇了3个保姆,一个专做饭、一个专打扫卫生、一个专喂奶,互不干扰
五、线程应用之异步调用
- 方法调用角度:
- 同步:方法调用者 需要等待结果返回,才能继续运行(线程阻塞状态)
- 异步:方法调用者 不需要等待结果返回,就能继续运行(线程非阻塞状态)
- 多线程可以让方法执行实现异步
- 结论:
- 单核CPU下,多线程实际并不能提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用CPU,避免一个线程总占用CPU
- 多核 cpu 可以并行跑多个线程,但能否提高程序运行效率 (要看不同场景)
- 任务可以拆分:经过精心设计,将任务拆分,并行执行,可以提高程序的运行效率
- 不是所有任务都能拆分(阿姆达尔定律)
- 不是所有任务都需要拆分,任务的目的如果不同,拆分和效率没有意义