进程和线程?它们有何区别?
- 进程是正在执行程序的实例,是资源分配的基本单位;线程是进程的一个执行单元,它是比进程更小的能独立运行的基本单位。
- 一个进程中有多个线程,多个线程共享所属进程的堆和方法区资源,每个线程有自己独立的程序计数器、虚拟机栈和本地方法栈。
- 程序计数器(为什么私有): 程序计数器有两个作用,一是字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,比如顺序执行、选择、循环、异常处理等;二是在多线程的情况下,程序计数器用来记录当前线程执行的位置,使线程被切换回来时能够知道上次执行到哪了。所以这里程序计数器私有是为了线程切换后能恢复到正确的执行位置。
- 虚拟机栈和本地方法栈(为什么私有): 栈区域用来存储局部变量表、操作数栈等信息,私有是为了保证线程中的局部变量不会被别的线程访问到。
- 堆是进程中最大的一块内存,主要用于存放新创建的对象。
- 方法区主要用于存放已被加载的类信息、常量、静态变量等数据。
- 进程的上下文切换会导致CPU将大量的时间花费在虚拟内存、内核栈等资源的保存和恢复上面。而对于同一进程下的多个线程,它们共享相同的虚拟内存和全局变量等资源,而这些资源在线程上下文切换时不需要更改,所以线程切换比进程切换消耗的资源要少。
协程
- 协程是一种用户态的轻量级线程,协程的调度完全由用户控制,一个线程可以有多个协程。
- 协程拥有自己的寄存器上下文和栈,调度切换时,将寄存器上下文和栈保存到其他地方,切回来时再恢复之前保存的寄存器上下文和栈。直接操作栈,所以基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。
- 进程和线程都是同步机制,而协程是异步的。
- 线程是抢占式,而协程是非抢占式的。
- 协程的劣势:①协程的本质是个单线程,无法利用多核资源,处理密集CPU和本地磁盘IO的时候,性能较低。②进行阻塞操作时会阻塞掉整个程序。