美文网首页
[libco] 协程调度

[libco] 协程调度

作者: wenfh2020 | 来源:发表于2021-11-11 06:46 被阅读0次

libco 通过 co_resumeco_yield 交替调度协程。

文章来源:[libco] 协程调度


1. 协程调度

设计图来源:libco 协程调度


1.1. 协程数组

pCallStack 协程数组,保存当前正在执行协程(<font color=red>注意</font>:并不是所有协程)。

pCallStack[0] 是主协程,env->pCallStack[env->iCallStackSize - 1] 是当前协程。

一般情况下数组大小为 2,子协程在主协程里创建。除非在子协程里嵌套创建唤醒新的协程,这个协程数组大小才会一直被累加 env->iCallStackSize++,直到嵌套深度达到 128 才会出现堆栈溢出,这种应用场景嵌应该不常见。

struct stCoRoutineEnv_t {
    stCoRoutine_t *pCallStack[128]; /* 协程数组。 */
    int iCallStackSize;             /* 协程数组元素个数。 */
    ...
};

1.2. 启动协程 co_resume

void co_resume(stCoRoutine_t *co) {
    stCoRoutineEnv_t *env = co->env;
    stCoRoutine_t *lpCurrRoutine = env->pCallStack[env->iCallStackSize - 1];
    ...
    env->pCallStack[env->iCallStackSize++] = co;
    co_swap(lpCurrRoutine, co);
}

1.3. 挂起协程 co_yield

void co_yield_env(stCoRoutineEnv_t *env) {
    stCoRoutine_t *last = env->pCallStack[env->iCallStackSize - 2];
    stCoRoutine_t *curr = env->pCallStack[env->iCallStackSize - 1];
    env->iCallStackSize--;
    co_swap(curr, last);
}

1.4. 协程执行函数

static int CoRoutineFunc(stCoRoutine_t *co,void *) {
    if (co->pfn) {
        /* pfn 协程执行函数。 */
        co->pfn(co->arg);
    }
    co->cEnd = 1;
    stCoRoutineEnv_t *env = co->env;
    co_yield_env(env);
    return 0;
}

2. 参考

相关文章

  • [libco] 协程调度

    libco 通过 co_resume 和 co_yield 交替调度协程。 文章来源:[libco] 协程调度[h...

  • Libco协程库实现(二)

    这里补充下libco后续对于协程间切换的汇编新实现,原来的实现方法之前分析过Libco协程库实现,早期分析的时候有...

  • [libco] 协程栈空间

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

  • [Android] 深入理解Kotlin协程

    Kotlin协程 协程由程序自己创建和调度,不需要操作系统调度,所以协程比线程更加轻量。相比于线程的切换,协程切换...

  • Libco协程库实现

    腾讯开源的Libco协程库,以前看过部分源码,所有的协程都用数组模拟栈表示,里面使用到的技术点有hook系统函数,...

  • 协程

    协程与线程 线程的调度是由操作系统负责,协程调度是程序自行负责 与线程相比,协程减少了无谓的操作系统切换 协程实际...

  • 十分钟看懂:Java并发——协程

    协程 协程可以理解为一种轻量级的线程 从操作系统的角度来看,线程是在内核态中调度的,而协程是在用户态调度的,协程的...

  • fastcgi 异步实现和协程实现比较

    介绍 异步模型和协程模型都是原fastcgi的优化模型。 cocgi是使用腾讯开源库libco实现的协程模式的fa...

  • [libco] 协程切换理解思路

    程切换,可以理解为函数运行时上下文切换。 文章来源:[libco] 协程切换理解思路[https://wenfh2...

  • Openresty协程调度对比Go协程调度

    在web编程领域,Openresty与Go均有十分优秀的处理能力,在面对高并发的web编程,两者一般都是首选的技术...

网友评论

      本文标题:[libco] 协程调度

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