一、传递数据原理
1、Module对象
Module对象:Module对象是一个方法容器,通过该对象可以实现操作内存,与浏览器进行交互,以及调用wasm模块对外暴露的方法。
Module对象创建过程:使用fetch方法从远程加载一个标准的wasm模块文件,当模块加载完成后,再通过fetch api标准定义的用于处理响应数据的方法来将这次请求的响应数据转换成ArrayBuffer二进制数据形式。最后,使用这些二进制数据来填充Module对象中名为wasmBinary的属性。
Module对象的使用:当新的script标签被拼接到HTML中时,浏览器便开始从远程位置加载script标签指定的JavaScript脚本文件。加载完成后,浏览器开始执行脚本内部的代码。当脚本内的代码被执行完毕后,该script标签对应的sript.onload方法便会被调用执行。而在这个回调函数的内部,我们便可以通过Module对象与已经加载并初始化好的wasm模块进行交互。
2、共享线性内存
通常情况下,我们会通过“共享线性内存”的方式在wasm模块和Javascript之间传递复杂的数据结构。这块共享的线性内存在wasm模块实例化后便有了固定的起始地址和大小。
随着wasm应用的运行,共享内存可能会由于剩余资源不足而导致内存溢出问题,这时我们可以使用Webassembly MVP标准在javascript标准库中提供的相关接口,对这块共享内存大小做出动态调整。
“分页机制”:Webassembly对内存的管理采用了分页机制,当通过javascript标准接口对这块共享内存进行资源分配操作时,需要以“页”为单位计算实际分配的内存大小。在webassembly标准中规定,一个wasm内存页所占用的实际内存大小为64KB,即65536字节。
MMU(内存管理单元):在现代计算机组成中,内存分页机制是一种重要的内存管理机制。在计算机内部,CPU是通过地址总线寻址方式来直接访问物理内存的。例如一个基于X86架构的CPU其地址总线宽度为32位,即能够支持的最大物理内存大小是4GB。若一个应用程序需要8GB的内存,而实际可用的物理内存只有4GB,开发者不得不重新编写程序,以降低内存使用空间。在现代CPU中引入了MMU(内存管理单元)来解决此类问题。
MMU核心:使用虚拟内存地址来代替物理内存地址。内存分页机制会将虚拟内存地址和物理内存地址按照固定大小分别分割陈“页”和“页帧”两种形式,并保证页和页帧大小相同。页和页帧的出现使得操作系统可以进行非连续的内存分配,因为应用程序所占用的内存在实际物理介质上可能并不是连续存储的,以“页帧”为单位的内存段可能分散在整块物理线性内存的各个地方。另外当操作系统本身可用的物理内存容量不够时,CPU可以将一些不常用的物理内存页帧暂时转移到其他的线性存储设备上,比如硬盘。
“页表”:用例记录虚拟内存和物理内存的映射关系。页表被存放在物理内存中。CPU通过地址总线访问物理内存的速度要慢于直接访问寄存器的速度。因此,为仅以优化地址的解析速度,在CPU