Rust 异步并发框架在移动端的应用 - 陈明煜Introduction to third party Runtime crates and their incompatibility with mobile environment Rust 异步机制 Asynchronous Rust 异步并发框架是许多大型应用、系统具备的底层能力。 区别于多线程编程模型,它带来以下优势: 任务调度颗粒度更小,充分利用线程资源 更可控的线程数 async / await Waker asyn c Future Waker poll Syntax sugar wake await Rust 异步机制 Asynchronous Rust Rust 异步机制 Asynchronous Rust Waker Task Future task Queue wake Worker Future.poll() Reactor 的思想异步化 在同步环境阻塞等待子异步任务完成,在异步 环境异步等待子异步任务完成 优先级继承:子任务默认继承父任务优先级, 也可使用 detached 模式指定其他优先级 任务取消:取消父任务,也将取消所有子任务 性能 Performance 耗时 ( 单位 us) Tokio ylong 耗时比 / tokio IO 低并发,低传输 40,279 49,0180 码力 | 25 页 | 1.64 MB | 1 年前3
Comprehensive Rust(简体中文) 202412Java、Go、Python、JavaScript......:你可以得到和这些语言相同的内存安全特性,并拥 有类似的使用高级语言的感受。同时你可以得到类似 C 和 C++ 的高速且可预测的执行性能(无垃圾 回收机制),以及在需要时对底层硬件的访问。 4.3 Playground The Rust Playground provides an easy way to run short Rust programs with let: fn main() { let x: i32 = 10; println!("x: {x}"); // x = 20; // println!("x: {x}"); } • 取消备注 x = 20,以证明变量默认是不可变的。添加 mut 关键字以允许进行更改。 • 这里的 i32 是变量的类型。编译时必须已知类型,但在很多情况下,由于具有类型推理功能(稍后介 绍),程序员可以忽略这一点。 'X'。 • Rust 会跟踪所有引用的生命周期,以确保它们存在足够长的时间。在安全的 Rust 中不会出现悬空 引用。x_axis 会返回对 point 的引用,但 point 会在该函数返回时取消分配,因此不会进行编 译。 • 我们会在讲到所有权(ownership)时详细讨论借用(borrow)。 9.2 独占引用 独占引用(也称为可变引用)允许更改其所引用的值。它们的类型为&mut0 码力 | 359 页 | 1.33 MB | 11 月前3
Rust 程序设计语言 简体中文版 1.85.0Cargo 只针对 src/main.rs 文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。 Cargo.lock 文件确保可重现构建 Cargo 有一个机制,确保无论是你还是其他人在任何时候重新构建代码,都会生成相同的构建 产物:Cargo 只会使用你指定的依赖版本,除非你明确指定其他版本。例如,如果下周 rand crate 的 0.8.6 版本出来了,该版本包含了一个重要的 这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问 49/562Rust 程序设计语言 简体中文版 并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如 何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。 50/562Rust 程序设计语言 简体中文版 函数 函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 67/562Rust 程序设计语言 简体中文版 什么是所有权? 所有权(ownership)是 Rust 用于如何管理内存的一组规则。所有程序都必须管理其运行时使 用计算机内存的方式。一些语言中具有垃圾回收机制,在程序运行时有规律地寻找不再使用的 内存;在另一些语言中,程序员必须亲自分配和释放内存。Rust 则选择了第三种方式:通过 所有权系统管理内存,编译器在编译时会根据一系列的规则进行检查。如果违反了任何这些规0 码力 | 562 页 | 3.23 MB | 1 月前3
Rust 程序设计语言简体中文版文件的微小修改而更新构建。依赖没有变化,所以 Cargo 知道它可以复用已经为此下载并编译的代码。它只是重新构建了部分(项目)代码。 Cargo.lock 文件确保构建是可重现的 Cargo 有一个机制来确保任何人在任何时候重新构建代码,都会产生相同的结果:Cargo 只会 使用你指定的依赖版本,除非你又手动指定了别的。例如,如果下周 rand crate 的 0.8.6 版 本出来了,它修复了一个重要的 安全原则的例子。在很多底层语言中,并没有进行这类检查, 这样当提供了一个不正确的索引时,就会访问无效的内存。通过立即退出而不是允许内存访问 并继续执行,Rust 让你避开此类错误。第九章会更详细地讨论 Rust 的错误处理机制,以及如 何编写可读性强而又安全的代码,使程序既不会 panic 也不会导致非法内存访问。 54/600 Rust 程序设计语言 简体中文版 3 . 3 . 函 数 函数 Rust 的核心功能(之一)是 所有权(ownership)。虽然该功能很容易解释,但它对语言的其 他部分有着深刻的影响。 所有程序都必须管理其运行时使用计算机内存的方式。一些语言中具有垃圾回收机制,在程序 运行时有规律地寻找不再使用的内存;在另一些语言中,程序员必须亲自分配和释放内存。 Rust 则选择了第三种方式:通过所有权系统管理内存,编译器在编译时会根据一系列的规则 进行检查。如果违反0 码力 | 600 页 | 12.99 MB | 1 年前3
Rust 是否需要另⼀种“⾊彩”的 Future? - 郭⼦兴除⽣成的 Future 实例以取消正在执⾏的异步操作,但取消 总是⽆副作⽤的吗?Rust 是否需要另⼀种“颜⾊”的 Future 为有副作⽤取消的异步⾏为提供安全保证? 回顾如何使⽤ Future ⽀持基于 poll 的 IO,以及基于取消 Future 的流程控制 # 基于 Poll 的 Future io-uring 等异步模型让 Future 的取消不 再⽆副作⽤,这可能导致严重的错误 再⽆副作⽤,这可能导致严重的错误 # 不再是⽆副作⽤的取消 # 最终与折中⽅案 引⼊另⼀种“颜⾊”的 Future 以最终解决 问题,或者基于字节跳动开源的异步驱动 器 monoio 探索的折中⽅案 ⽬录 Rust 中的异步 Rust 基于 Future trait 实现异步编程 pub trait Future { type Output; fn poll(self: Pin<&mut Poll��Ready(Some(ready)), Poll��Pending �� Poll��Ready(None), } } } 取消 Future ⽤户可以突破 async / await 封装⾃⼰的 Future 类型,被构造的 Future 类型不要求返 回完成即可被析构。 async fn task_one() {0 码力 | 19 页 | 7.77 MB | 1 年前3
Comprehensive Rust(繁体中文)with let: fn main() { let x: i32 = 10; println!("x: {x}"); // x = 20; // println!("x: {x}"); } • 取消註解 x = 20,證明變數預設為不可變動。如要允許變更,請加入 mut 關鍵字。 • 這裡的 i32 是變數型別。這是編譯器必須在編譯期間掌握的資訊,但透過型別推斷 (稍後會說明), 程式設計師在許多情況下都能省略其型別宣告。 • &mut self:使用不重複且可變動的參照,從呼叫端借用物件。之後可以再次使用該物件。 • self:取得物件擁有權,並將其移出呼叫端。方法會成為物件的擁有者。系統會在方法傳回時捨棄 物件 (取消分配),但如果其擁有權已明確傳送的情況例外。具備完整擁有權,不自動等同於具備可變 動性。 • mut self: same as above, but the method can mutate the free,或在其指向的記憶體釋出後取消參照指標。 • C++ 提供智慧指標 (unique_ptr、shared_ptr) 等工具,可利用有關呼叫解構函式的語言保證, 確保在函式傳回時釋出記憶體。但這些工具仍很容易遭到濫用,並且會產生類似 C 語言中的那些錯 誤。 • Java、Go 和 Python 會利用垃圾收集器來識別並捨棄無法再存取的記憶體。這能確保任何指標都 可以取消參照,進而消除 UAF (使用已釋放記憶體)0 码力 | 358 页 | 1.41 MB | 11 月前3
Comprehensive Rust(繁体中文) 202406with let: fn main() { let x: i32 = 10; println!("x: {x}"); // x = 20; // println!("x: {x}"); } • 取消註解 x = 20,證明變數預設為不可變動。如要允許變更,請加入 mut 關鍵字。 • 這裡的 i32 是變數型別。這是編譯器必須在編譯期間掌握的資訊,但透過型別推斷 (稍後會說明), 程式設計師在許多情況下都能省略其型別宣告。 • &mut self:使用不重複且可變動的參照,從呼叫端借用物件。之後可以再次使用該物件。 • self:取得物件擁有權,並將其移出呼叫端。方法會成為物件的擁有者。系統會在方法傳回時捨棄 物件 (取消分配),但如果其擁有權已明確傳送的情況例外。具備完整擁有權,不自動等同於具備可變 動性。 • mut self: same as above, but the method can mutate the free,或在其指向的記憶體釋出後取消參照指標。 • C++ 提供智慧指標 (unique_ptr、shared_ptr) 等工具,可利用有關呼叫解構函式的語言保證, 確保在函式傳回時釋出記憶體。但這些工具仍很容易遭到濫用,並且會產生類似 C 語言中的那些錯 誤。 • Java、Go 和 Python 會利用垃圾收集器來識別並捨棄無法再存取的記憶體。這能確保任何指標都 可以取消參照,進而消除 UAF (使用已釋放記憶體)0 码力 | 356 页 | 1.41 MB | 1 年前3
Rust 语言学习笔记. 102 7.5.1 控制访问顺序--等待与通知 ................................................... 103 7.5.2 控制访问顺序的机制-原子类型与锁 ........................................ 104 7.6 并行 ..................................... Java 有相当大的差异。而跟 Ocaml, Haskell 这类函数式语言更加接近。 Rust 做到了内存安全而无需 .NET 和 Java 编程语言中实现自动垃圾收集器的 开销,这是通过所有权/借用机制、生命周期、以及类型系统来达到的。 Rust 程序设计语言的本质在于赋能(empowerment):无论你现在编写的是何 种代码,Rust 能让你在更为广泛的编程领域走得更远,写出自信。 比 语言一样,在局部变量离开作用域后,变量随即会被销毁;但不同是, Rust 会连同变量绑定的内存,不管是否为常量字符串,连同所有者变量一起被 销毁释放。 3.1.3 移动语义 在 Rust 中,和“绑定”概念相辅相成的另一个机制就是“转移 move 所有 权”,意思是,可以把资源的所有权(ownership)从一个绑定转移(move)成另 一个绑定,这个操作同样通过 let 关键字完成,和绑定不同的是,=两边的左值 和右值均为两个标识符:0 码力 | 117 页 | 2.24 MB | 1 年前3
简谈 Rust 与国密 TLS - 王江桐且废弃此版本,对于密码算法进行了更新,使用更安全的密码算法; • RFC 8998:基于 RFC 8446,扩展通用 TLS 1.3,增加国密套件支持,声明 SM4_GCM_SM3 、 SM4_CCM_SM3 以及 SM2 单证书机制在 TLS 1.3 中的使用; • 当前 360 安全浏览器、奇安信可信浏览器等产品已支持 TLCP 协议,部分银行或金融产品仅允许通过 TLCP 协议进行 通信。 国密算法在 TLS 安全协议中的应用 Resumption机制 • SM4GCMSM3 • Sm2国密双证书 • Sm2 GMT ECDHE • Sm2ECC • 国际通用密码套 • 单证书机制 • Resumption + Ticket机制 • SM4GCMSM3 • Sm2国密单/双证书 • Sm2 IEEE ECDHE • Sm2ECC 1 2 3 • 国际通用密码套 • 单证书机制 • Resumption Resumption + Ticket机制 • SM4GCMSM3 • Sm2国密单证书 • Sm2 IEEE ECDHE ylong_tls 支持版本以及特性 提供C-API接口方便C语言使用 ylong_tls Rust Adapt C-API (.h + so\.a) C APP Rust APP Rust纯软件实现 指令加速(X86、ARM) no_std版本 可兼容Openssl的0 码力 | 44 页 | 3.70 MB | 1 年前3
WebAssembly 简介 - 陈思衡image / chart Wasm 的 memory 是 host 内存中的一部分。 对于 Wasm 而言,这块内存是从 0 开始的,而不是 host 所看到的地址。 WebAssembly 机制 memory Wasm 编写的 function 可以通过 “export” 导出给 host 调用。 Host 可以把自己的 function 通过 “import“ 提供给 wasm 调用。 WASM 使用场景和问题 利用语言本身 Async 机制 因为 Rust 的 async 机制是无栈协程,会将 async 部分在编译时隐式转换成一个 Future。 所以我们可以利用这一点来实现一个 Async 的 Wasm。 Async Wasm 解决方案 Photo / image / chart 利用本身 Async 机制 自行实现 Async Runtime Async wasm 中把 future 存入固定内存处。 • 导出 poll 函数给 host 调用。 • 把 host function 包装成自定义 Future。 • 实现简单 利用本身 Async 机制 优点 • 方案不通用(wasm 局限于某一种语言) • 无法与现有生态配合 缺点 Async 的 Wasm 基于 fiber / ucontext Async Wasm 解决方案0 码力 | 24 页 | 773.46 KB | 1 年前3
共 23 条
- 1
- 2
- 3













