栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

通俗的讲解,带你入门协程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

通俗的讲解,带你入门协程

目录
      • 线程
      • 协程与普通函数的区别
      • 协程的底层实现
      • 协程和线程的区别
      • 协程的历史
      • 协程的应用
      • 参考资料

线程

为什么要先讲线程,因为协程和线程很像。

我们都知道线程是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提供的纤程(其实就是协程)。

参考资料
  1. 进程内线程切换会触发内核态与用户态的切换吗? - DearFuture的回答 - 知乎
  2. 线程和协程的区别的通俗说明
  3. 码农的荒岛求生《程序员应如何理解高并发中的协程》
  4. 协程简介(coroutine)
  5. Java中的“协程”
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003732.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号