当前位置:网站首页>通俗的讲解,带你入门协程
通俗的讲解,带你入门协程
2022-07-06 11:24:00 【MICAHHH】
线程
为什么要先讲线程,因为协程和线程很像。
我们都知道线程是CPU调度的最小单位,线程的存在就是为了以更小的开销实现并发,在线程执行时间片用完之后(时间片只是其中一种策略)将线程暂停,保存好线程的状态(上下文),然后转而执行其他线程。
线程的存在,让CPU不会浪费时间去等待某个线程的IO等操作。(毕竟CPU并不负责IO)
线程(甚至说进程)的调度是操作系统实现的,线程切换的实现一般放在内核,中断处理程序也是放在内核。 从这个角度来说,如果线程当前处于用户态,若要发生线程切换,必然是要先要先进入内核态,发生状态切换的。如果是用户级线程,那么在用户态直接切换线程的栈和寄存器,就不需要进入内核态。(整体开销就小)
协程与普通函数的区别
来看看一般的函数,函数只有一个出口。
再看看协程,可以类似这种函数(有多个出口和入口,还可以保存返回点,后续继续)
void func() {
print("a")
挂起(暂停并返回)
print("b")
挂起(暂停并返回)
print("c")
}
协程的底层实现
函数调用关系可以在栈上实现,是一个个栈帧的出栈入栈。但是协程看做函数的话,栈帧出栈后这个栈帧后续还要使用(只是被挂起),那么此时需要将栈帧弹出后保存在堆中。
协程和线程的区别
协程是一种在用户态进行调度的线程,所以也被称为用户态线程。一个线程开启后,协程是可以跑在这个线程上的,你可以创建多个协程,关系是一对多,只需要一个线程就可以管理很多协程,实现高并发。协程比线程要轻量很多,也能省去很多开销。
协程的历史
协程这种概念早在1958年就已经提出来了,要知道这时线程的概念都还没有提出来。到了1972年,终于有编程语言实现了这个概念,这两门编程语言就是Simula 67 以及Scheme。这一时期还没有线程,如果你想在操作系统写出并发程序那么你将不得不使用类似协程这样的技术,后来线程开始出现,操作系统终于开始原生支持程序的并发执行,就这样,协程逐渐淡出了程序员的视线。直到近些年,随着互联网的发展,尤其是移动互联网时代的到来,服务端对高并发的要求越来越高,协程再一次重回技术主流,各大编程语言都已经支持或计划开始支持协程。
协程的应用
常见提供原生协程支持的语言有:c++20、golang、python、rust 等,其他语言以库的形式提供协程功能,比如 C++20 之前腾讯的 fiber 和 libco、Java协程的类库quasar提供的纤程(其实就是协程)。
参考资料
边栏推荐
- The nearest library of Qinglong panel
- 能源行业的数字化“新”运维
- R语言ggplot2可视化:使用ggpubr包的ggstripchart函数可视化分组点状条带图(dot strip plot)、设置add参数为不同水平点状条带图添加箱图
- R语言ggplot2可视化:使用ggpubr包的ggdotplot函数可视化点阵图(dot plot)、设置palette参数设置不同水平点阵图数据点和箱图的颜色
- The second day of rhcsa study
- Meilu biological IPO was terminated: the annual revenue was 385million, and Chen Lin was the actual controller
- php+redis实现超时取消订单功能
- Druid 数据库连接池 详解
- test about BinaryTree
- Online notes
猜你喜欢
史上超级详细,想找工作的你还不看这份资料就晚了
LeetCode-1279. 红绿灯路口
Handwritten online chat system (principle part 1)
星诺奇科技IPO被终止:曾拟募资3.5亿元 年营收3.67亿
How are you in the first half of the year occupied by the epidemic| Mid 2022 summary
Analysis of frequent chain breaks in applications using Druid connection pools
Mathematical knowledge -- code implementation of Gaussian elimination (elementary line transformation to solve equations)
Solution of commercial supply chain management platform for packaging industry: layout smart supply system and digitally integrate the supply chain of packaging industry
Binary search tree
Pychrm Community Edition calls matplotlib pyplot. Solution of imshow() function image not popping up
随机推荐
Handwritten online chat system (principle part 1)
倒计时2天|腾讯云消息队列数据接入平台(Data Import Platform)直播预告
上海部分招工市場對新冠陽性康複者拒絕招錄
short i =1; i=i+1与short i=1; i+=1的区别
Benefit a lot, Android interview questions
openmv4 学习笔记1----一键下载、图像处理背景知识、LAB亮度-对比度
Abstract classes and abstract methods
php+redis实现超时取消订单功能
Yutai micro rushes to the scientific innovation board: Huawei and Xiaomi fund are shareholders to raise 1.3 billion
[translation] a GPU approach to particle physics
Meilu biological IPO was terminated: the annual revenue was 385million, and Chen Lin was the actual controller
R language uses rchisq function to generate random numbers that conform to Chi square distribution, and uses plot function to visualize random numbers that conform to Chi square distribution
包装行业商业供应链管理平台解决方案:布局智慧供应体系,数字化整合包装行业供应链
Use map function and split function to type multiple elements in one line
黑马--Redis篇
A method of removing text blur based on pixel repair
R语言ggplot2可视化:使用ggpubr包的ggstripchart函数可视化分组点状条带图(dot strip plot)、设置add参数为不同水平点状条带图添加箱图
Simple understanding of MySQL database
青龙面板最近的库
First day of rhcsa study