协程原理 函数栈 有栈协程

协程为什么开销小于线程

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

协程的缺点

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

协程实现相关概念

函数栈切换

栈帧

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

函数调用时的esp/ebp

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

有栈协程

独立栈

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

共享栈

  • 优点:节省内存。当协程挂起的时候,依据当前协程使用的栈空间大小来分配内存备份协程的栈内容。
  • 缺点:每次换入换出都有数据拷贝的过程
相关推荐
Fu_Lin_3 分钟前
Qt嵌入式从零基础到精通(01):Qt嵌入式开发全景图:从桌面Qt到ARM Linux
linux·arm开发·qt·qt5·嵌入式linux
lczllx12 分钟前
从 TCP 90μs 到 SHM 28μs:我的 RPC 框架零拷贝优化历程
linux·后端
盐焗鹌鹑蛋1 小时前
【Linux】权限
linux
小此方1 小时前
Re:Linux系统篇(四十六)信号篇·四:一文串联操作系统底层:时钟中断、内核态切换、系统调用与 Linux 信号处理全解析
linux·驱动开发·信号处理
无人生还别怕2 小时前
如何制作一个linux标准iso镜像
linux·iso·opencloudos·openanolisos
2401_8414956410 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
Yana.nice10 小时前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
DFT计算杂谈14 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
Zhang~Ling15 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind15 小时前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock