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");
}
c 复制代码
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);
}
相关推荐
格林威5 小时前
常规线扫描镜头有哪些类型?能做什么?
人工智能·深度学习·数码相机·算法·计算机视觉·视觉检测·工业镜头
程序员莫小特6 小时前
老题新解|大整数加法
数据结构·c++·算法
过往入尘土8 小时前
服务端与客户端的简单链接
人工智能·python·算法·pycharm·大模型
zycoder.8 小时前
力扣面试经典150题day1第一题(lc88),第二题(lc27)
算法·leetcode·面试
蒙奇D索大8 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
智驱力人工智能9 小时前
工厂抽烟检测系统 智能化安全管控新方案 加油站吸烟检测技术 吸烟行为智能监测
人工智能·算法·安全·边缘计算·抽烟检测算法·工厂抽烟检测系统·吸烟监测
程序员爱钓鱼9 小时前
Go语言实战案例——进阶与部署篇:编写Makefile自动构建Go项目
后端·算法·go
_Power_Y10 小时前
Java面试常用算法api速刷
java·算法·面试
艾醒(AiXing-w)10 小时前
大模型面试题剖析:模型微调中冷启动与热启动的概念、阶段与实例解析
人工智能·深度学习·算法·语言模型·自然语言处理
天选之女wow10 小时前
【代码随想录算法训练营——Day32】动态规划——509.斐波那契数、70.爬楼梯、746.使用最小花费爬楼梯
算法·leetcode·动态规划