首页 > 其他分享 >协程原理 函数栈 有栈协程

协程原理 函数栈 有栈协程

时间:2024-12-31 12:54:37浏览次数:8  
标签:开销 协程 函数 有栈 线程 切换 内核

协程为什么开销小于线程

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

协程的缺点

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

协程实现相关概念

函数栈切换

栈帧

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

函数调用时的esp/ebp

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

有栈协程

独立栈

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

共享栈

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

标签:开销,协程,函数,有栈,线程,切换,内核
From: https://blog.csdn.net/LFY20031120/article/details/144835708

相关文章

  • WinCC VBscript常用标准函数总结
    在WinCC软件中使用VBS进行编程的时候常常使用的标准函数整理如下:数值型函数:abs(num):返回绝对值sgn(num):num>01;num=00;num<0-1;判断数值正负hex(num):返回十六进制值直接表示:&Hxx最大8位oct(num):返回八进制值直接表示:&Oxx最大8位sqr(num):返回平方根num>......
  • Python 使用装饰器 decorator 修改函数行为
    Python使用装饰器decorator修改函数行为使用装饰器修改函数行为使用带有返回值和参数的被装饰函数创建一个可以接受参数的装饰器使用多个装饰器使用装饰器修改函数行为Python中装饰器(decorator)的概念基于Decorator设计模式,这是一种结构化设计模式。此模式允许......
  • 在js中箭头函数如何获取参数?
    在JavaScript中,箭头函数获取参数的方式与普通函数非常相似。你可以通过在箭头函数的括号内列出参数名称来获取它们。这些参数在函数体内部作为局部变量使用。以下是一个简单的示例,展示了如何在箭头函数中获取和使用参数://定义一个箭头函数,它接受两个参数a和bconstadd=(a......
  • 在js中对箭头函数使用new会怎么样?
    在JavaScript中,你不能使用new关键字来调用箭头函数,因为箭头函数并没有自己的this值。箭头函数会捕获其所在上下文的this值,这是箭头函数的一个重要特性。当你尝试使用new关键字来调用箭头函数时,JavaScript会抛出一个错误。例如:constArrowFunc=()=>{};constinstance=new......
  • 在js中箭头函数可以当做Generator函数吗?
    在JavaScript中,箭头函数(ArrowFunctions)不能用作Generator函数。Generator函数是一种特殊类型的函数,允许函数在执行过程中被暂停和恢复,而不是只能从头到尾连续运行。它们通过使用function*语法进行定义,并且可以在函数体内部使用yield关键字来暂停函数的执行并返回一个值。箭头函......
  • 说说你对CSS中color-mix()函数的了解
    color-mix()是CSS中的一个函数,用于混合两种颜色以生成新的颜色。这个函数在CSSColorsLevel4规范中被引入,为前端开发者提供了一种更为动态和灵活的方式来处理和生成颜色。基本语法color-mix()函数的基本语法如下:color-mix(in<color-modulation>,<color1>,<color2>[......
  • 说说你对CSS中color-contrast()函数的了解
    color-contrast()是CSS中的一个提议中的函数,设计用于在给定背景色上自动选择一个具有高对比度的前景色,以确保文本的可读性和可访问性。这个函数的主要目标是简化开发人员为不同背景选择适当文本颜色的过程,同时确保满足无障碍性(accessibility)标准,如WCAG(WebContentAccessibili......
  • Excel 面试 02 逻辑函数 AND
    Excel中的AND函数用于测试多个条件是否全部为TRUE。如果所有条件都为TRUE,函数返回TRUE;如果有任何一个条件为FALSE,则返回FALSE。语法AND(logical1,[logical2],...)logical1,logical2,…:要测试的逻辑条件,可以是表达式(例如A1>10)、对单元格的引用、或者直接......
  • 字符函数和字符串函数
    字符函数和字符串函数1.字符分类函数需要包含头文件ctype.h2.字符转换函数tolower将参数传进去的⼤写字⺟转⼩写toupper将参数传进去的⼩写字⺟转⼤写3.strlen的使用格式为size_tstrlen(constchar*str);字符串以‘\0’作为结束标志,strlen函数返回......
  • SQL 实战:窗口函数进阶 – 实现复杂滑动窗口与动态累计计算
    窗口函数是SQL中非常强大的工具,能够在不改变原始数据粒度的情况下,动态进行排名、累计、滑动平均以及环比同比计算。在实际业务场景中,窗口函数常用于构建复杂的时间序列分析,如滚动累计、移动平均、同比/环比增长等。本文将深入探讨窗口函数的高级用法,通过具体案例展示如......