线程与进程
**线程:**是操作系统能够运行的调度的最小单位。线程之间共享资源,6它被包含在进程之中,是进程中的实际运作单位
协程,是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制(也就是在用户态执行)。这样带来的好处就是性能得到了很大的提升,不会像线程切换那样消耗资源
协程:在单线程里实现多任务的调度,并在单线程里维持多个任务间的切换。(并发艺术)
进程: 是系统进行资源费配基本单位,是操作系统结构的基础。
- 进程是操作系统分配资源的单位
- 线程是调度的基本单位,线程之间共享进程资源,线程是程序执行的最小单位
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
下图是 Java 内存区域,通过下图我们从 JVM 的角度来说一下线程和进程之间的关系。如果你对 Java 内存区域 (运行时数据区)
从上图可以看出:一个进程中可以有多个线程,多个线程共享进程的堆和方法区 (JDK1.8 之后的元空间)资源,但是每个线程有自己的程序计数器、虚拟机栈 和 本地方法栈。
总结: 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。线程执行开销小,但不利于资源的管理和保护;而进程正相反。
线程与协程
操作系统在线程等待IO的时候,会阻塞当前线程,切换到其它线程,这样在当前线程等待IO的过程中,其它线程可以继续执行。当系统线程较少的时候没有什么问题,但是当线程数量非常多的时候,却产生了问题。一是系统线程会占用非常多的内存空间,二是过多的线程切换会占用大量的系统时间。
协程运行在线程之上,当一个协程执行完成后,可以选择主动让出,让另一个协程运行在当前线程之上。协程并没有增加线程数量,只是在线程的基础之上通过分时复用的方式运行多个协程,而且协程的切换在用户态完成,切换的代价比线程从用户态到内核态的代价小很多。
协程相比线程的优势
- 协程比线程更细粒度,协程运行在线程之上,多个协程可以由一个或多个线程管理。
- 协程上下文切换较快,少于线程之间切换的开销。协程的切换,仅仅需要改变寄存器的数值,cpu便会从需要切换的协程指定位置继续运行。
- 同一个线程之内的协程调度不需要锁机制,因为只有一个线程,不存在同时写变量冲突,执行效率比多线程高很多。