美文网首页
无栈协程原理

无栈协程原理

作者: 谭英智 | 来源:发表于2023-10-22 23:06 被阅读0次

背景

协程分为有栈协程和无栈协程

有栈协程在每次挂起的时候,都需要保存一份堆栈,来存储当前的上下文

当协程频繁的挂起时,就会消耗大量的计算在保存堆栈上。

为了解决这个问题,提出了无栈协程。

无栈协程也在协程每次挂起时,保存堆栈,当对于一个函数,它就只有一份堆栈,它派生出来的子函数,都公用这一份堆栈。

这样就减少了保存堆栈的次数,实现性能的提升

编译器如何支持无栈协程

源程序

void* f(int n) {
    void* hdl = CORO_BEGIN(malloc);
    for (int i = n;; ++i) {
        CORO_SUSPEND(hdl);
        print(i);
        CORO_SUSPEND(hdl);
        print(-i);
    }
    CORO_END(hdl, free);
}

编译后的程序

struct f.frame {
    int i;
};
void* f(int n) {
    void* hdl = CORO_BEGIN(malloc); //malloc or fetch
    f.frame* frame = (f.frame*)hdl;
    switch (frame->suspend_index) {
        case 1: goto r1;
        case 2: goto r2;
    }
    for (frame->i = n;; ++frame->i) {
        frame->suspend_index = 1;
    r1: CORO_SUSPEND(hdl);
        print(frame->i);
        frame->suspend_index = 2;
    r2: CORO_SUSPEND(hdl);
        print(-frame->i);
    }
    CORO_END(hdl, free);
}

通过把协程函数,转换成状态机,把函数的栈变量,通过申请一片堆内存来维护,当需要把协程挂起时,则保存当前函数的frame保存起来,需要resume时,则通过frame,再次调用函数

相关文章

  • [libco] 协程栈空间

    协程“栈”空间,有独立栈和共享栈,重点理解一下协程共享栈。 文章来源:[libco] 协程栈空间[https://...

  • 协程

    对于协程做一个整体的描述,从概念、原理、实现三个方面叙述。侧重有栈协程。 1 概览 1.1 什么是协程 有很多与协...

  • Asio无栈协程

    对于Asio无栈协程做一个比较全面的导引,从使用、原理和实现三个方面进行叙述。 官方文档:Asio Stackle...

  • Coroutines in C++20

    首先,希望读者已经在其他语言或库中了解协程的概念。C++20 终于带来了官方的协程,这是一种无栈的协程实现。 pr...

  • 并发编程-协程

    协程greenlet模块 (gevent实现原理)gevent模块 (注册协程,实现异步编程) 协程的应用eg:...

  • 初探 Swoft —— 安装

    Swoft 是首个基于 Swoole 原生协程的新时代 PHP 高性能协程全栈框架,内置协程网络服务器及常用的协程...

  • Kotlin 协程入门

    本文主要介绍协程长什么样子, 协程是什么东西, 协程挂起的实现原理以及整理了协程学习的资料. 协程 HelloWo...

  • Goroutine 随笔

    很早之前在lua中实现过一版协程,lua的栈是虚拟的,当要切换协程时虚拟栈不需要退栈,只需要从C的栈(物理栈)退出...

  • Kotlin Primer·第七章·协程库(上篇)

    本篇只讲了协程库的使用。还有中篇讲协程的启动和切换实现原理,下篇核心讲解kotlin协程在JVM层的实现原理。这可...

  • 协程

    协程,又称微线程,纤程。英文名Coroutine。协程是一种用户态的轻量级线程。协程拥有自己的寄存器上下文和栈。协...

网友评论

      本文标题:无栈协程原理

      本文链接:https://www.haomeiwen.com/subject/ewpdidtx.html