当前位置: 首页 > news >正文

协程原理 函数栈 有栈协程

协程为什么开销小于线程

  • 协程本质上是线程,将调度的代码在用户态重新实现,因为子程序切换不是线程切换而是由程序自身控制,没有线程切换的开销,所以执行效率高。协程通常是纯软件实现的多任务,与CPU和操作系统通常没有关系,跨平台,跨体系结构
  • 协程在执行过程中可以调用别的协程,自己则中途退出执行,之后又从调用别的协程的地方恢复执行。
  • 对于线程而言,其上下文存储在内核栈中。线程的上下文切换必须先进入内核态,这就造成了开销。线程的结构在内核中(就是进程的task_struct,只不过少了一些信息),因此需要进入内核态开销大。因此协程上下文切换开销少

协程的缺点

  • 无法利用多核CPU:协程的本质是单线程(比如一个单线程,多个协程),它不能将一个多核处理器的多个核同时用上,协程需要和进程配合才能用在多核CPU上。
  • 进行阻塞操作(如IO时)会阻塞掉整个程序

协程实现相关概念

函数栈切换

栈帧

栈帧是指为一个函数调用单独分配的那部分栈空间,比如一个运行的函数调用另一个函数,就要进入一个新的栈帧。原来函数的栈帧称为调用者函数的帧,新的栈帧称为被调用函数的帧(当前帧)。被调用者函数运行结束后当前帧全部回收,回到调用者的帧。

函数调用时的esp/ebp

  • esp:栈顶指针
  • ebp:栈底指针
  • 返回地址:指明当B返回的时候,要从A程序的哪个位置继续执行

有栈协程

独立栈

  • 缺点:独立栈往往会更加的浪费内存。因为,我们需要为每一个协程预先分配一个栈空间,但是问题是协程不一定会用完这个栈空间,而那些多出来的栈空间就是被浪费掉了的。而且空间太小也会有爆栈的隐患。
  • 优点:每次切换协程的时候,不需要对栈进行拷贝。(相比于共享栈)

共享栈

  • 优点:节省内存。当协程挂起的时候,依据当前协程使用的栈空间大小来分配内存备份协程的栈内容。
  • 缺点:每次换入换出都有数据拷贝的过程


http://www.mrgr.cn/news/82047.html

相关文章:

  • 多层设计模式:可否设计各层之间公用的数据定义模块?
  • 解密人工智能:如何改变我们的工作与生活
  • [极客大挑战 2019]Knife1
  • linux 系统 mysql :8.4.3 主从复制 教程及运维命令
  • 持续学习入门
  • Mysql学习笔记之约束
  • 有限元分析学习——Anasys Workbanch第一阶段笔记(2)应力奇异及位移结果对比、初步了解单元的基本知识
  • 大数据组件(一)快速入门调度组件Airflow
  • 人形机器人全身运动规划相关资料与文章
  • PaddleOCROCR关键信息抽取训练过程
  • 蓝桥杯(Java)(ing)
  • 【网络安全实验室】基础关实战详情
  • 沪深捉妖记(一)探寻妖股的特征
  • 数据结构与算法之动态规划: LeetCode 3105. 最长的严格递增或递减子数组 (Ts版)
  • Nginx - 整合lua 实现对POST请求的参数拦截校验(不使用Openresty)
  • L25.【LeetCode笔记】 三步问题的四种解法(含矩阵精彩解法!)
  • SAP SD信贷管理信用管理手册(下)
  • 通义千问QvQ-72B-Preview模型部署
  • FOC控制原理-ADC采样时机
  • HarmonyOS NEXT应用开发实战:免费练手的网络API接口分享
  • 数据结构与算法之动态规划: LeetCode 1143. 最长公共子序列 (Ts版)
  • 后端开发-Maven
  • 细说STM32F407单片机CAN基础知识及其HAL驱动程序
  • FPGA多路红外相机视频拼接输出,提供2套工程源码和技术支持
  • 数据结构与算法之动态规划: LeetCode 674. 最长连续递增序列 (Ts版)
  • 配置中心 之 apollo