协程调度器实现与性能测试

主要通过以下10个方面来了解协程的原理:

  1. 为什么会有协程,协程解决什么问题?
  2. 协程的原语
  3. 协程的切换
  4. 协程的运行流程
  5. 协程的结构体定义
  6. 协程调度的策略
  7. 协程调度器如何定义
  8. 协程api的实现,hook
  9. 协程的多核模式
  10. 协程如何测试

1-4在《协程的设计与汇编实现》中已经介绍过。本文主要介绍6-10

协程结构体定义

struct coroutine {
   
   

    struct cpu_register_set *set; // 保存CPU寄存器组

    void *func; // coroutine_entry, 协程入口函数
    void *arg;

    void *retval; // 协程返回值,协程如果不做计算相关的,可以不要返回值;做io可以不需要

    void *stack_addr; // 协程栈,函数调用的作用;存储一对大括号内的临时变量;调用一次压栈,return出栈
    size_t stack_size; 
    // 共享栈 or 独立栈
    // 共享栈,也叫全局栈,所有协程共用一个栈。隔离性比较差,不推荐。实现很麻烦
    // 独立栈,每个协程分配独立空间

    //struct coroutine *next;

    queue_node(ready_queue, coroutine) *ready;
    rbtree_node(coroutine) *wait; // 等待io操作
    rbtree_node(coroutine) *sleep; // optional
};

struct cpu_register_set *set;,用来保存CPU寄存器组;

func和arg,表示协程的入口函数和参数。

协程创建与线程类似,coroutine_create(entry_cb, arg);

线程创建,pthread_create(&thid, NULL, entry_cb, arg);; 在内核里面创建一个线程实体,并把它加入到就绪队列;entry_cb的调用,跟pthread_create没有关系。它的调用,是因为调度器抓取了一个线程,开始运行。

void *retval;,协程返回值,协程如果不做计算相关的,可以不要返回值;**做io可以不需要,**我们实现的时候,没有实现返回值。返回值可以参考线程的方式。

线程的返回值通过pthread_join(pthread_t thread, void **retval)获取到,线程的返回值存在这里,等待子线程退出,或者子线程返回的值。

父协程如果如果要获取子协程的返回值,可以用类似的方式:

// 父协程中进行join
coroutine_join(coid, &ret) {
   
   

    co = search(coid)
    while (co->ret == NULL) {
   
   
        wait
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值