进程、线程、纤程、协程的区别
进程:进程 是 OS 分配资源的基本单位。一个进程对应一个端口号, OS 会为每一个进程 独立分配一部分资源。通常我们每运行一次程序,都会产生一个进程。
线程:是 CPU 执行 调度 的基本单位。一个进程包含多个线程,线程共享进程的内存空间,它没有独立的内存空间。
纤程(fiber):JVM 运行在用户空间,当它 new 一个 Thread 时,会对应在 OS 中起一个线程(内核空间),所以这叫重量级线程。而纤程则是在用户态有多条。操作系统不调度纤程, 和线程比起来,协程的切换不需要操作系统进行保存和恢复CPU 上下文,自己的缓存数据等,因为所有的协程都存在于同一个线程之中,所以协程的切换只有单纯的 CPU 上下文切换,开销很小。一个线程包含多个纤程,又叫协程,只是协程是一个概念,而纤程是 Windows 系统对协程的一个具体实现。
协程也有一个调度器,但是是被动调度的,也就是说,只有当前运行的协程主动的让出 CPU,调度器才会从协程池中调用下一个协程。这也是协程和上边几种最大的区别:协程的调度方式是合作式(Cooperative),也可以叫做非抢占式(Non-Preemptive);而上边三种都是抢占式调度(Preemptive)。
截止JDK13,Java对fiber的支持不是很友好,据说JDK14会较好的支持
纤程比线程快在哪?
上面说到,纤程在用户空间,不需要和内核打交道,是语言层面自己实现的,那么为什么和内核打交道的线程效率会比较低呢?这是因为程序一旦涉及用户态到内核态的转换,都要进行以下9个步骤,效率较低。教程