2.3.1 协程设计原理与汇编实现

简介: 2.3.1 协程设计原理与汇编实现

1.为什么要有协程?

同步的编程方式,异步的性能。同步编程时,我们需要等待io就绪。但是在协程这里,我们使用一种机制,当io需要等待时,就切到下一个io,之后当之前的io就绪时,再切换回来继续处理就绪事件。

2.协程的原语操作

yield 让出

resume 恢复

3.协程的切换

切换有三种方式

1.setjmp/longjmp

2.ucontext

3.asm code

汇编实现切换的优缺点

1.性能较高

2.容易理解

3.容易实现

a.有门槛

b.不同体系机构,汇编代码不一样

c.跨平台较弱

4.协程的struct如何定义

5.协程的scheduler如何定义

6.调度策略如何实现

7.如何与posix api兼容

8.协程多核模式

9.协程的性能如何测试?

sync() {
  send(request);
  recv(response);
}
response_cb() {
  recv();
}
async() {
  send(request, response_cb);
}
#include <stdio.h>
#include <ucontext.h>
//ucontext
//getcontext(&context)
//makecontext(&context, func, arg);
//swapcontext(&current_context, &next_context);
ucontext_t ctx[2];
ucontext_t main_ctx;
int count = 0;
//12314
void fun1() {
  while(count++ < 100) {
    printf("1");
    swapcontext(&ctx[0], &ctx[1]);
    printf("3");
  }
}
void func2() {
  while(count++ < 100) {
    printf("2");
    swapcontext(&ctx[1], &ctx[0]);
    printf("4");
  }
}
int main() {
  char stack1[2048] = {0};
  char stack2[2048] = {0};
  getcontext(&ctx[0]);
  ctx[0].uc_stack.ss_sp = stack1;
  ctx[0].uc_stack.ss_size = sizeof(stack1);
  ctx[0].uc_link = &main_ctx;
  makecontext(&ctx[0], fun1, 0);
  getcontext(&ctx[1]);
  ctx[1].uc_stack.ss_sp = stack1;
  ctx[1].uc_stack.ss_size = sizeof(stack1);
  ctx[1].uc_link = &main_ctx;
  makecontext(&ctx[1], fun2, 0);
  printf("swapcontext\n");
  swapcontext(&main_ctx, &ctx[0]);
  printf("\n");
}
jmp_buf env;
//setjmp, longjmp
void func(int arg) {
  printf("func\n");
  longjmp(env, ++arg);
  printf("longjmp complete\n");
}
int main() {
  int ret = setjmp(env);
  if (ret == 0) {
    printf("ret == 0\n");
    func(ret);
  } else if (ret == 1) {
    printf("ret == 1\n");
    func(ret);
  }
  printf("ret : %d\n", ret);
}
相关文章
|
1月前
|
存储 关系型数据库 MySQL
纯c协程框架NtyCo实现与原理
纯c协程框架NtyCo实现与原理
82 1
|
1月前
|
存储 前端开发 rax
|
1月前
|
存储 SQL NoSQL
协程的设计原理与汇编实现
协程的设计原理与汇编实现
|
1月前
|
存储 前端开发 rax
不一样的编程方式 —— 协程(设计原理与汇编实现)
不一样的编程方式 —— 协程(设计原理与汇编实现)
|
7月前
|
存储 关系型数据库 MySQL
2.3.1 协程设计原理与汇编实现
c++的这样的内部变量还有哪些?都是什么含义? 非协程链接mysql的过程是怎样的?
29 0
|
1月前
|
安全 调度 Python
探索Python中的并发编程:协程与多线程的比较
本文将深入探讨Python中的并发编程技术,重点比较协程与多线程的特点和应用场景。通过对协程和多线程的原理解析,以及在实际项目中的应用案例分析,读者将能够更好地理解两种并发编程模型的异同,并在实践中选择合适的方案来提升Python程序的性能和效率。
|
3天前
|
数据挖掘 程序员 调度
Python并发编程之协程与异步IO
传统的多线程和多进程模型在处理大规模并发时存在一些性能瓶颈和资源消耗问题。本文将重点介绍Python中基于协程和异步IO的并发编程方法,探讨其工作原理和实际应用,帮助开发者更好地理解并利用Python的并发编程能力。
|
4天前
|
开发者 Python
探索 Python 中的协程:从基本概念到实际应用
在现代编程中,异步处理变得越来越重要,Python 通过其内置的协程提供了强大的工具来简化这一过程。本文将深入探讨 Python 中的协程,从基本概念出发,逐步展示其实际应用,并通过具体代码示例帮助你掌握这种技术。
|
2天前
|
安全 Unix API
完整了解如何在python中处理协程和流
【6月更文挑战第25天】本文介绍异步库asyncio的概念和用法,异步编程在Python中是通过事件循环和协程实现并发,随着版本更新,API有所变化。
22 1
|
10天前
|
数据挖掘 调度 开发者
Python并发编程的艺术:掌握线程、进程与协程的同步技巧
并发编程在Python中涵盖线程、进程和协程,用于优化IO操作和响应速度。`threading`模块支持线程,`multiprocessing`处理进程,而`asyncio`则用于协程。线程通过Lock和Condition Objects同步,进程使用Queue和Pipe通信。协程利用异步事件循环避免上下文切换。了解并发模型及同步技术是提升Python应用性能的关键。
35 5