Rust HTTP 协议栈在终端通信场景的实践 - 胡凯第三届中国Rust开发者大会 Rust HTTP 协议栈在终端通信场景的实践 胡凯 hukai45@huawei.com 华为 公共开发部 嵌入式软件能力中心 什么是 HTTP 协议? ⚫ HTTP 协议介绍 目录 终端场景下 HTTP 协议的主要使用场景,以及需要思考的问题。 ⚫ 终端 HTTP 通信场景浅析 我们当前结合 Rust 和终端通信场景的实践的简单介绍。 ⚫ Rust Rust 与终端 HTTP 通信场景结合 介绍 Rust 与 HTTP 协议栈结合的业界实现。 ⚫ Rust 与 HTTP 协议 HTTP 协议介绍 Part 01 什么是 HTTP 协议? Rust China Conf 2022 – 2023, Shanghai, China Rust China Conf 2022 – 2023, Shanghai, China HTTP 协议介绍 HTTP Secure,缩写:HTTPS)是一种通过计算 机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。 Rust 与 HTTP 协议 Part 02 介绍 Rust 与 HTTP 协议栈结合的业界实现 Rust China Conf 2022 – 2023, Shanghai, China Rust China Conf 2022 – 2023, Shanghai, China0 码力 | 26 页 | 1.25 MB | 1 年前3
Await-Tree Async Rust 可观测性的灵丹妙药 - 赵梓淇• 异步编程的共同优势 • async/await 关键字 • 用户态调度 • Async Rust 的独特优势 • Ownership 与 Lifetime • 无栈协程 Async Rust 回顾 Rust 的无栈协程抽象 — Future Async Rust 回顾 • 通过 poll 驱动的状态机 • 组合嵌套为调度单元: Task • async fn 语法糖 Async • 痛点:观测与调试工具无法理解灵活的执行逻辑 • Backtrace 不够直观 ( 调用栈 -> 调用树 ) • Tracing 无法追踪调用关系的变化 Async Rust 观测与调试的痛点 Async Rust 回顾 • 特性:用户态调度的无栈协程 • Pending Task 不存在栈空间 • 痛点:观测与调试工具无法还原 Pending Task 的执行状态 • 难以得知 Await-Tree 的 设计原理与实现 2 回顾 Async Rust 的设计与痛点 1 Await-Tree 的 应用与真实案例 3 设计目标 Await Tree 的设计原理与实现 • 追踪关键 Future 的生命周期和控制流 • Init, First Poll, Pending, Next Poll, Ready, Cancel • 实时将 Task 的执行状态维护为一棵树0 码力 | 37 页 | 8.60 MB | 1 年前3
Rust 程序设计语言简体中文版和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒绝 编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间集 中在程序逻辑上,而不是追踪 bug。 Rust 也为系统编程世界带来了现代化的开发工具: • Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。 • Rustfmt 我们将数组的值写成在方括号内,用逗号分隔: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; } 当你想要在栈(stack)而不是在堆(heap)上为数据分配空间(第四章将讨论栈与堆的更多 内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类 型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不 变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3 。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。 访问数组元素 数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元 素,像这样: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 40 码力 | 600 页 | 12.99 MB | 1 年前3
Rust 程序设计语言 简体中文版 1.85.0试和经验丰富的开发者的仔细审核代码来捕捉。在 Rust 中,编译器充当了守门员的角色,拒 绝编译包含这些难以察觉的错误的代码,包括并发错误。通过与编译器合作,团队可以将时间 集中在程序逻辑上,而不是追踪 bug。 Rust 也为系统编程世界带来了现代化的开发工具: • Cargo 是内置的依赖管理器和构建工具,它能轻松增加、编译和管理依赖,并使依赖在 Rust 生态系统中保持一致。 • Rustfmt 我们将数组的值写成在方括号内,用逗号分隔的列表: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 4, 5]; } 当你想要在栈(stack)而不是在堆(heap)上为数据分配空间(第四章将讨论栈与堆的更多 内容),或者是想要确保总是有固定数量的元素时,数组非常有用。但是数组并不如 vector 类 型灵活。vector 类型是标准库提供的一个 允许 增长和缩小长度的类似数组的集合类型。当不 5]; 变量名为 a 的数组将包含 5 个元素,这些元素的值最初都将被设置为 3。这种写法与 let a = [3, 3, 3, 3, 3]; 效果相同,但更简洁。 访问数组元素 数组是可以在栈 (stack) 上分配的已知固定大小的单个内存块。可以使用索引来访问数组的元 素,像这样: 文件名:src/main.rs fn main() { let a = [1, 2, 3, 40 码力 | 562 页 | 3.23 MB | 1 月前3
Rust 语言学习笔记...................................... 71 6.4 堆,栈,BOX............................................................................... 74 6.4.1 堆和栈 .................................................. // 变量 a 和 c 的作用域结束 尽管可以编译通过,但这是一段非常糟糕的代码,变量 a 和 c 都是局部变量, 函数结束后将局部变量 a 的地址返回,但局部变量 a 存在栈中,在离开作用域 后,局部变量所申请的栈上内存都会被系统回收,从而造成了 Dangling Pointer 的问题。这是一个非常典型的内存安全问题。很多编程语言都存在类 似这样的内存安全问题。 再来看变量 c,c x } 3.4 高级所有权 前面三小节未大量涉及到关于所有权中的比较高级用法。 3.4.1.函数传递参数和返回参数类似于 let 语句 在 rust 中,函数是存放在函数栈,为了更为快速的运行。 函数输入参数的传递和返回参数的赋值类似于 let 语句,都看传递的参数和返 回的参数是否实现了 copy trait。 如果实现了 copy trait,那么就不会夺走它的所有权,标识符在函数外部还可0 码力 | 117 页 | 2.24 MB | 1 年前3
Rust语言核心竞争力-庄晓立cap: usize, len: usize, } Very big data in the heap ... ptr cap len ptr cap len 栈(Stack) 堆(Heap) 浅拷贝(Shallow Copy) 附加Move语义 Drop & RAII 变量(bindings)和资源(resources)的关系 Resources: 同一个变量可能持有资源也可能不持有资源; 同一时刻有且只有一个变量唯一持有(Owns)某个资源。 持有资源的变量超出作用域或被另赋新值时,自动调用 资源析构函数(Drop),无论该资源在堆上还是栈上。 Rust的RAII青出于蓝而胜于蓝(蓝=C++) (std::unique_ptr) Borrowing(租借使用权) Shared borrow (多人共享/只 读) Mutable i32 { &self.x } struct Foo<'a, T: 'a> { x: &'a T, } Borrow Checker Borrowck是编译器内部组件,负责在 “编译期” 追踪审查引 用的有效性,是保证内存安全的重要功臣。运行时零开销。 fn main() { let mut v = vec![0, 1, 2, 3, 4, 5, 6]; let deleted0 码力 | 51 页 | 1.09 MB | 1 年前3
Comprehensive Rust(简体中文) 202412日语版本译者:@CoinEZ-JPN 和@momotaro1105。 • 意大利语版本译者:@henrythebuilder 和@detro。 如果你想协助翻译,请参阅翻译说明,了解如何开始翻译工作。翻译工作可通过此议题追踪。 16 第 2 部分 使用Cargo 开始了解 Rust 后,你很快就会遇到 Cargo,这是 Rust 生态系统中用于构建和运行 Rust 应用的标准工 具。在这里,我们想简要介绍一下什么是 19.1 回顾:程序的内存分配 程序通过以下两种方式分配内存: • 栈:局部变量的连续内存区域。 – 值在编译时具有已知的固定大小。 – 速度极快:只需移动一个栈指针。 – 易于管理:遵循函数调用规则。 – 优秀的内存局部性。 • 堆:函数调用之外的值的存储。 – 值具有动态大小,具体大小需在运行时确定。 – 比栈稍慢:需要向系统申请空间。 – 不保证内存局部性。 示例 Creating trait 的类型可能大小不同。因此,上例中不可能具有像 Vec这样的项。 • 可通过“dyn Pet”这个方法向编译器告知实现“Pet”的动态大小类型。 • 在本例中,pets 在栈上分配内存,矢量数据存储在堆上。这两个矢量元素是 胖指 : – 胖指针属于全角指针。它包含两个部分:指向实际对象的指针,以及指向该特定对象的 Pet 实 现的虚拟方法表 (vtable) 的指针。 0 码力 | 359 页 | 1.33 MB | 10 月前3
Hello 算法 1.1.0 Rust版都隐藏着精 妙的算法思想。 同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 羽毛球筒则如同“队列”,一端放入、另一端取出;字典就像一个“哈希表”,能够快速查找目标词条。 本书旨在通过清晰易懂的动画图解和可运行的代码示例,使读者理解算法和数据结构的核心概念,并能够通 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 第 5 章 栈与队列 90 5.1 栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5.2 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。0 码力 | 388 页 | 18.50 MB | 1 年前3
Hello 算法 1.2.0 简体中文 Rust 版都隐藏着精 妙的算法思想。 同样,数据结构无处不在:大到社会网络,小到地铁线路,许多系统都可以建模为“图”;大到一个国家,小 到一个家庭,社会的主要组织形式呈现出“树”的特征;冬天的衣服就像“栈”,最先穿上的最后才能脱下; 羽毛球筒则如同“队列”,一端放入、另一端取出;字典就像一个“哈希表”,能够快速查找目标词条。 本书旨在通过清晰易懂的动画图解和可运行的代码示例,使读者理解算法和数据结构的核心概念,并能够通 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 第 5 章 栈与队列 90 5.1 栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5.2 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。0 码力 | 387 页 | 18.51 MB | 10 月前3
Hello 算法 1.0.0 Rust版. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 第 5 章 栈与队列 90 5.1 栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 5.2 本书的主要内容如图 0‑1 所示。 ‧ 复杂度分析:数据结构和算法的评价维度与方法。时间复杂度和空间复杂度的推算方法、常见类型、示 例等。 ‧ 数据结构:基本数据类型和数据结构的分类方法。数组、链表、栈、队列、哈希表、树、堆、图等数据 结构的定义、优缺点、常用操作、常见类型、典型应用、实现方法等。 ‧ 算法:搜索、排序、分治、回溯、动态规划、贪心等算法的定义、优缺点、效率、应用场景、解题步骤 和示例问题等。 递归:将问题分解为子问题 ?(?) = ?+?(?−1) ,不断(递归地)分解下去,直至基本情况 ?(1) = 1 时终止。 1. 调用栈 递归函数每次调用自身时,系统都会为新开启的函数分配内存,以存储局部变量、调用地址和其他信息等。 这将导致两方面的结果。 ‧ 函数的上下文数据都存储在称为“栈帧空间”的内存区域中,直至函数返回后才会被释放。因此,递归 通常比迭代更加耗费内存空间。 ‧ 递归调用函数会产生额0 码力 | 383 页 | 17.61 MB | 1 年前3
共 20 条
- 1
- 2













