进程线程协程

Goroutine是什么:Goroutine是Go语言特有的名词。区别于进程Process,线程Thread,协程Goroutine,因为Go语言的创造者们觉得和他们是有所区别的,所以专门创造了Goroutine。

为了真正搞懂Goroutin协程是什么,我们需要先弄清楚协程的概念:

进程 Process

进程是系统进行资源分配的一个独立单位,操作系统内核通过进程控制块(PCB,process control block)来感知进程

进程申请系统资源包含如下:

  • 已打开的文件
  • 已申请到的I/O设备
  • 用户的地址空间
  • 进程维护的地址映射表
  • 实现进程(线程)间同步和通信的机制

进程的组成:

程序段、数据段、PCB三部分组成了进程实体(进程映像)。一般情况下,我们把进程实体就简称为进程,例如,所谓创建进程,实质上是创建进程实体中的PCB;而撤销进程,实质上是撤销进程实体中的PCB。注意:PCB是进程存在的唯一标志!

进程的定义:

从不同的角度,进程可以有不同的定义,比较传统典型的定义有:

1.进程是程序的一次执行过程。
2.进程是一个程序及其数据在处理机上顺序执行时所发生的活动。
3.进程是具有独立功能的程序在数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位
 

线程 Thread

是操作系统能够进行运算调度的最小单位

线程本身不拥有系统资源,大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并行多个线程,每条线程并行执行不同的任务,你可以理解为轻量级进程

线程有如下属性:

  • 线程是处理机调度的单位
  • 多CPU计算机中,各个线程可占用不同的CPU 
  • 每个线程都有一个线程ID、线程控制块(TCB) 
  • 线程也有就绪、阻塞、运行三种基本状态
  • 线程几乎不拥有系统资源
  • 同一进程的不同线程间共享进程的资源
  • 由于共享内存地址空间,同一进程中的线程间通信甚至无需系统干预
  • 同一进程中的线程切换,不会引起进程切换
  • 不同进程中的线程切换,会引起进程切换
  • 切换同进程内的线程,系统开销很小
  • 切换进程,系统开销较大

 线程的实现方式:

线程的实现分为两类:用户级线程(User-Level Thread,UTL)和内核级线程(Kernel-Level Thread, KTL)l。内核级线程又称内核支持的线程

线程分为用户级和内核级

同时这两种实现方式又产生了多种不同的组合模型。如下列图所示

一对多模型

 内核级线程(如图为一对一模型)

多对多模型

协程 Coroutine

协程是一种用户态的轻量级线程

协程的调度完全由用户控制,协程间切换只需要保存任务的上下文,没有内核的开销。

协程是编译器级别的,现在很多编程语言都支持协程,如 Erlang、Lua、Python、Golang。准确来说,协程只是一种用户态的轻量线程。

协程的特点在于是一个线程执行,与多线程相比,其优势体现在:协程的执行效率极高。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

与传统的系统级线程和进程相比,协程的最大优势在于其"轻量级",可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常最多也不能超过1万的。这也是协程也叫轻量级线程的原因。

协程的特点在于是一个线程执行,与多线程相比,其优势体现在:协程的执行效率极高。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值