![](https://img-blog.csdnimg.cn/121da0dd3c4f4b019b1d32269e741699.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
coroutine+io_uring
文章平均质量分 93
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32
RzBu11d023r
这个作者很懒,什么都没留下…
展开
-
基于协程io_uring 异步网络库系列: 概述 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
很遗憾的是,虽然本身学习服务器应该把 socket 编程、缓存处理、linux 系统调用信号机制等这些为重点,但是对于要用 coroutine 来做的话,其实是优点舍近求远的,因为你必须理解异步和 coroutine 本质上的状态机,所以这里的非关键因素的篇幅和绕程度可能会大一些。我属实没搞明白他们是怎么学这部分的内容的?是因为学过 call/cc? 是从 ts 开始就跟踪这个协程的点?还是本身研究理解过 javascript 的异步、C# 的异步、还是其他语言像 golang 的 coroutine...原创 2022-03-04 05:41:52 · 1986 阅读 · 0 评论 -
io_uring 使用教程| io_uring 完全指南 | io_uring 实践指导 | io_uring 资料参考
io_uring 完全指南地图背景io_uring 是 2019 年做的,与 kernel 5.1 发布。后续打了很多补丁,比较重要的在 2020年5月之后基本达到了一个很好的可用性。学习这个东西和学习 epoll 系列的、学习 UNP 和 linux 网络编程其实没有什么区别,都是利用已有的工具解决问题,其实不涉及像学 OS、DBMS、分布式系统等这种系统方向技术上的东西,但是有一些惯常做法还是需要记录一下,如何利用工具,以及在工具的限制下解决问题也是一门形式化技术。本文只是提供一个使用 io_uri原创 2022-04-03 00:02:35 · 8525 阅读 · 2 评论 -
尾递归优化 快速排序优化 CPS 变换 call/cc setjmp/longjmp coroutine 协程 栈编程和控制流 讲解
尾递归优化 快排递归优化 CPS 变换 call/cc setjmp/longjmp coroutine 大杂烩递归与栈首先理解栈程序模型,其函数调用是依据压栈进行的,这里给一副图加深印象:函数调用最后返回的时候 callee 需要从栈恢复 callee save 寄存器然后返回到 caller,caller 再恢复 caller save 寄存器,这一步就是占用内存的消费。尾递归我们是否能够把递归变成 O(1) 空间的呢?实际上是可以的,但是这对程序有条件,就是尾递归。下面来看几个程序:原创 2021-08-25 05:14:14 · 907 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 I: 异步和协程复习 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
首先复习协程的部分先(对照 C++20 coroutine 探索 系列笔记, 建议对着第二篇的查阅备用来复习)。这可能是因为编写 awaiter 是如何的是很重要的(如果要支持用 co_await 写程序的话),所以还是要搞明白协程和 cppcoro 提供的协程包装(是C#早有的成熟系列)的执行过程。其实下面我会一直强化这个协程状态机的运行走向,就当作是复习巩固记忆了。一个协程的返回值 task 是一个 R 类型兼 Awaiter 类型,他的 promise_type 的 initial_susp...原创 2022-03-04 05:44:12 · 737 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 II: 协程基本组件概要 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前广...原创 2022-03-04 05:47:30 · 850 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 III: Proactor、异步与协程 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前广泛的.原创 2022-03-04 05:52:17 · 775 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 IV: Proactor 与 asynchronous operation | C++20 coroutine | io_uring 异步IO 网络框架
本系列通过结合 linux 的 io_uring 和 cppcoro (源码需要进行部分修改以适配 linux 下的 g++-11)在网络中的使用学习 C++20 coroutine。值得注意的是,cppcoro 目前已经暂停维护,仍然为 TS 版本的支持,同时其真异步底层支持只支持了 win32 的 IOCP(本身 cppcoro 兼容 MSVC),但是本系列不想涉及 IOCP 和 windows 的部分因为除了跨平台外,没有太大意义(如果采用 windows 的话,C# 是足够好的语言,但是目前...原创 2022-03-04 05:54:55 · 514 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 V: executor 和线程池 thread pool
这是一个系列文章,目录:cppcoro 源码级使用教程系列: 概述 | C++20 coroutine 教程 | io_uring 异步IO 网络框架 系列笔记_我说我谁呢 --CSDN博客很遗憾的是,虽然本身学习服务器应该把 socket 编程、缓存处理、linux 系统调用信号机制等这些为重点,但是对于要用 coroutine 来做的话,其实是优点舍近求远的,因为你必须理解异步和 coroutine 本质上的状态机,所以这里的非关键因素的篇幅和绕程度可能会大一些。我属实没搞明白他们是怎么学这部分的内..原创 2022-03-06 16:25:00 · 1063 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 VI: io_uring v.s. epoll | proactor v.s. reactor | io_uring Proactor 模型
本文讲解 io_uring 如果编写 proactor 编程模型,同时对比 Reactor 模型。主要涉及的是模型中的 IO 部分,比如 short read。原创 2022-03-06 16:28:10 · 535 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 VII(资料): io_uring 和 NONBLOCK | short read 问题 | io_uring blocking io 资料
这里其实我之前有一个问题的,对于普通的非阻塞read write 来说可能每次读到写到的 n 都不等于我们请求的 nbytes,然后最好情况也最多是 64kb,不可能够传输长(相对)连接大文件的,这个问题 io_uring 提交的时候是否能支持更大的 nbytes 呢? 当然 manual 的说法是Each I/O operation is, in essence, the equivalent of a system call you would have made otherwise, ...原创 2022-03-06 16:30:44 · 1755 阅读 · 0 评论 -
基于协程io_uring 异步网络库系列 VIII: 异步 task 的线程池 | CPU bound task 使用线程池 | Reactor 多线程 v.s. Proactor 多线程
主要讨论一下一些异步的投递的实现,第二部分是 CPU bound 的 task 的线程池,因为 proactor 对线程池的要求和 reactor 的不一样。原创 2022-03-06 16:37:22 · 428 阅读 · 0 评论 -
io_uring 用法分析 I :异步 IO ,Windows IOCP 接口与 Proactor 模式
在具体研究 io_uring 之前,有必要了解之前的 aio,包括 glib 实现的 POSIX aio 和 Linux 后来提供的只支持 O_DIRECT 的 Linux aio (不支持 socket 因为 socket 不能 O_DIRECT)。不然我实在看不懂 io_uring 目前的资料(和 epoll 铺天盖地的资料实在是没法比啊)。首先是基本的情况,由于 Linux 早期不支持 Posix ais,所以实际 glib 是在用户态模拟了一个的,实际原理是通过多线程后台同步读写,然...原创 2021-11-18 11:19:53 · 1738 阅读 · 0 评论 -
io_uring 用法分析 II :io_uring 原理和系统调用初步介绍
这个为了方便,之后还要总结一下这个全部的用法摘要,方便查阅。所以分为 3 篇内容(其实前面还有一篇讲异步 IO 的也算吧),第一个是 io_uring 的简单原理分析和 raw interfaces,第二篇是讲 liburing 以及高性能 polling 机制,第三篇是接口以及各选项的总结摘要(这之前先参考 manual 和 liburing 的头文件吧,liburing 也自带了 system call 的 manual)。主要的 io_uring 的资料有这些:io_uring.pdf ...原创 2021-11-18 11:22:39 · 3077 阅读 · 0 评论 -
io_uring 用法分析 III :liburing 接口及高性能 Polling 机制
Interrupt 方案是节约 CPU ,但是延迟高,因为用户态正在休眠,调度到他需要花费一定时间(Linux 调度算法是用红黑树的完全公平调度 CFS,和以前看 APUE 的函数调用有关,然后主要优先级依据是通过 virtual runtime 归一化比较的,同等物理时间下高优先级的虚拟时间过得慢,所以能调度多一些)。鉴于 NAPI 已经要求网卡驱动实现本身提供 poll 接口给 trap handler,这样应用层也可以用这个(而 poll 接口也用在 select poll 上原创 2021-11-18 11:23:59 · 3494 阅读 · 0 评论 -
C++20 coroutine 探索I:co_await 原理 | 使用 C++ 协程写 python generator
时隔三个月,才回到当时说的学协程的坑,中间学了各种各样的东西,起码对现代C++ 有些许了解了。尾递归优化 快速排序优化 CPS 变换 call/cc setjmp/longjmp coroutine 协程 栈编程和控制流 讲解_我说我谁呢 --CSDN博客看这个文章之前可以先复习一下函数式编程里面的 call/cc 的概念,因为 C++20 的 stackless coroutine 就是用类似 call/cc 的手法实现的。主要参考资料参照Coroutines (C++20) - cppref..原创 2021-11-20 16:52:20 · 3907 阅读 · 0 评论 -
C++20 coroutine 探索II: coroutine_traits & await_transform 的用法,boost asio 中 coroutine 的用法
经过之前对 coroutine 的思路整理(额,实际并完成完整的一篇),我基本明白了一个事实(这个文章比我潦草本地笔记整理得好所以复习概念就看他了:C++20 协程初探 | Netcan on Programming, 不过主要的调用流程伪代码(约等于编译器生成代码)参考还是 co_await 流程 和 协程调用流程,然后实际的细节指定就是看 cppreference Coroutines (C++20) - cppreference.com就行了)。基本概念Promise Type 实际是...原创 2021-11-22 13:43:45 · 2171 阅读 · 0 评论 -
C++20 coroutine 探索III: 异步编程,Task<T> 编写,boost asio 协程分析,C# async / await, cppcoro 源码分析
经过了前面对 coroutine 的反复学习,现在尝试写一些封装好的协程工具(reinventing the wheel)。本文先从最Promise 异步编程模型的最基本的 Task<T> 入手.异步编程Futures and promises - Wikipedia异步的关键点是真正的无线程异步必须要 all the way down 到 O/S system call 层面甚至到硬件层面的异步支持才能实现 (对于 Linux 的驱动模型, 做 top half 工作的 softirq原创 2021-11-23 21:37:51 · 2602 阅读 · 6 评论