Linux高性能网络:协程系列05-协程实现之原语操作

目录

5.协程的实现之原语操作

  问题:协程的内部原语操作有哪些?分别如何实现的?
  协程的核心原语操作:create, resume, yield。协程的原语操作有create怎么没有exit?以NtyCo为例,协程一旦创建就不能有用户自己销毁,必须得以子过程执行结束,就会自动销毁协程的上下文数据。以_exec执行入口函数返回而销毁协程的上下文与相关信息。co->func(co->arg) 是子过程,若用户需要长久运行协程,就必须要在func函数里面写入循环等操作。所以NtyCo里面没有实现exit的原语操作。

create:创建一个协程

  1. 调度器是否存在,不存在也创建。调度器作为全局的单例。将调度器的实例存储在线程的私有空间pthread_setspecific。
  2. 分配一个coroutine的内存空间,分别设置coroutine的数据项,栈空间,栈大小,初始状态,创建时间,子过程回调函数,子过程的调用参数。
  3. 将新分配协程添加到就绪队列 ready_queue中。

  实现代码如下:

int nty_coroutine_create(nty_coroutine **new_co, proc_coroutine func, void *arg) {

    assert(pthread_once(&sched_key_once, nty_coroutine_sched_key_creator) == 0);
    nty_schedule *sched = nty_coroutine_get_sched();

    if (sched == NULL) {
        nty_schedule_create(0);

        sched = nty_coroutine_get_sched();
        if (sched == NULL) {
            printf("Failed to create scheduler\n");
            return -1;
        }
    }

    nty_coroutine *co = calloc(1, sizeof(nty_coroutine));
    if (co == NULL) {
        printf("Failed to allocate memory for new coroutine\n");
        return -2;
    }

    //
    int ret = posix_memalign(&co->stack, getpagesize(), sched->stack_size);
    if (ret) {
        printf("Failed to allocate stack for new coroutine\n");
        free(co);
        return -3;
    }

    co->sched = sched;
    co->stack_size = sched->stack_size;
    co->status = BIT(NTY_COROUTINE_STATUS_NEW); //
    co->id = sched->spawned_coroutines ++;
co->func = func;

    co->fd = -1;
co->events = 0;

    co->arg = arg;
    co->birth = nty_coroutine_usec_now();
    *new_co = co;

    TAILQ_INSERT_TAIL(&co->sched->ready, co, ready_next);

    return 0;
}

yield:让出CPU

void nty_coroutine_yield(nty_coroutine *co)

  参数:当前运行的协程实例
  调用后该函数不会立即返回,而是切换到最近执行resume的上下文。该函数返回是在执行resume的时候,会有调度器统一选择resume的,然后再次调用yield的。resume与yield是两个可逆过程的原子操作。

resume:恢复协程的运行权

int nty_coroutine_resume(nty_coroutine *co)

  参数:需要恢复运行的协程实例
  调用后该函数也不会立即返回,而是切换到运行协程实例的yield的位置。返回是在等协程相应事务处理完成后,主动yield会返回到resume的地方。

更多分享

email: [email protected]
email: [email protected]
email: [email protected]
协程技术交流群:829348971

原文地址:http://blog.51cto.com/240630/2306850

时间: 2024-11-09 09:51:27

Linux高性能网络:协程系列05-协程实现之原语操作的相关文章

Linux高性能网络:协程系列01-前言

协程 我们只听说过进程和线程,没有听说过协程,协程是个什么东西呢?我们的go语言,node.js语言的实现都使用到了协程,go的高效就不再细说了,那为什么使用了协程会让我们的后台程序变得高效呢?如果我们心里有这些疑问,那么请继续阅读本书和了解我们实现的开源库ntyco. 目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系

Linux高性能网络:协程系列09-协程性能测试

目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系列05-协程实现之原语操作 Linux高性能网络:协程系列06-协程实现之切换 Linux高性能网络:协程系列07-协程实现之定义 Linux高性能网络:协程系列08-协程实现之调度器 Linux高性能网络:协程系列09-协程性能测试 [Linux高性能网络:协程系列10

Linux高性能网络:协程系列07-协程实现之定义

目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系列05-协程实现之原语操作 Linux高性能网络:协程系列06-协程实现之切换 Linux高性能网络:协程系列07-协程实现之定义 Linux高性能网络:协程系列08-协程实现之调度器 Linux高性能网络:协程系列09-协程性能测试 [Linux高性能网络:协程系列10

Linux高性能网络:协程系列08-协程实现之调度器

目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系列05-协程实现之原语操作 Linux高性能网络:协程系列06-协程实现之切换 Linux高性能网络:协程系列07-协程实现之定义 Linux高性能网络:协程系列08-协程实现之调度器 Linux高性能网络:协程系列09-协程性能测试 [Linux高性能网络:协程系列10

Linux高性能网络:协程系列06-协程实现之切换

目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系列05-协程实现之原语操作 Linux高性能网络:协程系列06-协程实现之切换 Linux高性能网络:协程系列07-协程实现之定义 Linux高性能网络:协程系列08-协程实现之调度器 Linux高性能网络:协程系列09-协程性能测试 [Linux高性能网络:协程系列10

Linux高性能网络:协程系列02-协程的起源

目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系列05-协程实现之原语操作 Linux高性能网络:协程系列06-协程实现之切换 Linux高性能网络:协程系列07-协程实现之定义 Linux高性能网络:协程系列08-协程实现之调度器 Linux高性能网络:协程系列09-协程性能测试 [Linux高性能网络:协程系列10

Linux高性能网络:协程系列04-协程实现之工作原理

目录 Linux高性能网络:协程系列01-前言 Linux高性能网络:协程系列02-协程的起源 Linux高性能网络:协程系列03-协程的案例 Linux高性能网络:协程系列04-协程实现之工作原理 Linux高性能网络:协程系列05-协程实现之原语操作 Linux高性能网络:协程系列06-协程实现之切换 Linux高性能网络:协程系列07-协程实现之定义 Linux高性能网络:协程系列08-协程实现之调度器 Linux高性能网络:协程系列09-协程性能测试 [Linux高性能网络:协程系列10

7Python全栈之路系列之协程

Python全栈之路系列之协程 What is the association? 与子例程一样,协程也是一种程序组件. 相对子例程而言,协程更为一般和灵活,但在实践中使用没有子例程那样广泛. 协程源自Simula和Modula-2语言,但也有其他语言支持. 协程更适合于用来实现彼此熟悉的程序组件,如合作式多任务,迭代器,无限列表和管道. 来自维基百科 https://zh.wikipedia.org/wiki/协程 协程拥有自己的寄存器上下文和栈,协程调度切换时,将寄存器上下文和栈保存到其他地方

Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为文末的链接,以及自己的补充理解. 完整代码 1 #!/usr/bin/python 2 # ============================================================= 3 # File Name: async_base.py 4 # Author: L