概述
这部分是我基于做了某个项目后对 C++ 新功能(协程)、Linux 新api io_uring 的一些笔记的整理。本意是现在比较广泛丰富资料的都是 reactor + epoll 的模型。19 年之后的 io_uring 可能会 async io 异步网络库流行(实际已经是了,结合 coroutine,只不过 C++ 后端的公司可能比较少),为补充一些资料面。本身由于是我自己的学习的理解,可能会有错误的地方。实际这个系列的意义可能除了我个人复习用(实际除了又做相关的工作不然也不会复习)不大,因为学习已经成熟的框架的使用可能意义更大,比如结合 libunifex ,以及等新标准后 asio 的使用上的更新。最后,web 后端还是 Java 现有的框架好用。
很遗憾的是,虽然本身学习服务器应该把 socket 编程、缓存处理、linux 系统调用信号机制等这些为重点,但是对于要用 coroutine 来做的话,其实是优点舍近求远的,因为你必须理解异步和 coroutine 本质上的状态机,所以这里的非关键因素的篇幅和绕程度可能会大一些。我属实没搞明白他们是怎么学这部分的内容的?是因为学过 call/cc? 是从 ts 开始就跟踪这个协程的点?还是本身研究理解过 javascript 的异步、C# 的异步、还是其他语言像 golang 的 coroutine 本身?还是说他们自己做过 coroutine 轮子呢(而且还不能是用 ucontext 的)?反正我搞明白这个协程的时候,好像已经好多次了(可能跟踪和写 demo 才是高效学习方法),普通的一些讲一下 C++20 的 coro 的教程可能也是比较轻松的,但是学会 1+1 并不能做复杂的题(然,实际 cppcoro 提供的基础设施已经够用了,win32 的 iocp 都给了封装好,demo 也有 webserver,实际是你要适配 io_uring 导致不得不摘开这些封装,后续补充,cppcoro 实际已经停止开发了,作者目前致力于 libunifex 即 C++23 有望和 std::net 一起进标准的 unified executor(P2300r1),后面如果还要学习协程和 C++2x+ 的异步 api,应该从 libunifex 入手,并且 libunifex 从 executor 层面封装了 io_uring 而不是直接从协程层面),需要一些实践上的惯常做法的经验补充(原创与模仿),所以还是直接用 cppcoro 吧。
因为 cppcoro 这种实现 C# 语言上基本组件的程度已经是实践编程的内容了。直接使用 cppcoro 是一个省力的方案,不要花时间在学习 cpp20 的 协程的汇编上。这个要点是不要重复造轮子,当然可以通过重新发明轮子的思路去学习别人的轮子是怎么造的,这样也能够方便bug的修改、功能的添加定制,以及更好的理解,但是没有必要在学习之外的目的做类似课文抄写的工作。这一点对于前面我想说尝试自己实现 task 的时候就犯了错误,实际可以只要去分析 cppcoro 的代码思路,主要重点放到 coroutine 的状态及流程。其实具体到现在校招烂大街的 webserver 来说,思路也是一样的,学生可能基于学习的出发点,不同地围绕 epoll reactor 造轮子(大部分是基于 muduo 或者一些 github 上的 simpleXXX tinyXXX 类似的项目学习的),近两年 io_uring 、coroutine 的web 框架轮子也开始有了,同时分布式数据库的流行也导致各种 tiny kv mini kv mini sql (rdbms 实际因为对编译原理和优化也有要求可能反而造的少点)练手项目层出不穷(至于 io_uring 对于数据库,由于 mmap 影响了 transaction 的保证所以不好用(尽管某些时候性能可能看起来不错),数据库对异步 IO 的支持的话,被批判的 AIO 早用于 innodb了,io_uring 主要弥补了非 direct 如 socket 的支持并且更加先进(理论上更好的性能来自 mmap 的 lock-free queue、less context switch))。很难评价这些行为(包括本篇笔记)本身的价值所在,当然,本身对于 io_uring + coroutine 的支持的优秀开源库还是不多的,真正能推动工业上可用版本(各公司内部可能已经有类似的项目,不过像 meta 都搞起 executor 了,基于协程的异步可能已经很熟了)可能还是有一定意义(如果不是能量化看到和以往的项目相比有所提升当然也要求基于现有的项目进行重构 (目前许多著名开源项目都在寻求添加 io_uring 的支持,因为性能提升是可观的),或者并没有意义,如果新造的话,高性能的协程+io_uring 支持, asio 可能够用了,他还支持跨平台就很好。然后本身 coroutine 和 io_uring 也仍然未成为稳定技术,本来也尝鲜部分)。
附录以前写的一些本节前置烂头烂尾调研笔记(的题目):
- 尾递归优化 快速排序优化 CPS 变换 call/cc setjmp/longjmp coroutine 协程 栈编程和控制流 讲解_我说我谁呢 --CSDN博客 (continuation 的一个理解)
- C++20 coroutine 探索I:co_await 原理 | 使用 C++ 协程写 python generator
- C++20 coroutine 探索II: coroutine_traits & await_transform 的用法,boost asio 中 coroutine 的用法 (对照快速捡起来)
- C++20 coroutine 探索III: 异步编程,Task<T> 编写,boost asio 协程分析,C# async / await, cppcoro 源码分析 (task 本身同步异步)
- io_uring 用法分析 I :异步 IO ,Windows IOCP 接口与 Proactor 模式(理解 proactor 的 eventloop 和 ACT)
- io_uring 用法分析 II
- io_uring 用法分析 III
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前广泛的服务器应用一般采用 linux)。
本系列本身是内容自洽的如果前提得到了满足即读者(我)必须具备了 C++20 coroutine 的状态机(当然,通用的状态机本身也可以用协程实现,不过这已经离题了,可以另外开笔记来讲怎么做)基础流程在脑子里以及 io_uring 的 liburing API(不是必须的),而这些内容都可以在上面附的文章中得到答案(以及较官方的资料,如 io_uring 的除了本身的 pdf 、邮件列表、还有专门的网站)。尽管这里废话会很多,虽然废话的存在本身可能是因为要用来构造一种常识/直觉,而省去了会简洁很多但是要求读者分布式去中心化地具有这些常识,实际学到的东西很少,没有任何的挑战,而且必须是烂尾预定的系列,但是我还没学会高效的记录方式,很容易忘掉细节。本身看这些也没有用,可能搞懂现有的基础设施的源码对调优还有一点意义。我备注一下实际如果要读源码的话,需要准备 boost asio 支持 coroutine ts 的版本(主要看 example)、cppcoro 的代码库(以及 readme 的示例,不过 cppcoro)。
以下为目录:
专栏地址:
coroutine+io_uring_我说我谁呢 --CSDN博客https://blog.csdn.net/u010180372/category_11665488.html分节目录:
cppcoro 源码级使用教程系列 I: 异步和协程复习 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记_我说我谁呢 --CSDN博客首先复习协程的部分先(对照 C++20 coroutine 探索 系列笔记, 建议对着第二篇的查阅备用来复习)。这可能是因为编写 awaiter 是如何的是很重要的(如果要支持用 co_await 写程序的话),所以还是要搞明白协程和 cppcoro 提供的协程包装(是C#早有的成熟系列)的执行过程。其实下面我会一直强化这个协程状态机的运行走向,就当作是复习巩固记忆了。一个协程的返回值 task 是一个 R 类型兼 Awaiter 类型,他的 promise_type 的 initial_susp...https://blog.csdn.net/u010180372/article/details/123267954cppcoro 源码级使用教程系列 II: 协程基本组件概要 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记_我说我谁呢 --CSDN博客本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前广...https://blog.csdn.net/u010180372/article/details/123267955cppcoro 源码级使用教程系列 III: Proactor、异步与协程 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记_我说我谁呢 --CSDN博客本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前广泛的.https://blog.csdn.net/u010180372/article/details/123267957https://blog.csdn.net/u010180372/article/details/123267963https://blog.csdn.net/u010180372/article/details/123267963等待更新中。。题目暂定(题目不知道怎么起,可能会变来变去的)
说是源码级,但是其实反而第一部分只是纯粹思路的梳理,第一部分 8 篇笔记已经更新结束了,下一部分可能是直接把我框架里的写法代码分析,但是已经离题。
专栏内的所有笔记本身是和他们自洽的(也许漏了一篇讲如何理解协程和函数式编程中的 call/cc 的笔记,博客中也上传了,当然实际这系列笔记不是一个能够快速上手的,而是一个系列的学习,主要目的是供我自己复习或者有对 C++ 协程与 Proactor 网络框架编写感兴趣的读者。
最后
以上就是贤惠蛋挞为你收集整理的基于协程io_uring 异步网络库系列: 概述 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记的全部内容,希望文章能够帮你解决基于协程io_uring 异步网络库系列: 概述 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复