关于 C/C++ 1Z(17)开源项目 openppp2 协同程式切换工作流

下述为开源项目 openppp2(github)构建工作在 C/C++ 17 的 stackful 有栈协同程式的工作流切换示意图:

在 openppp2 之中采用人工手动方式管理协同程式之间的切换,每个中断过程只是保存线程栈信息(如寄存器、当前#PC EIP)并且JMP相对寄存器长跳转到其它协同程序当前EIP位置。

它(协同程式)的切换开销是最小的,速度几乎是无损最快的,这好比人们在 C/C++ 之中用 “函数指针(地址标识符)” 去指向一个 C/C++ 函数,且通过函数指针进行调用,它本身就是长跳转的一种,区别只是少做了线程信息保存,及下个协同程序线程信息恢复的动作。

当然协同程式有一些是通过操作系统核心库API构建的有栈协同程式。

例如:

1、Windows NT平台使用:GetThreadContext、SetThreadContext 函数来构建的有栈协同切换。

2、Linux 平台上使用 ucontext.h 库函数:getcontext、setcontext、makecontext、swapcontext 函数来构建的有栈协同切换。

那么:此类有栈协同程式切换效能的确不行,某些人不要张口就来,不是真懂别乱逼逼。

但通过汇编语言构建的有栈协同程式,几乎不存在性能问题,单线程挂载百万个、千万个协同程式都可以,只要母鸡内存足够大,即可。

stackless 有栈协同程式不要来碰瓷效能,比协同程式切换效能,stackless 真不配跟 stackfull 协同程式比切换效能,若我们不懂这两个协同程式怎么实现的,还真有可能被XX们忽悠住,但可惜我们了解这两类协同程式底层是怎么构建的,当然也自行实现构建过两者,所以在这块还是有一定心得发言权的。

从上述的协同程式示意图之中,可以清晰的看到,在中断某一个协同程式时,会直接切换CPU到下一个协同程式(若有,否则为协同程式结束),而不是还会等待执行到。

但这有一个缺点,一旦某一个协同不按照正确流程切换,那么就会导致协程 deadline 问题,出现致命性故障,如流程中断、内存泄漏等问题层出不穷。

欲兼容性解决这类问题,那么必须引入一个协同程式调度器,但这并非必须的,长长构建多线程并行程式、对于协同程序非常了解的童鞋并不需要,因为这种调度切换的低级问题,不会在它们身上发生。

对于 C/C++ 编程语言来说首先采用 stackful 有栈协同程式,而不是使用 stackless 协同程式,即便是 C/C++ 20 标准提供的 stackless 协同程式,或者早前基于 boost 库提供的 stackless 协同程式。

关于在 go 语言之中,go 开启一个新的 stackless 协同程式,并不意味着立即运行,go 开发人员适用编译器关键字 go 开启新协同程式,能否立即运行取决于以下条件。

在 go 运行时仅只有单线程的情况下,它无法立即运行,而是需要等待当前正在执行协同程序到中断位置或结束时才运行,多线程情况下取决于那个闲置线程先获取到事件(基于系统 epoll、iocp、kqueue 构建的EDSM事件驱动状态机,运行时调度器)。

了解关于我们对于协程相关的一些看法,可以参见本人的以下文章:

C/C++ 如何正确的切换协同程序?(基于协程的并行架构)_c++怎么切换运行程序-CSDN博客

stackless or stackfull 协同程式(协程)?_boost stackless-CSDN博客

灌水玩玩 ChatGPT AIGC生成的有栈协同程序实现(例子)_任务协同 aigc-CSDN博客

C/C++ 11/14/17 有栈式协同程式的基础框架类库【关于】_c++11实现有栈对称协程库-CSDN博客

C++ 20标准协同程序(协程)基于编译器展开的 stackless 协程。-CSDN博客

关于 Go 协同程序(Coroutines 协程)、Go 汇编及一些注意事项。-CSDN博客

童鞋们可以好好理解在这些文章之中,我们关于协同程式的一些看法,那么童鞋们会对于协同程式有更深入的理解,不要去现在鱼龙混杂的逼乎(知乎)上看那些莫名其妙的想法及观点,国内技术相关这块大概就博客园、CSDN博客、看雪论坛比较好一点,其它建议还是算了把。

下述代码为 Linux 平台基于 ucontext.h 函数库实现的有栈协同程式切换(它很简明):

#include <ucontext.h>
#include <iostream>
#include <cstring>#define STACK_SIZE 1024*64ucontext_t mainContext, coroContext;void coroutineFunction() {std::cout << "Coroutine started" << std::endl;// 切换回主上下文swapcontext(&coroContext, &mainContext);std::cout << "Coroutine resumed" << std::endl;
}int main() {char stack[STACK_SIZE];getcontext(&coroContext);coroContext.uc_link = &mainContext;coroContext.uc_stack.ss_sp = stack;coroContext.uc_stack.ss_size = sizeof(stack);makecontext(&coroContext, (void (*)())coroutineFunction, 0);std::cout << "Main started" << std::endl;// 切换到协程上下文swapcontext(&mainContext, &coroContext);std::cout << "Main resumed" << std::endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/787714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Deferred library xxx was not loaded

Deferred 延迟修饰词作用下的文件库尚未完成载入

总结jvm中GC机制(垃圾回收)

前言 本篇博客博主将介绍jvm中的GC机制&#xff0c;坐好板凳发车啦~~ 一.GC相关 1.1回收栈内存 对于虚拟机栈&#xff0c;本地方法栈这部分区域而言&#xff0c;其生命周期与相关线程相关&#xff0c;随线程而生&#xff0c;随线程而灭。并且这三个区域的内存分配与回收具有…

成熟在用的二级医院手术麻醉系统源码 医疗管理系统源码 自主版权

成熟在用的二级医院手术麻醉系统源码 医疗管理系统源码 自主版权 手术麻醉临床信息系统有着完善的临床业务功能&#xff0c;能够涵盖整个围术期的工作&#xff0c;能够采集、汇总、存储、处理、展现所有的临床诊疗资料。通过该系统的实施&#xff0c;能够规范麻醉科的工作流程…

jnpf3.6私有化部署

文件内容 project web > 特别说明&#xff1a;源码、JDK、MySQL、Redis等安装或存放路径禁止包含中文、空格、特殊字符等## 一 技术栈- 主框架&#xff1a;Spring Boot Spring Framework - 持久层框架&#xff1a;MyBatis-Plus - 数据库连接池&#xff1a;Alibaba Druid -…

OpenCV与AI深度学习 | 实战 | YOLOv8自定义数据集训练实现手势识别 (标注+训练+预测 保姆级教程)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;实战 | YOLOv8自定义数据集训练实现手势识别 (标注训练预测 保姆级教程) 0 导 读 本文将手把手教你用YoloV8训练自己的数据集并实现手势识别…

IDEA中连接SQLserver数据库(DataGrip相同连接)

IDEA中连接SQLserver数据库(DataGrip相同连接) 1. 打开IDEA-database组件 2. 新建SQL server连接 3. 填写信息进行连接 填写连接名称&#xff0c;连接主机IP&#xff0c;端口&#xff0c;默认端口1433&#xff0c;数据库用户名密码&#xff0c;默认数据库用户名是sa 第一次连接…

2024最新软件测试【测试理论+ 接口自动化测试】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

LLMs 可能在 2 年内彻底改变金融行业

在艾伦图灵研究所&#xff08;The Alan Turing Institute&#xff09;最新的一项研究中&#xff0c;我们看到了大型语言模型&#xff08;Large Language Models&#xff0c;LLMs&#xff09;的一种可能性。它有望通过检测欺诈行为、生成财务洞察以及自动化客户服务&#xff0c;…

Java的编程之旅44——学生信息管理系统

目录 1.MVC设计模式初探 文件结构的搭建 2.Student类用来初始化学生信息 3.主函数里的两个功能 1.调用初始化学生信息的功能 2.输出欢迎界面功能 4.Global类中方法的编写 5.StuPage类&#xff0c;StuCtrl类&#xff0c;StuModel类中方法的编写 1.查询功能 selStu方法的…

想要成为一名合格的软件测试工程师,你得会些啥?

对于很多新入行或者打算入行&#xff0c;成为软件测试工程师的小伙伴来说&#xff0c;刚开始接触这行&#xff0c;不知道自己究竟该学些什么&#xff0c;或者不知道必须掌握哪些知识&#xff0c;才能成为一名合格的测试工程师。 根据笔者观点&#xff0c;如果你能在学习过程中…

每日一题 第六十四期 洛谷 树状数组模板2

【模板】树状数组 2 题目描述 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; 将某区间每一个数加上 x x x&#xff1b; 求出某一个数的值。 输入格式 第一行包含两个整数 N N N、 M M M&#xff0c;分别表示该数列数字的个数和操作的总…

iOS17 隐私协议适配详解

1. 背景 网上搜了很多文章&#xff0c;总算有点头绪了。其实隐私清单最后做出来就是一个plist文件。找了几个常用三方已经配好的看了看&#xff0c;比着做就好了。 WWDC23 中关于隐私部分的更新&#xff08;WWDC23 隐私更新官网&#xff09;&#xff0c;其中提到了第三方 SDK 的…

简单而复杂的Python

Python是一种简单&复杂的编程语言。简单的时候可以到极致&#xff1a; print(hello world!)另一方面&#xff0c;Python 也具有许多复杂的语法特性&#xff0c;例如面向对象编程、装饰器、迭代器、生成器等等。这些特性使得 Python 适用于各种不同的编程任务和项目。 当我…

手撸一个简易 Grid 拖拽布局

公众号&#xff1a;程序员白特&#xff0c;欢迎一起交流学习~ 以下文章来源于稀土掘金技术社区 &#xff0c;作者游仙好梦 最近有个需求需要实现自定义首页布局&#xff0c;需要将屏幕按照 6 列 4 行进行等分成多个格子&#xff0c;然后将组件可拖拽对应格子进行渲染展示。 对比…

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(一)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 fdisk [参数] [设备] 1. 为虚拟机添加1块大小为3-5G的硬盘nvme&#xff0c;将该硬盘划分1个主分区和两个逻辑分区分别为600MB。 partprobe [选项] [设备] 2. 将主分区格式化为ext4文件系统并挂载到/自己名字命名…

二百二十九、离线数仓——离线数仓Hive从Kafka、MySQL到ClickHouse的完整开发流程

一、目的 为了整理离线数仓开发的全流程&#xff0c;算是温故知新吧 离线数仓的数据源是Kafka和MySQL数据库&#xff0c;Kafka存业务数据&#xff0c;MySQL存维度数据 采集工具是Kettle和Flume&#xff0c;Flume采集Kafka数据&#xff0c;Kettle采集MySQL数据 离线数仓是Hi…

iOS苹果签名共享签名是什么以及如何获取?

哈喽&#xff0c;大家好呀&#xff0c;咕噜淼淼又来和大家见面啦&#xff0c;最近有很多朋友都来向我咨询共享签名iOS苹果IPA共享签名是什么&#xff0c;针对这个问题&#xff0c;淼淼来解答一下大家的疑惑并告诉大家iOS苹果ipa共享签名需要如何获取。 现在苹果签名在市场上的…

2024最新软件测试【测试理论+ 接口测试】面试题(内附答案)

一、测试理论 3.1 你们原来项目的测试流程是怎么样的? 我们的测试流程主要有三个阶段&#xff1a;需求了解分析、测试准备、测试执行。 1、需求了解分析阶段 我们的 SE 会把需求文档给我们自己先去了解一到两天这样&#xff0c;之后我们会有一个需求澄清会议&#xff0c; …

加密/ 解密 PDF:使用Python为PDF文档设置、移除密码

在数字化时代&#xff0c;文档的安全性变得越来越重要。特别是对于包含敏感信息的PDF文件&#xff0c;确保其不被未经授权的人员访问或修改是至关重要的。本文将介绍如何使用Python在PDF文档中设置密码&#xff0c;以及如何移除已经设置的密码。 目录 PDF加密基础知识 Pytho…

蓝桥杯第1593题——二进制问题

题目描述 小蓝最近在学习二进制。他想知道 1 到 N 中有多少个数满足其二进制表示中恰好有 K 个 1。你能帮助他吗&#xff1f; 输入描述 输入一行包含两个整数 N 和 K。 输出描述 输出一个整数表示答案。 输入输出样例 示例 输入 7 2输出 3评测用例规模与约定 对于 30% …