ipc - 多个 Wasm 模块可以相互交互并直接通过函数共享内存吗?

标签 ipc shared-memory webassembly dynamic-linking

有没有办法实例化两个 Wasm 模块,ab这样a可以从 b 调用函数并且还从 b 访问不同的内存?例如,假设 a通过调用 malloc 的实现来获取内存在 b暴露于 a .这样,所有有用的内存都来自b .如果是这样,怎么办?
更具体地说,这是否可以在没有额外开销的情况下完成,并且在这些操作之间不与 JavaScript 交互(实例化模块和设置导入/导出时的初始化步骤除外)?这种间接和内存访问的性能特点是什么,或者根本没有问题?在这种情况下,我想进行微优化。

(我已经阅读了几篇文档,但我找不到明确的答案。我认为在 Wasm 的 future 版本中,有标准化动态链接的计划会有所帮助,但我们还没有。)

最佳答案

Is there a way to instantiate two WASM modules, a and b such that a can call functions from b


是的,您可以实例化模块 b导出其函数之一,然后实例化 a导入该函数,以便两者可以交互。但是,这不会像一个 WebAssembly 函数调用另一个函数那样快,因为调用是通过主机环境进行的。

and also access the distinct memory from b


是的,再一次,这是可能的。线性内存可以在 WebAssembly 模块和它的主机之间共享,也可以在两个模块之间共享。

can this be done without additional overhead, and without interacting with JavaScript in-between these operations


如上所述,不,如果没有额外的开销,目前无法完成。
随着 WebAssembly 规范的增强和成熟,这将在 future 发生变化。在两个 WebAssembly 模块之间进行有效直接通信所涉及的一项挑战是理解每个模块公开的 API。 WebAssembly 是一个编译目标,不同的源语言(C++、Rust)以不同的方式编码类型——这极大地限制了模块间的通信。
一个重要的垫脚石是Interface Types ,它对模块/函数的 API 规范进行编码。一旦实现了这一点,WebAssembly 模块之间的直接通信应该是完全可能的。

关于ipc - 多个 Wasm 模块可以相互交互并直接通过函数共享内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59727133/

相关文章:

webassembly - 类型错误 : WebAssembly Instantiation: Imports argument must be present and must be an object

mysql - 运行 wasm-pack 时导入 mysql 出现很多错误

c - 是否可以使用 IPC 将二维数组分配为共享内存?

sockets - Unix-如何将消息发送到多个进程?

linux - 在 Linux 中共享可执行内存页?

multithreading - 为什么 Rust 互斥锁似乎没有给最后想要锁定它的线程锁?

c++ - 在 Linux 上的进程之间传递消息的最快技术?

c# - AsyncCallback 可以使用非静态委托(delegate)吗?

c++ - cuda 将大于线程数的数组复制到共享内存

webassembly - 如何多次使用pyodide功能