进程与线程

线程:进程中的一个实体(任务),本身是不会独立存在的。
进程:代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。

进程与线程的区别:
  • 每个进程拥有自己的一整套变量,是操作系统中资源分配的最小单位。线程依托于进程存在,多个线程共享进程的资源,线程是操作系统中任务调度的基本单位。
  • 启动/撤销一个进程的开销要比启动/撤销一个线程大的多(线程轻量级)。
  • 没有进程就没有线程,进程一旦终止,其内的线程全部撤销。

为什么说线程是CPU(或任务调度)的基本单位
操作系统在分配资源时是把资源分配给进程的,但是CPU资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是CPU分配的基本单位。

进程与线程的关系

进程与线程
程序计数器: 是一块内存区域,用来记录线程当前要执行的指令地址。
为何要将程序计数器设为私有呢?
我们直到线程是CPU执行的基本单位,而CPU一般是使用时间片轮转方式让线程轮询占用的,所以当前线程CPU时间片用完后,要让出CPU,等下次轮到自己的时候再执行。那么如何直到之前程序执行到哪里了呢?其实程序计数器就是为了记录该线程让出CPU时的执行地址的,待再次分配到时间片时线程就可以从自己私有的计数器指定地址继续执行。另外需要注意的是,如果执行的是native方法,那么pc计数器记录的是undefind地址,只有执行的是Java代码时pc计数器记录的才是下一条指令的地址。


每个线程都有自己的栈资源,用于存储该线程的局部变量,这些局部变量是该线程私有的,其他线程是访问不了的,除此之外栈还用来存放线程的调用栈帧。
堆是一个进程中最大的一块内存,堆是被进程中的所有线程共享的,是进程创建时分配的,堆里面主要存放使用new操作创建的对象实例。
方法区则用来存放JVM加载的类、常量及静态变量等信息,也是线程共享的。