# 理论基础
# 并发和并行
「并发」强调的是可以一起「出『发』」,「并行」强调的是可以一起「执『行』」。
并发需要存在多个任务,这些任务在重叠的时间段内以无序的方式启动,运行和完成。
并行是指多个任务或唯一任务的多个部分在物理上同时运行的情况。
与可以一起出发的并发(concurrent)相对的是不可以一起出发的顺序(sequential):
- 顺序:上一个开始执行的任务完成后,当前任务才能开始执行
- 并发:无论上一个开始执行的任务是否完成,当前任务都可以开始执行
与可以一起执行的并行(parallel)相对的是不可以一起执行的串行(serial):
- 串行:有一个任务执行单元,从物理上就只能一个任务、一个任务地执行
- 并行:有多个任务执行单元,从物理上就可以多个任务一起执行
# 进程和线程
进程是资源分配的最小单位,线程是程序执行的最小单位。
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。
线程是共享进程中的数据的,使用相同的地址空间,因此 CPU 切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。
线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据。
进程之间的通信需要以通信的方式(IPC) 进行。
# CPU 调度
- 分时调度:所有线程轮流使用 CPU,平均分配每个线程占用 CPU 的时间。
- 抢占式调度:优先让优先级高的线程使用 CPU,如果线程的优先级相同,随机选择一个,JVM 使用抢占式调度。