进程、线程、协程之间的区别
作者:互联网
本文未对所阐述的理论知识作实例说明,仅简单阐述了三者之间的区别
进程
-
进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序的载体。进程是一种抽象的概念,从来没有统一的标准定义。
-
进程的组成:进程一般由程序、数据集合和进程控制块三部分组成
- 程序用于描述进程要完成的功能,是控制进程执行的指令集;
- 数据集合是程序在执行时所需要的数据和工作区;
- 程序控制块(Program Control Block, 简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。
-
进程具有的特征:
- 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的;
- 并发性:任何进程都可以同其他进程一起并发执行;
- 独立性: 进程是系统进行资源分配和调度的一个独立单位;
- 结构性: 进程有程序、数据和进程控制块三部分组成;
线程
-
在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位,也是程序执行的最小单位。任务调度采用的是时间片轮转的抢占式调度方式,而进程是任务调度的最小单位,每个进程有各自独立的一块内存,使得各进程之间内存地址相互隔离。后来,随着计算机的发展,对CPU的要求越来越高,进程之间切换的开销较大,已经无法满足越来越复杂的程序的要求了。在此背景下,诞生了线程。
-
线程是程序执行过程中的一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分配的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所属进程的内存空间)。一个标准的线程由线程ID、当前指令指针(PC)、寄存器和堆栈组成。而进程由内存空间(代码、数据、进程空间、文件)和一个或多个线程组成。
协程
-
协程(Coroutines),是一种基于线程之上,但又比线程更加轻量的存在,这种由编程人员自己管理的轻量级线程叫做【用户空间线程】,它的特性是——对内核不可见。因为是自主开辟的异步任务,所以很多人也更喜欢称之为纤程(Fiber),或者绿色线程(GreenThread)。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。
-
协程的作用
在传统的J2EE系统中都是基于每个请求占用一个线程去完成完整的业务逻辑(包括事务)。所以系统中的吞吐能力取决于每个线程的操作耗时。如果遇到很耗时的I/O行为,则整个系统的吞吐能力立刻下降,因为这个时候线程一直处于阻塞状态,如果线程很多的时候,会存在很多线程处于空闲状态(等待其余线程执行完成),造成了资源应用不彻底。最常见的例子就是JDBC(它是同步阻塞的),这也是为什么很多人说数据库是瓶颈的原因。这里的耗时其实是让CPU一直等待I/O返回,说白了线程根本没有利用CPU去做运算,而是处于空转状态。而过多的线程,也会带来更多的ContextSwitch开销。
对于上述问题,现阶段行业里比较流行的解决方案之一就是单线程加上异步回调。其代表是node.js以及Java新秀Vert.x。
而协程的作用就是当出现长时间的I/O操作时,通过让出当前的协程调度,执行下一个任务的方式来消除ContextSwitch上是开销。 -
协程的特点
线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少了上下文切换,提高了效率。线程的默认Stack大小是1M,而协程更轻量,接近1K。因此可以在相同的内存中开启更多的协程。由于在同一个线程上,因此可以避免竞争关系而使用锁。适用于被阻塞的,且需要大量并发的场景。但不适用于大量计算的多线程,遇到此种情况,最好是用线程去解决。 -
协程的原理
当出现IO阻塞的时候,由协程的调度器进行调度,通过将数据流立刻yield(主动让出),并且记录当前栈上的数据,阻塞完后立刻再通过线程恢复栈,并把阻塞的结果放到这个线程上去跑,这样看上去好像跟写同步代码没有任何区别,这整个流程可以称为coroutine,而跑在由coroutine负责调度的线程称为Fiber。比如Golang里的go关键字其实就是负责开启一个Fiber,让func逻辑跑在上面。
由于协程的暂停完全由程序控制,发生在用户态。而线程的阻塞状态是由操作系统内核来进行调度,发生在内核态。因此,协程的开销远远小于线程的开销,也就没有了ContextSwith上的开销。
进程和线程的区别
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程的资源(如打开的文件和信号)。
- 调度和切换:线程上下文切换比进程上下文切换要快得多,开销也小的多。
标签:开销,协程,程序,调度,线程,进程 来源: https://www.cnblogs.com/peen/p/16115772.html