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

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

作者: C_GO流媒体后台开发 | 来源:发表于2018-10-20 16:41 被阅读61次

    目录

    8.协程实现之调度器

    8.0 前言

      问题:协程如何被调度?

      调度器的实现,有两种方案,一种是生产者消费者模式,另一种多状态运行。

    8.1 生产者消费者模式

    生产者消费者模式

      逻辑代码如下:

    while (1) {
    
            //遍历睡眠集合,将满足条件的加入到ready
            nty_coroutine *expired = NULL;
            while ((expired = sleep_tree_expired(sched)) != ) {
                TAILQ_ADD(&sched->ready, expired);
            }
    
            //遍历等待集合,将满足添加的加入到ready
            nty_coroutine *wait = NULL;
            int nready = epoll_wait(sched->epfd, events, EVENT_MAX, 1);
            for (i = 0;i < nready;i ++) {
                wait = wait_tree_search(events[i].data.fd);
                TAILQ_ADD(&sched->ready, wait);
            }
    
            // 使用resume回复ready的协程运行权
            while (!TAILQ_EMPTY(&sched->ready)) {
                nty_coroutine *ready = TAILQ_POP(sched->ready);
                resume(ready);
            }
        }
    
    

    8.2 多状态下运行

    多状态下运行

      逻辑代码如下:

    while (1) {
    
            //遍历睡眠集合,使用resume恢复expired的协程运行权
            nty_coroutine *expired = NULL;
            while ((expired = sleep_tree_expired(sched)) != ) {
                resume(expired);
            }
    
            //遍历等待集合,使用resume恢复wait的协程运行权
            nty_coroutine *wait = NULL;
            int nready = epoll_wait(sched->epfd, events, EVENT_MAX, 1);
            for (i = 0;i < nready;i ++) {
                wait = wait_tree_search(events[i].data.fd);
                resume(wait);
            }
    
            // 使用resume恢复ready的协程运行权
            while (!TAILQ_EMPTY(sched->ready)) {
                nty_coroutine *ready = TAILQ_POP(sched->ready);
                resume(ready);
            }
        }
    
    

    更多分享

    email: 1989wangbojing@163.com
    email: lizhiyong4360@gmail.com
    email: 592407834@qq.com
    协程技术交流群:829348971

    相关文章

      网友评论

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

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