目录

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

问题:协程的内部原语操作有哪些?分别如何实现的?

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

create:创建一个协程

调度器是否存在,不存在也创建。调度器作为全局的单例。将调度器的实例存储在线程的私有空间pthread_setspecific。

分配一个coroutine的内存空间,分别设置coroutine的数据项,栈空间,栈大小,初始状态,创建时间,子过程回调函数,子过程的调用参数。

将新分配协程添加到就绪队列 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的地方。

更多分享

linux控制协程参数,Linux高性能网络:协程系列05-协程实现之原语操作相关推荐

  1. linux设置sfq队列参数,Linux系统运维之Linux高级流量控制工具TC使用方法

    Linux系统运维之Linux高级流量控制工具TC使用方法 本文标签: 运维 流量劫持 Linux系统运维之Linux高级流量控制工具TC使用方法, 在做MHA测试的时候,有一个重要的环节就是测试MH ...

  2. linux线程多参数传递参数,Linux中多线程编程并传递多个参数

    解析Linux中多线程编程并传递多个参数 Linux中多线程编程并传递多个参数实例是本文讲解的内容,不多说,先来看内容. Linux下的多线程编程,并将多个参数传递给线程要执行的函数. 以下是实验程序 ...

  3. linux控制终端关机命令,linux定时关机命令?linux立即关机命令?终端切换界面?windows定时关机和linux定时关机的方法(shut...

    你是否正在寻找关于linux定时关机命令的内容?让我把最完整的东西奉献给你: windows定时关机和linux定时关机的方法(shutdown命令) 作者:佚名 字体:[ ] 来源:互联网 时间:0 ...

  4. linux控制协程参数,Linux高性能网络:协程系列06-协程实现之切换-Go语言中文社区...

    目录 6.协程实现之切换 问题:协程的上下文如何切换?切换代码如何实现? 首先来回顾一下x86_64寄存器的相关知识.x86_64 的寄存器有16个64位寄存器,分别是:%rax, %rbx, %rc ...

  5. linux my.cnf基本参数,Linux中MySQL配置文件my.cnf参数说明

    MySQL参数优化这东西不好好研究还是比较难懂的,其实不光是MySQL,大部分程序的参数优化,是很复杂的.MySQL的参数优化也不例外,对于不同的需求,还有硬件的配置,优化不可能又最优选择,只能慢慢的 ...

  6. linux控制usb接口供电,Linux里控制USB口的供电

    原文链接http://scateu.me/2016/05/30/linux-toggle-usb-power.html 保存一下 方法一 偶然间获得一个USB LED灯. 正好家里有OpenWrt的路 ...

  7. linux怎样查看内核参数,Linux 实例如何查看和修改 Linux 实例内核参数?

    <操作系统>课程设计报告课程设计题目:操作系统课程设计 设计时间:2016/1/10一. 课程设计目的与要求需要完成的内容:(1) 安装虚拟机:Vmware.Vmware palyer ( ...

  8. linux 安装 加入内核参数,Linux 实现自动安装服务组件以及优化内核参数

    安装好Linux裸机后(安装请参考: http://www.linuxidc.com/Linux/2014-12/111062.htm),还需要在其上安装一些基础组件,一般是手动一个个安装,比较繁复也 ...

  9. linux内核优化哪些参数,linux内核参数优化 互联网技术圈 互联网技术圈

    一.修改最大进程数 系统允许创建的最大进程数量即是max user processes 这个参数. 我们可以使用 ulimit -u 65535 修改max user processes的值,但是只能 ...

最新文章

  1. 【实验】利用系统自带脚本utlsampl.sql创建scott用户及样本数据
  2. pythonlbp纹理提取_Python + OpenCV 实现LBP特征提取的示例代码
  3. 2.2.3 C语言中的整数类型及类型转换(为什么强制类型转换值发生改变?带你从机器码的角度分析)
  4. linux系统数据落盘之细节
  5. python写内存挂_编写高效内存Python代码的3个技巧
  6. 计算机实训教学论文,计算机实训教学探索论文
  7. 滴滴货运首批试点城市揭晓 23日起在成都、杭州上线
  8. erlang supervisor中启动普通的进程
  9. oracle 创建表格乱码,数据库导出excel表格是乱码怎么办-oracle 导出excel 乱码怎么办...
  10. java使用图灵机器人,Java 调用图灵机器人
  11. 基于ZYNQ、AM5728、AM5708、AM437x、AM335x、STM32+FPGA等平台提供了开源EtherCAT主站IgH案例
  12. 实用工具系列 - FileZilla安装下载与使用
  13. 华为ICT学院2.0计划发布,未来5年培养全球200万ICT人才
  14. [转载]美国名校的与机器视觉相关的研发中心网址
  15. 低成本多串口ARM9工控主板解决方案
  16. android 全套安装包,原神1.1直装版下载-原神1.1完整安装包v1.1安卓版下载_飞翔下载...
  17. 图的深度广度优先遍历(DFC与BFC)JavaScript版
  18. springboot项目接入短信
  19. 不走寻常路的常识逻辑学家:Lisp之父约翰•麦卡锡
  20. 全国计算机好还是办公软件好,亲身体验8款好用的电脑办公软件,推荐使用

热门文章

  1. 从现在开始,争取记录每天所学到的、所感受到的、所遇见到的点点滴滴!
  2. ZT 为什么pthread_cond_t要和pthread_mutex_t同时使用 || pthread/Linux多线程编程
  3. [svc]容器网络学习索引及网络监控
  4. 对软件工程这门课的期望
  5. HTML5 Audio标签API整理(一)
  6. Python3.x爬虫教程:爬网页、爬图片、自己主动登录
  7. HDU2031 进制转换
  8. ASP.NET - JQuery的.getJSON给Dropdownlist绑定Item
  9. GNOME界面简单使用
  10. 解决Git无法同步空文件夹的问题