JS SharedArrayBuffer

🌙
手机阅读
本文目录结构

SharedArrayBuffer 对象用来表示一个通用的,固定长度的原始二进制数据缓冲区,类似于 ArrayBuffer 对象,它们都可以用来在共享内存(shared memory)上创建视图。与 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分离。

请注意,由于能够轻易地利用《边信道(side-channel)读取未授权内存的攻击技术》中提到的 Spectre 漏洞——一种利用现代 CPU 使用的执行优化功能的新攻击技术, SharedArrayBuffer 功能将在 Chrome 和 FireFox 的新版本中禁用,并将逐渐被所有浏览器禁用。

但该 API 并不会被废弃,chrome 团队声明在未来解决因 web 时钟导致的安全问题后,该 API 将会恢复。

语法

new SharedArrayBuffer(length)

参数

length

所创建的数组缓冲区的大小,以字节 (byte) 为单位。

返回值

一个大小指定的新 SharedArrayBuffer 对象。其内容被初始化为 0。

描述

SharedArrayBuffer 描述

分配及共享内存

为了将一个 SharedArrayBuffer 对象从一个用户代理共享到另一个用户代理(另一个页面的主进程或者当前页面的一个 worker )从而实现共享内存,我们需要运用 postMessage 和结构化克隆算法( structured cloning )。

结构化克隆算法接收被映射到一个新的 SharedArrayBuffers 对象上的 SharedArrayBuffers 对象与 TypedArrays 对象。在这两种映射下,这个新的 SharedArrayBuffer 对象会被传递到目标用户代理的接收函数上,导致在目标用户代理产生了一个新的私有 SharedArrayBuffer 对象(正如 ArrayBuffer 一样)。然而,这两个 SharedArrayBuffer 对象指向的共享数据块其实是同一个,并且在某一代理中的一个块的副作用将最终导致另一个代理具有可见性。

let sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);

在早期版本的特性中,结构化克隆期间 SharedArrayBuffers 需要被精确转化。然而,从 HTML 的意义上来讲,SharedArrayBuffers 并非一个 Transferable object。因此,如果一个 SharedArrayBuffer 对象位于转化队列,postMessage 将会抛出一个 DataCloneError 或 一个 DOMException :

var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab, [sab]);
// Uncaught DOMException: Failed to execute 'postMessage' on 'Worker': A SharedArrayBuffer could not be cloned.

通过原子操作更新及同步来共享内存

共享内存能被同时创建和更新于工作者线程或主线程。依赖于系统(CPU,操作系统,浏览器),变化传递给环境需要一段时间。需要通过 atomic 操作来进行同步。

接受 SharedArrayBuffer 对象的 API

  • WebGLRenderingContext.bufferData()
  • WebGLRenderingContext.bufferSubData()
  • WebGL2RenderingContext.getBufferSubData()

需要 new 运算符来构造

SharedArrayBuffer 需要 new 运算符来构造一个构造函数。作为函数来调用一个 SharedArrayBuffer 构造函数时,如果不用 new 运算符,将会抛出一个 TypeError 异常。

var sab = SharedArrayBuffer(1024);
// TypeError: calling a builtin SharedArrayBuffer constructor
// 必须用 new 来构造
var sab = new SharedArrayBuffer(1024);

属性

SharedArrayBuffer.length

SharedArrayBuffer 构造函数的 length 属性值为 1。

SharedArrayBuffer.prototype

允许所有 SharedArrayBuffer 对象的附加属性。

SharedArrayBuffer 原型对象

所有 SharedArrayBuffer 实例继承自 SharedArrayBuffer.prototype。

属性

SharedArrayBuffer.prototype.constructor

Specifies the function that creates an object’s prototype. The initial value is the standard built-in SharedArrayBuffer constructor.

SharedArrayBuffer.prototype.byteLength 只读

The size, in bytes, of the array. This is established when the array is constructed and cannot be changed. Read only.

方法

SharedArrayBuffer.prototype.slice(begin, end) Returns a new SharedArrayBuffer whose contents are a copy of this SharedArrayBuffer’s bytes from begin, inclusive, up to end, exclusive. If either begin or end is negative, it refers to an index from the end of the array, as opposed to from the beginning.

规范

规范 状态 备注
ECMAScript Latest Draft (ECMA-262)
SharedArrayBuffer
Draft Initial definition in ES2017.
ECMAScript 2017 (ECMA-262)
SharedArrayBuffer
Standard

AXIHE / 精选资源

浏览全部教程

面试题

学习网站

前端培训
自己甄别

前端书籍

关于朱安邦

我叫 朱安邦,阿西河的站长,在杭州。

以前是一名平面设计师,后来开始接接触前端开发,主要研究前端技术中的JS方向。

业余时间我喜欢分享和交流自己的技术,欢迎大家关注我的 Bilibili

关注我: Github / 知乎

于2021年离开前端领域,目前重心放在研究区块链上面了

我叫朱安邦,阿西河的站长

目前在杭州从事区块链周边的开发工作,机械专业,以前从事平面设计工作。

2014年底脱产在老家自学6个月的前端技术,自学期间几乎从未出过家门,最终找到了满意的前端工作。更多>

于2021年离开前端领域,目前从事区块链方面工作了