进程
计算机硬盘中存放着许多程序,如音乐播放器、游戏、浏览器等等。程序是静态的,本身是不会执行的,而当一个程序需要执行时,程序就会被CPU加载到内存中执行,变成一个进程。比如,当我打开音乐播放器时,硬盘中存放音乐播放器的代码就会被传输到内存中执行,后台就会多了一个进程。所以进程就是正在运行的程序的实例。进程也是操作系统进行调度和资源分配的基本单位。
CPU可以调用多个程序加载到内存中运行,这意味着在内存中可以同时存在多个进程,对于每一个进程,在其内部都有独立的内存空间。进程大部分时间都是在内部访问,而进程之间的通信就需要进程间通信(IPC)。每个进程会认为自己是独占内存的,所以不需要关心其他进程的位置。每个进程通常有一个程序计数器,来记录当前程序执行到哪里了,一个执行流就是一个线程,如果有多个执行流那么就会有多个线程。
线程
线程是程序执行的最小单位。线程是存在于进程中的,一个进程可以有多个线程,每个线程共享所属进程的资源,不同的线程在同一进程中会共享地址空间和全局变量等等。
线程状态有5个阶段:新建状态(new)、就绪状态(runnable)、运行状态(running)、阻塞状态(blocked)、死亡状态(dead)。
新建状态(new):当线程被创建时,此时在新建状态。
就绪状态(runnable):当线程准备完毕,等待CPU的到来时,此时为就绪状态。
运行状态(running):当CPU服务于当前线程时,此时为运行状态。
阻塞状态(blocked):例如,当线程向内存中发送请求,等待回复时,为避免CPU空转,CPU此时会转头执行其他线程,此时为阻塞状态,当再次准备完毕后,会进入就绪状态。
死亡状态(dead):当退出run()方法时,线程就会自然死亡,处于终止或死亡状态,也就结束了生命周期。
并发与并行
以单核CPU为例,此时在一个进程中有多个线程需要执行,但是此时只有一个CPU可用,那么CPU会通过时间片轮转的方式不停的上下文切换,也就是在多个线程之间不断的来回提供资源,由于切换的时间非常快速,所以多个线程看起来像是在同时执行,这就叫做并发。
以多核CPU为例,假设一个CPU有6个内核,那么这6个内核可以同时执行6个线程,可以真正的让多个线程同时执行,而不是看起来像在同时执行。
在实际运行中,往往线程的数量会远大于CPU数量,那么此时CPU会在内核中为线程提供各自的虚拟CPU,每个线程会认为自己是独占CPU。