线程与协程的区别

  1. 调度上的区别

    • 切换开销的区别
    • 线程太重,资源占用太高,频繁创建销毁会带来严重的性能问题;
    • 协程切换远比线程小

2.  协程的好处:

  • 一个协程几乎就是一个普通的对象,因此可以放心阻塞,一旦阻塞那么让当前线程执行其他的协程(goroutine)

goroutine和协程的区别

  1. goroutine是协程的go语言实现,相当于把别的语言的类库的功能内置到语言里。从调度上看,goroutine的调度开销远远小于线程调度开销。
  2. 不同的是:Golang在runtime,系统调用等多方面对goroutine调度进行了封装和处理,即goroutine不完全是用户控制,一定程度上由go运行时(runtime)管理,好处:当某goroutine阻塞时,会让出CPU给其他goroutine。

线程和goroutine的区别

  1. OS的线程由OS内核调度,每隔几毫秒,一个硬件时钟中断发到CPU,CPU调用一个调度器内核函数。这个函数暂停当前正在运行的线程,把他的寄存器信息保存到内存中,查看线程列表并决定接下来运行哪一个线程,再从内存中恢复线程的注册表信息,最后继续执行选中的线程。这种线程切换需要一个完整的上下文切换:即保存一个线程的状态到内存,再恢复另外一个线程的状态,最后更新调度器的数据结构。某种意义上,这种操作还是很慢的。
  2. 从调度上讲,线程的调度由 OS 的内核完成;线程的切换需要CPU寄存器和内存的数据交换,在线程切换的过程中需要保存/恢复所有的寄存器信息,比如16个通用寄存器,PC(Program Counter),SP(Stack Pointer),段寄存器等等,从而切换不同的线程上下文。 其触发方式为 CPU时钟。而goroutine 的调度 则比较轻量级,由go自身的调度器完成;Go运行的时候包涵一个自己的调度器,这个调度器使用一个称为一个M:N调度技术,m个goroutine到n个os线程(可以用GOMAXPROCS来控制n的数量),Go的调度器不是由硬件时钟来定期触发的,而是由特定的go语言结构来触发的,他不需要切换到内核语境,所以调度一个goroutine比调度一个线程的成本低很多。其只关心当前go程序内协程的调度;触发方式为 go内部的事件,如文件和网络操作垃圾回收,time.sleep,通道阻塞,互斥量操作等。在同一个原生线程里,若当前goroutine不发生阻塞,那么不会主动让出CPU给其他同一线程的goroutine的。在go程序启动时,会首先创建一个特殊的内核线程sysmom,负责监控和调度。
  3. 从栈空间上,goroutine的栈空间更加动态灵活。每个OS的线程都有一个固定大小的栈内存,通常是2MB,栈内存用于保存在其他函数调用期间哪些正在执行或者临时暂停的函数的局部变量。这个固定的栈大小,如果对于goroutine来说,可能是一种巨大的浪费。作为对比goroutine在生命周期开始只有一个很小的栈,典型情况是2KB, 在go程序中,一次创建十万左右的goroutine也不罕见(2KB*100,000=200MB)。而且goroutine的栈不是固定大小,它可以按需增大和缩小,最大限制可以到1GB。
  4. goroutine没有一个特定的标识。在大部分支持多线程的操作系统和编程语言中,线程有一个独特的标识,通常是一个整数或者指针,这个特性可以让我们构建一个线程的局部存储,本质是一个全局的map,以线程的标识作为键,这样每个线程可以独立使用这个map存储和获取值,不受其他线程干扰。goroutine中没有可供程序员访问的标识,原因是一种纯函数的理念,不希望滥用线程局部存储导致一个不健康的超距作用,即函数的行为不仅取决于它的参数,还取决于运行它的线程标识。

转载于:https://www.cnblogs.com/maji233/p/11044862.html

线程、协程、Goroutine的区别和联系相关推荐

  1. python线程协程进程的区别_进程和线程、协程的区别

    现在多进程多线程已经是老生常谈了,协程也在最近几年流行起来.python中有协程库gevent,py web框架tornado中也用了gevent封装好的协程.本文主要介绍进程.线程和协程三者之间的区 ...

  2. go goroutine 进程 线程 协程

    Go语言的协程--Goroutine 进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程) 进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为" ...

  3. go 怎么等待所有的协程完成_GO语言基础进阶教程:Go语言的协程——Goroutine

    Go语言的协程--Goroutine 进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程) 进程进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为&qu ...

  4. linux的进程/线程/协程系列5:协程的发展复兴与实现现状

    协程的发展复兴与实现现状 前言 本篇摘要: 1. 协同制的发展史 1.1 协同工作制的提出 1.2 自顶向下,无需协同 1.3 协同式思想的应用 2. 协程的复兴 2.1 高并发带来的问题 2.2 制 ...

  5. 线程/协程/异步的编程模型(CPU利用率为核心)

    最近看了一个b站博主的视频https://www.bilibili.com/video/av64066246/讲到了线程/协程/异步的编程模型,这里做下记录 1.线程 上篇文章有聊到进程和线程的关系, ...

  6. Go进程/线程/协程:单元 空间资源 切换 共享

    https://www.imooc.com/article/31751 进程process 线程 thread   协程goroutine 操作系统分为操作与资源两部分,操作就是方法,资源就是硬盘资源 ...

  7. Linux的进程/线程/协程系列4:进程知识深入总结:上篇

    Linux的进程/线程/协程系列4:进程/线程相关知识总结 前言 本篇摘要: 1. 进程基础知识 1.1 串行/并行与并发 1.2 临界资源与共享资源 1.3 同步/异步与互斥 1.4 进程控制原语 ...

  8. linux的进程/线程/协程系列3:查看linux内核源码——vim+ctags/find+grep

    linux的进程/线程/协程系列3:查看linux内核源码--vim+ctags/find+grep 前言 摘要: 1. 下载linux内核源码 2. 打标签方法:vim+ctags 2.1 安装vi ...

  9. linux的进程/线程/协程系列1:进程到协程的演化

    linux的进程/线程/协程系列1:进程到协程的演化 前言 摘要: 1. 一些历史:批处理时代 2. 现代操作系统启动过程 3. 进程(process)的出现 4. 线程(thread)与线程池 5. ...

  10. golang协程goroutine

    协程goroutine 概念 协程(英语:coroutine)是计算机程序的一类组件,推广了协作式多任务的子例程,允许执行被挂起与被恢复.相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那 ...

最新文章

  1. RabbitMQ 简介
  2. 2021年信息系统项目管理师考试大纲
  3. 反汇编最基础知识(段寄存器和寄存器的说明)
  4. ads s参数拟合_ADS S参数仿真介绍
  5. mybatis一对一联表查询的两种常见方式
  6. 2017.8.5 One-Dimensional 思考记录
  7. [bzoj1009](HNOI2008)GT考试 (kmp+矩阵快速幂加速递推)
  8. java线程和内核线程的,Java中内核线程理论及实例详解
  9. Flex之使用DragManager实现对象拖动
  10. Laravel框架简介与环境搭建
  11. word文本框中插入文本框_如何在Word中打印隐藏的文本
  12. 邮箱大佬告诉你电子邮箱格式如何正确书写
  13. Koo叔说Shader—UV旋转
  14. # gazebo 仿真
  15. 数据挖掘-关联分析频繁模式挖掘Apriori、FP-Growth及Eclat算法的JAVA及C++实现
  16. 量子计算更适用于优化:专访首家量子计算上市公司IonQ创始人 克里斯·门罗
  17. ImportError: packaging>=20.0 is required for a normal functioning of this mo
  18. 5年内的暴风骤雨:12诱因统领软件行业大革命【转载】
  19. 《Effective C++》读书摘要
  20. 淘宝Web服务器Tengine安装

热门文章

  1. Thinkphp在Nginx服务器下部署的问题--宝塔面板篇
  2. 多图片文件上传实现并通过 PostMan 测试
  3. 中兴2018年上半年业绩惨不忍睹,押宝5G建设能否让其起死回生?
  4. 基础算法----实现反转字符串
  5. 超级PK:Sybase与Oracle的十二场性能比拼
  6. 《转》解决struts2在(IE,Firefox)下载文件名乱码问题。
  7. 水晶報表之Datetime TO shortDate
  8. MyBatis 动态 SQL(认真看看, 以后写 SQL 就爽多了)
  9. 天天唠叨的MySQL优化,到底该怎么玩?
  10. Dubbo 的心跳设计,值得学习!