Linux高性能网络:协程系列05-协程实现之原语操作
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Linux高性能网络:协程系列05-协程实现之原语操作,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2765字,纯文字阅读大概需要4分钟。
内容图文
![Linux高性能网络:协程系列05-协程实现之原语操作](/upload/InfoBanner/zyjiaocheng/980/1371f9b47df34f2fa60d75dcd066e6f9.jpg)
目录
- Linux高性能网络:协程系列01-前言
- Linux高性能网络:协程系列02-协程的起源
- Linux高性能网络:协程系列03-协程的案例
- Linux高性能网络:协程系列04-协程实现之工作原理
- Linux高性能网络:协程系列05-协程实现之原语操作
- Linux高性能网络:协程系列06-协程实现之切换
- Linux高性能网络:协程系列07-协程实现之定义
- Linux高性能网络:协程系列08-协程实现之调度器
- Linux高性能网络:协程系列09-协程性能测试
- [Linux高性能网络:协程系列10 待续]()
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的地方。
更多分享
email: 1989wangbojing@163.com
email: lizhiyong4360@gmail.com
email: 592407834@qq.com
协程技术交流群:829348971
内容总结
以上是互联网集市为您收集整理的Linux高性能网络:协程系列05-协程实现之原语操作全部内容,希望文章能够帮你解决Linux高性能网络:协程系列05-协程实现之原语操作所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。