《陈思衡-2023Async_WASM.pdf》由会员分享,可在线阅读,更多相关《陈思衡-2023Async_WASM.pdf(24页珍藏版)》请在三个皮匠报告上搜索。
1、第三届中国Rust开发者大会WebAssembly 简介简介WebAssembly(简称 Wasm)是一种新的编译目标,帮助在 web 中运行高性能应用。它是一种低级语言,设计为编译器目标,以在 web 浏览器中高效运行。WebAssembly 介绍WebAssembly 代码可以以接近原生的速度运行,且具有很小的二进制大小和快速加载速度。#高性能WebAssembly 最初由 Mozilla、Google、Microsoft 等主要浏览器供应商共同设计。它现已在所有主流浏览器中实现,包括 Chrome、Firefox、Safari 和 Edge。#标准稳定#多语言支持WebAssembly
2、设计为安全地嵌入到网页中。它提供一种沙箱环境,禁止直接访问浏览器功能或用户数据。而是需要通过 host function 来访问宿主环境。#安全性现在多种语言都有编译器支持 WebAssembly,如 C/C+、Rust、Go、Zig 等。WebAssembly 简介Photo/image/chartWasm 的 memory 是 host 内存中的一部分。对于 Wasm 而言,这块内存是从 0 开始的,而不是 host 所看到的地址。WebAssembly 机制机制memoryWasm 编写的 function 可以通过“export”导出给 host 调用。Host 可以把自己的 func
3、tion 通过“import“提供给 wasm 调用。functionWebAssembly 简介Photo/image/chartWasm 实例实例 WebAssembly 简介WASI 简介简介WebAssembly System Interface(简称 WASI),它定义了一组 WASM 模块可以调用的系统调用接口。WASI 的目的是让 WASM 模块可以访问底层系统的功能,比如文件系统、网络等。这使得 WASM 可以作为一个更广泛的运行时,不仅仅局限于浏览器环境。WASI 当前定义了一组 POSIX 兼容的系统调用,让 WASM 模块可以访问文件系统。未来 WASI 还会加入更多系统
4、接口,为 WASM 提供更广泛的系统访问能力。WebAssembly 介绍Photo/image/chartWASI 的本质就是一套 host 提供的 function。与开发者自行提供的 host function 相比,WASI 在 Rust 被内置在 std 中。WASI 实例实例 WASI 简介WASM 的应用场景的应用场景WASM 使用场景和问题由于 WASI,WASM 不仅可以在浏览器中运行,其作为一种通用二进制格式,也适用于浏览器外的许多场景:1.物联网设备:WASM 体积小、加载快,很适合运行在物联网设备上。使用 WASM 可以让这些设备运行更复杂的逻辑,实现设备间的互操作性。
5、2.云计算:WASM 模块可以部署在云端运行,为用户提供服务。因为 WASM 是sandbox的,所以可以保证代码的安全性。WASM 的模块化也让云端应用更易于构建和部署。3.用户定义函数(UDF):WASM UDF 安全性更高。WASM 运行在沙箱中,访问受限,可以防止恶意 UDF 对数据和系统产生破坏。与解释执行的 UDF 相比,WASM 作为二进制格式可以获得更高的运行性能。WASM 中中 IO 阻塞问题阻塞问题WASM 使用场景和问题在 WASI 和 一些用户自定义的 Host function 中,难免存在一些如网络服务的阻塞行为。当在 tokio 之类的 async runtime
6、 中执行一些特别的 WASM 时就会遇到 WASM 阻塞 tokio 最终导致服务不可用的情况。阻塞示例阻塞示例 WASM 使用场景和问题利用语言本身利用语言本身 Async 机制机制因为 Rust 的 async 机制是无栈协程,会将 async 部分在编译时隐式转换成一个 Future。所以我们可以利用这一点来实现一个 Async 的 Wasm。Async Wasm 解决方案Photo/image/chart利用本身利用本身 Async 机制机制 自行实现自行实现 Async RuntimeAsync 的 Wasm在 wasm 中把 future 存入固定内存处。导出 poll 函数给 h
7、ost 调用。把 host function 包装成自定义 Future。实现简单利用本身利用本身 Async 机制机制 优点优点方案不通用(wasm 局限于某一种语言)无法与现有生态配合缺点缺点Async 的 Wasm基于基于 fiber/ucontext Async Wasm 解决方案wasmtime-fiber 是一个通过内联汇编,保存当前寄存器和栈数据来实现有栈协程的 rust 库。wasmtime-fiberUcontext 和 fiber 功能相同,但是 linux 的系统库。ucontext执行流程执行流程Async Wasm 解决方案与 WASM 的语言无关。可以复用 WASM
8、 编写语言本身的生态。不会对 WASM 执行产生性能损失基于基于 fiber/ucontext 优点优点实现困难,涉及到汇编。容易出错。需要极其注意内存安全。缺点缺点Async Wasm 解决方案效果示例效果示例 Async Wasm 解决方案基于基于 Asyncify(Binaryen)Async Wasm 解决方案Binaryen 是一个编译器基础架构库,提供了一套用于处理 WebAssembly 的工具。其中一个功能是 asyncify,它允许将同步的 WebAssembly 代码转换为异步代码。就像 rust 对 async function 做的事情一样。Photo/image/chartAsyncify 原理示意原理示意Async Wasm 解决方案执行流程执行流程Async Wasm 解决方案与 WASM 的语言无关。与 CPU 汇编指令无关。可以跨机器调度。可以跨机器调度。Asyncify(Binaryen)优点优点运行效率有所下降。缺点缺点Async Wasm 解决方案Asyncify 跨机器调度跨机器调度Async Wasm 解决方案Asyncify 跨机器调度跨机器调度Async Wasm 解决方案Thank you!