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);
}
相关文章
|
2月前
|
存储 Linux 调度
协程(coroutine)的原理和使用
协程(coroutine)的原理和使用
|
6天前
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
在Python异步编程领域,协程与异步函数成为处理并发任务的关键工具。协程(微线程)比操作系统线程更轻量级,通过`async def`定义并在遇到`await`表达式时暂停执行。异步函数利用`await`实现任务间的切换。事件循环作为异步编程的核心,负责调度任务;`asyncio`库提供了事件循环的管理。Future对象则优雅地处理异步结果。掌握这些概念,可使代码更高效、简洁且易于维护。
10 1
|
3月前
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
【7月更文挑战第15天】Python异步编程借助协程和async/await提升并发性能,减少资源消耗。协程(async def)轻量级、用户态,便于控制。事件循环,如`asyncio.get_event_loop()`,调度任务执行。异步函数内的await关键词用于协程间切换。回调和Future对象简化异步结果处理。理解这些概念能写出高效、易维护的异步代码。
45 2
|
3月前
|
编译器
8086 汇编笔记(八):转移指令的原理
8086 汇编笔记(八):转移指令的原理
|
5月前
|
存储 关系型数据库 MySQL
纯c协程框架NtyCo实现与原理
纯c协程框架NtyCo实现与原理
133 1
|
5月前
|
存储 前端开发 rax
|
5月前
|
存储 SQL NoSQL
协程的设计原理与汇编实现
协程的设计原理与汇编实现
|
5月前
|
存储 前端开发 rax
不一样的编程方式 —— 协程(设计原理与汇编实现)
不一样的编程方式 —— 协程(设计原理与汇编实现)
|
5月前
|
存储 Unix 编译器
汇编语言----X86汇编指令
汇编语言----X86汇编指令
108 1
几组汇编指令的比较
几组汇编指令的比较
下一篇
无影云桌面