关于 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.rhkb.cn/news/294844.html

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

相关文章

GeoLite2 geoip数据库下载和使用

GeoLite2 数据库是免费的 IP 地理定位数据库&#xff0c;与MaxMind 的 GeoIP2 数据库相当&#xff0c;但准确度较低 。GeoLite2 国家、城市和 ASN 数据库 每周更新两次&#xff0c;即每周二和周五。GeoLite2 数据还可作为 GeoLite2 Country 和 GeoLite2 City Web 服务中的 Web …

新手学python还是c?

考虑到个人情况和职业规划是非常重要的。我这里有一套编程入门教程&#xff0c;不仅包含了详细的视频讲解&#xff0c;项目实战。如果你渴望学习编程&#xff0c;不妨点个关注&#xff0c;给个评论222&#xff0c;私信22&#xff0c;我在后台发给你。 Python作为初学者入门语言…

怎么更新sd-webui AUTOMATIC1111/stable-diffusion-webui ?

整个工程依靠脚本起来的&#xff1a; 可直接到stable-diffusion-webui子目录执行&#xff1a; git pull更新代码完毕后&#xff0c;删除venv的虚拟环境。 然后再次执行webui.sh&#xff0c;这样会自动重新启动stable-diffusion-webui.

“超越摩尔定律”,存内计算走在爆发的边缘

前言 过去几十年来&#xff0c;在摩尔定律的推动下&#xff0c;处理器的性能有了显著提高。然而&#xff0c;传统的计算架构将数据的处理和存储分离开来&#xff0c;随着以数据为中心的计算&#xff08;如机器学习&#xff09;的发展&#xff0c;在这两个物理分离的单元之间传…

HarmonyOS 应用开发之LifecycleForm接口切换LifecycleApp接口切换 LifecycleApp接口切换

LifecycleForm接口切换 FA模型接口Stage模型接口对应d.ts文件Stage模型对应接口onCreate?(want: Want): formBindingData.FormBindingData;ohos.app.form.FormExtensionAbility.d.tsonAddForm(want: Want): formBindingData.FormBindingData;onCastToNormal?(formId: string…

百度网站收录提交入口

百度网站收录提交入口 在网站刚建立或者更新内容后&#xff0c;及时将网站提交给搜索引擎是提高网站曝光和获取流量的重要步骤之一。百度作为中国最大的搜索引擎之一&#xff0c;网站在百度中的收录情况尤为重要。下面介绍一下如何通过百度的网站收录提交入口提交网站。 1. 百…

Pygame基础9-射击

简介 玩家用鼠标控制飞机&#xff08;白色方块&#xff09;移动&#xff0c;按下鼠标后&#xff0c;玩家所在位置出现子弹&#xff0c;子弹匀速向右飞行。 代码 没有什么新的东西&#xff0c;使用两个精灵类表示玩家和子弹。 有一个细节需要注意&#xff0c;当子弹飞出屏幕…

视觉里程计之对极几何

视觉里程计之对极几何 前言 上一个章节介绍了视觉里程计关于特征点的一些内容&#xff0c;相信大家对视觉里程计关于特征的描述已经有了一定的认识。本章节给大家介绍视觉里程计另外一个概念&#xff0c;对极几何。 对极几何 对极几何是立体视觉中的几何关系&#xff0c;描…

从学习海底捞到学习巴奴,中国餐饮带洋快餐重归“产品主义”

俗话说“民以食为天”&#xff0c;吃饭一向是国人的头等大事&#xff0c;餐饮业也是经济的强劲助推力。新世纪以来&#xff0c;餐饮业不断讲述着热辣滚烫的商业故事。 2006年&#xff0c;拥有“必胜客”、“肯德基”等品牌的餐饮巨头百胜集团&#xff0c;组织两百多名区域经理…

Effective-C++阅读解析条款(条款二:尽量以const,enum,inline替换#define)

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 书中说这个条款或许改为“宁可以编译器替换预处理器”比较好&#xff0c;这句话在我看来原因是这样的&#xff1a; 如果我们有这样一个宏(假设写这个宏的人比较粗心)&#xff1a;#define Add(x, y) x y 我们本意是想得到…

全栈的自我修养 ———— redux入门(看这么一篇就够了!!!)

redux时react中负责状态管理的工具 一、下载二、配置1、目录2、store配置3、redux中index.js配置4、启动类中index.js配置 三、使用1、调用store的数据2、调用store里面的方法3、改变store里面的值 一、下载 npm I reduxjs/toolkit react-redux二、配置 1、目录 modules里面…

uniapp-打包IOS的APP流程

打包前所需配置 在manifest文件内配置 1. APP图标 2. 启动界面 有三种启动界面配置 第一种是 HBuilderX 官方给的通用启动界面&#xff0c;页面单一&#xff0c;屏幕中间就一个圆框图标 第二种是自定义的启动图&#xff0c;无法通过AppStore的审核 第三种是自定义storyboard启动…

ios应用内支付

用uniapp开发iOS应用内支付 准备前端代码服务器端处理如果iOS支付遇到问题实在解决不了&#xff0c;可以联系我帮忙解决&#xff0c;前端后端都可以解决&#xff08;添加的时候一定要备注咨询iOS支付问题&#xff09; 准备前端代码 获取支付通道 (uni.getProvider) uni.getPr…

240330-大模型资源-使用教程-部署方式-部分笔记

A. 大模型资源 Models - Hugging FaceHF-Mirror - Huggingface 镜像站模型库首页 魔搭社区 B. 使用教程 HuggingFace HuggingFace 10分钟快速入门&#xff08;一&#xff09;&#xff0c;利用Transformers&#xff0c;Pipeline探索AI。_哔哩哔哩_bilibiliHuggingFace快速入…

CA根证书——https安全保障的基石

HTTPS通信中&#xff0c;服务器端使用数字证书来证明自己的身份。客户端需要验证服务器发送的证书的真实性。这就需要一个可信的第三方机构&#xff0c;即CA&#xff0c;来颁发和管理证书。CA根证书是证书颁发机构层次结构的顶级证书&#xff0c;客户端信任的所有证书都可以追溯…

提质增效|大型汽车制造业运维精细化管理建设实战

项目背景 某大型汽车制造企业随着数字化技术的深入应用&#xff0c;对运维在“质量与效率”方面的精细化管理有了更高的要求。借助云智慧运维指标体系实现了 IT 架构的智能化与可视化&#xff0c;高效解决系统显性问题&#xff0c;积极处理系统隐性问题&#xff0c;提升系统稳…

差分与前缀和

目录 差分法 例题&#xff1a;大学里的树木要打药 前缀和 例题&#xff1a;大学里的树木要维护 差分法 差分法的应用主要是用于处理区间问题&#xff0c;当一个数组要在很多不确定的区间&#xff0c;加上相同的一个数&#xff0c;我们如果每个数都进行加法操作的话&#x…

C++初学者:如何优雅地写程序

我喜欢C语言的功能强大&#xff0c;简洁&#xff0c;我也喜欢C#的语法简单&#xff0c;清晰&#xff0c;写起来又方便好用。 一、为什么不用C语言写程序。 C语言用来做题目&#xff0c;考试研究是很方便的&#xff0c;但是用来写程序做软件&#xff0c;你就会发现&#xff0c…

低噪声、轨至轨运算放大器芯片—— D721、D722、D724,适合用于音频领域

应用领域 D721、D722、D724是我们推荐的三款低噪声、轨至轨运算放大器芯片&#xff0c;其中D721为单运放&#xff0c;D722为双运放&#xff0c;D724为四运放。适合用于音频领域、传感器等的信号放大处理&#xff0c;比如K歌宝、音响、测距、滤波器、AD转换器前级信号处理等等。…

MES系统主要功能有哪些?

本文将为大家讲解&#xff1a;1、MES系统是什么&#xff1f;2、MES系统主要功能有哪些&#xff1f;3、MES系统的价值何在&#xff1f;4、使用MES系统的案例。 一、MES系统是什么&#xff1f; 正所谓“磨刀不误砍柴工”&#xff0c;咱们先来了解一下什么是MES系统。MES系统&am…