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);
}
相关文章
|
4月前
|
存储 Linux 调度
协程(coroutine)的原理和使用
协程(coroutine)的原理和使用
|
24天前
|
存储 安全 测试技术
GoLang协程Goroutiney原理与GMP模型详解
本文详细介绍了Go语言中的Goroutine及其背后的GMP模型。Goroutine是Go语言中的一种轻量级线程,由Go运行时管理,支持高效的并发编程。文章讲解了Goroutine的创建、调度、上下文切换和栈管理等核心机制,并通过示例代码展示了如何使用Goroutine。GMP模型(Goroutine、Processor、Machine)是Go运行时调度Goroutine的基础,通过合理的调度策略,实现了高并发和高性能的程序执行。
78 29
|
22天前
|
负载均衡 算法 Go
GoLang协程Goroutiney原理与GMP模型详解
【11月更文挑战第4天】Goroutine 是 Go 语言中的轻量级线程,由 Go 运行时管理,创建和销毁开销小,适合高并发场景。其调度采用非抢占式和协作式多任务处理结合的方式。GMP 模型包括 G(Goroutine)、M(系统线程)和 P(逻辑处理器),通过工作窃取算法实现负载均衡,确保高效利用系统资源。
|
3月前
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
在Python异步编程领域,协程与异步函数成为处理并发任务的关键工具。协程(微线程)比操作系统线程更轻量级,通过`async def`定义并在遇到`await`表达式时暂停执行。异步函数利用`await`实现任务间的切换。事件循环作为异步编程的核心,负责调度任务;`asyncio`库提供了事件循环的管理。Future对象则优雅地处理异步结果。掌握这些概念,可使代码更高效、简洁且易于维护。
26 1
|
2月前
|
数据采集 调度 Python
Python编程异步爬虫——协程的基本原理(一)
Python编程异步爬虫——协程的基本原理(一)
|
2月前
|
数据采集 Python
Python编程异步爬虫——协程的基本原理(二)
Python编程异步爬虫——协程的基本原理(二)
|
2月前
|
存储 前端开发 rax
协程设计与原理(二)
协程设计与原理(二)
18 0
|
2月前
|
Java Linux Go
协程的设计原理(一)
协程的设计原理(一)
32 0
|
5月前
|
调度 Python
揭秘Python并发编程核心:深入理解协程与异步函数的工作原理
【7月更文挑战第15天】Python异步编程借助协程和async/await提升并发性能,减少资源消耗。协程(async def)轻量级、用户态,便于控制。事件循环,如`asyncio.get_event_loop()`,调度任务执行。异步函数内的await关键词用于协程间切换。回调和Future对象简化异步结果处理。理解这些概念能写出高效、易维护的异步代码。
61 2
|
5月前
|
编译器
8086 汇编笔记(八):转移指令的原理
8086 汇编笔记(八):转移指令的原理