【golang】协程和线程的区别
线程是系统调度的基本单位。go协程由go语言运行时的调度器进行调度,操作系统内核感知不到协程的存在。
在多核处理场景中,线程是并发与并行同时存在的,而go协程依托于线程,因此多核处理场景下,go协程也是并发与并行同时存在的。因为go协程从属于某一个线程,所以即便在单核处理器上某一时刻运行一个线程,在线程内go语言调度器也会切换多个协程执行,这时协程是并发的。在多核心处理器上,如果多个协程被分配给了不同的线程,而这些线程同时被不同的CPU核心所处理,这时协程就是并行处理的。
go协程与线程存在着很多不同之处:
1.调度方式
线程: 线程是根据CPU时间片进行抢占式调度的。操作系统通过中断信号(定时器中断、I/O设备中断等)执行线程的上下文切换。当发生线程上下文切换时,需要从操作系统用户态转移到内核态,并保存状态信息;当切换到下一个要执行的线程时,需要加载状态信息并从内核态转移到操作系统用户态。
协程: 协程存在于用户态,由go语言运行时调度器进行调度。协程从属于某一个线程,多个协程可以调度到一个线程中,一个协程也可能切换到多个线程中执行,因此协程与线程是多对多(M:N)的关系。
2.调度策略
线程: 抢占式调度。操作系统调度器为了均衡每个线程的执行周期,会定时发出中断信号强制执行线程上下文切换。
协程: 协作式调度。一个协程处理完自己的任务后,可以主动将执行权限让渡给其他协程,不会被轻易抢占。只有在协程运行了过长时间后,go语言调度器才会强制抢占其执行。
3.上下文切换速度
线程: 线程上下文的切换需要经过操作系统用户态与内核态的切换,切换速度大约为1~2微秒。
协程: 协程属于用户态轻量级的线程,协程的切换不需要经过用户态与内核态的切换,且切换时只需要保存极少的状态值,因此切换速度快数倍,大约为0.2微秒左右。(大约10倍于线程的切换速度)
4.栈的大小
线程: 线程的栈大小一般是在创建时指定的,linux及mac上默认的栈大小一般为8MB。
协程: go协程栈大小默认为2KB。
【golang】协程和线程的区别相关推荐
- Go 面试官:什么是协程,协程和线程的区别和联系?
大家好,我是煎鱼. 最近金三银四,是面试的季节.在我的 Go 读者交流群里出现了许多小伙伴在讨论自己面试过程中所遇到的一些 Go 面试题. 今天的男主角,是工程师的必修技能,那就是 "什么是 ...
- 什么是协程,协程和线程的区别和联系?
1 进程 进程是什么 进程是操作系统对一个正在运行的程序的一种抽象,进程是资源分配的最小单位. 进程在操作系统中的抽象表现 为什么有进程 为什么会有 "进程" 呢?说白了还是为了合 ...
- 协程和线程的区别、协程原理与优缺点分析、在Java中使用协程
文章目录 什么是协程 协程的优点与缺点 协程实现原理. 协程与线程在不同编程语言的实现 在Java中使用协程 Kilim介绍 Kilim整合Java,使用举例 小总结 什么是协程 相对于协程,你可能对 ...
- Unity协程和线程的区别
先简要说下结论: 协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆栈,自己的局部变量,有自己的指令指针(IP,instruction pointer),但与其它协同程序共享全局变 ...
- Unity中协程与线程的区别
本文转载自:https://blog.csdn.net/qq_25122429/article/details/80481443 协同程序(coroutine)与多线程情况下的线程比较类似:有自己的堆 ...
- Unity中协程和线程的区别
协程(协同程序): 同一时间只能执行某个协程.开辟多个协程开销不大.协程适合对某任务进行分时处理. 线程: 同一时间可以同时执行多个线程.开辟多条线程开销很大.线程适合多任务同时处理. 参考:http ...
- go语言协程和线程区别
go语言协程和线程区别 一.线程和协程区别 主线程是一个物理线程,直接作用在 cpu 上的.是重量级的,非常耗费 cpu 资源. Go 主线程(/也可以理解成进程)一个 Go 线程上,可以起多个协程. ...
- python协程和线程区别_python 协程 及其与python多线程的区别和联系
协程(coroutine)又称微线程,纤程,是种用户级别的轻量级线程. 协程拥有自己的寄存器上下文和栈.协程调度切换时候,将寄存器上下文和栈保存到其他地方,等待切换回来的时候恢复,并从之前保存的寄存器 ...
- 抽丝剥茧聊Kotlin协程之协程与线程之间的区别
1. 前言 关于协程,可能大家最经常听到的一句话就是"协程是轻量级的线程".一脸懵逼,有没有?这可是官方的slogan,严格意义上讲,一方面官方是想让大家把协程和线程产生一个直观关 ...
最新文章
- python递归使用
- Android实用代码七段(五)
- 免费资源 | ActiveReports 报表控件发布多平台 Demo 代码集合
- batch_size 和 fetch_size作用
- CentOS修改MySql数据库目录datadir
- configure: error: Please fix the library issues listed above and try again.解决方案
- Android应用开发-图片加载库Glide
- 写出python字符串三种常用的函数或方法_python中几种常用字符串函数
- LVS+piranha(多实例配置) 转载
- Linux环境编译时报错/lib64/libdl.so.2: could not read symbols: Invalid operation
- sqlmap源码入门笔记系列
- php切割文件上传,php+ajax实现文件切割上传功能示例
- Linux内存管理:内存描述之内存节点node
- 常见笔顺错误的字_最全汉字笔顺正确写法,建议家长为孩子收藏
- 三维重建笔记_SFM(Structure from Motion)
- 快应用开发教程【01】--环境与调试
- 对可道云KodExplorer去掉版权简单破解方法
- matlab中rand函数
- 【上海 >>无锡】自驾两日游
- java jdk安装失败_图文解答Java JDK9.0安装失败的原因,附带处理方法
热门文章
- 冒泡排序最好时间复杂度为n的代码修改
- 做你的树洞+更新句子 毒鸡汤
- opencv的安装及使用
- echarts小贴纸之字体颜色更改
- 优化算法SGD/ASGD/AdaGrad/Adadelta/RMSprop/Adam/Adamax/SparseAdam/L-BFGS/Rprop
- HTML中的6种空格
- json 转成 JsonNode 对象与JsonNode 对象转成 json简例
- sharesdk分享失败404_shareSDK微信分享图片url识别失败
- swt text设置文本宽_应用笔画宽度变换(SWT)来检测自然场景中的文本
- Java使用Criteria实现多条件查询