国际汽联世界耐力锦标赛开幕中国车队首次夺冠
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.
* Some parts of this feature may have varying levels of support.
Das SharedArrayBuffer
-Objekt wird verwendet, um einen generischen Rohdatenpuffer darzustellen, ?hnlich dem ArrayBuffer
-Objekt, jedoch auf eine Weise, dass darauf Ansichten des gemeinsamen Speichers erstellt werden k?nnen. Ein SharedArrayBuffer
ist kein Transferable Object, im Gegensatz zu einem ArrayBuffer
, das übertragbar ist.
Beschreibung
Um Speicher mittels SharedArrayBuffer
-Objekten von einem Agenten im Cluster zum anderen zu teilen (ein Agent ist entweder das Hauptprogramm der Webseite oder einer ihrer Web Worker), werden postMessage
und das strukturierte Klonen verwendet.
Der Algorithmus für strukturiertes Klonen akzeptiert SharedArrayBuffer
-Objekte und typisierte Arrays, die auf SharedArrayBuffer
-Objekte abgebildet sind. In beiden F?llen wird das SharedArrayBuffer
-Objekt an den Empf?nger übertragen, was zu einem neuen, privaten SharedArrayBuffer
-Objekt im empfangenden Agenten führt (genauso wie beim ArrayBuffer
). Der gemeinsam genutzte Datenblock, auf den sich die beiden SharedArrayBuffer
-Objekte beziehen, ist jedoch derselbe Datenblock, und eine Auswirkung auf den Block bei einem Agenten wird schlie?lich im anderen Agenten sichtbar.
const sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
Gemeinsamer Speicher kann gleichzeitig in Workern oder im Haupt-Thread erstellt und aktualisiert werden. Abh?ngig vom System (der CPU, dem Betriebssystem, dem Browser) kann es eine Weile dauern, bis die ?nderung in allen Kontexten propagiert wird. Zur Synchronisierung sind atomare Operationen erforderlich.
SharedArrayBuffer
-Objekte werden von einigen Web-APIs verwendet, wie z.B.:
Sicherheitsanforderungen
Gemeinsamer Speicher und hochaufl?sende Timer wurden Anfang 2018 wirksam deaktiviert im Lichte von Spectre. Im Jahr 2020 wurde ein neuer, sicherer Ansatz standardisiert, um den gemeinsamen Speicher wieder zu aktivieren.
Um gemeinsamen Speicher zu verwenden, muss Ihr Dokument in einem sicheren Kontext und cross-origin isoliert sein. Sie k?nnen die Eigenschaften Window.crossOriginIsolated
und WorkerGlobalScope.crossOriginIsolated
verwenden, um zu überprüfen, ob das Dokument cross-origin isoliert ist:
const myWorker = new Worker("worker.js");
if (crossOriginIsolated) {
const buffer = new SharedArrayBuffer(16);
myWorker.postMessage(buffer);
} else {
const buffer = new ArrayBuffer(16);
myWorker.postMessage(buffer);
}
Wenn es cross-origin isoliert ist, wirft postMessage()
nicht mehr für SharedArrayBuffer
-Objekte, und gemeinsamer Speicher über Threads hinweg ist daher verfügbar.
API-Verfügbarkeit
Je nachdem, ob die oben genannten Sicherheitsma?nahmen ergriffen werden, sind die verschiedenen APIs zur Speicherfreigabe unterschiedlich verfügbar:
- Das
Atomics
-Objekt ist immer verfügbar. SharedArrayBuffer
-Objekte sind prinzipiell immer verfügbar, aber leider ist der Konstruktor im globalen Objekt verborgen, es sei denn, die beiden oben genannten Header sind gesetzt, um die Kompatibilit?t mit Webinhalten zu gew?hrleisten. Es besteht Hoffnung, dass diese Einschr?nkung in Zukunft entfernt werden kann.WebAssembly.Memory
kann weiterhin verwendet werden, um eine Instanz zu erhalten.- Wenn die oben genannten beiden Header nicht gesetzt sind, werfen die verschiedenen
postMessage()
-APIs fürSharedArrayBuffer
-Objekte einen Fehler. Wenn sie gesetzt sind, funktioniertpostMessage()
aufWindow
-Objekten und dedizierten Workern und erlaubt die Speicherfreigabe.
WebAssembly gemeinsamer Speicher
WebAssembly.Memory
-Objekte k?nnen mit dem shared
-Konstruktor-Flag erstellt werden. Wenn dieses Flag auf true
gesetzt ist, kann das konstruierte Memory
-Objekt zwischen Workern über postMessage()
geteilt werden, ?hnlich wie SharedArrayBuffer
, und der unterstützende buffer
des Memory
-Objekts ist ein SharedArrayBuffer
. Daher gelten die oben genannten Anforderungen für das Teilen eines SharedArrayBuffer
zwischen Workern auch für das Teilen eines WebAssembly.Memory
.
Der WebAssembly Threads-Vorschlag definiert auch eine neue Reihe von atomaren Anweisungen. Genau wie SharedArrayBuffer
und seine Methoden bedingungslos aktiviert sind (und nur das Teilen zwischen Threads auf den neuen Headers basiert), sind die WebAssembly atomaren Anweisungen ebenfalls bedingungslos erlaubt.
Wachstum von SharedArrayBuffers
SharedArrayBuffer
-Objekte k?nnen durch die Angabe der maxByteLength
-Option beim Aufruf des SharedArrayBuffer()
-Konstruktors erweiterbar gemacht werden. Sie k?nnen abfragen, ob ein SharedArrayBuffer
erweiterbar ist und wie gro? seine maximale Gr??e ist, indem Sie seine growable
- und maxByteLength
-Eigenschaften abfragen. Sie k?nnen einem erweiterbaren SharedArrayBuffer
mit einem Aufruf von grow()
eine neue Gr??e zuweisen. Neue Bytes werden auf 0 initialisiert.
Diese Funktionen machen das Wachstum von SharedArrayBuffer
s effizienter — andernfalls müssen Sie eine Kopie des Puffers mit neuer Gr??e erstellen. Es gleicht auch JavaScript in diesem Punkt mit WebAssembly an (Wasm-Linear-Speicher kann mit WebAssembly.Memory.prototype.grow()
vergr??ert werden).
Aus Sicherheitsgründen k?nnen SharedArrayBuffer
s nicht verkleinert werden, sondern nur wachsen.
Konstruktor
-
Erstellt ein neues
SharedArrayBuffer
-Objekt.
Statische Eigenschaften
-
Gibt den Konstruktor zurück, der verwendet wird, um Rückgabewerte von
SharedArrayBuffer
-Methoden zu konstruieren.
Instanzeigenschaften
Diese Eigenschaften sind auf SharedArrayBuffer.prototype
definiert und werden von allen SharedArrayBuffer
-Instanzen geteilt.
-
Die Gr??e in Bytes des Arrays. Dies wird beim Erstellen des Arrays festgelegt und kann nur ge?ndert werden, wenn das
SharedArrayBuffer
erweiterbar ist, mittels derSharedArrayBuffer.prototype.grow()
-Methode. -
Die Konstrukturfunktion, die das Instanzobjekt erstellt hat. Für
SharedArrayBuffer
-Instanzen ist der Anfangswert derSharedArrayBuffer
-Konstruktor. -
Schreibgeschützt. Gibt
true
zurück, wenn dasSharedArrayBuffer
vergr??ert werden kann, oderfalse
, wenn nicht. -
Die schreibgeschützte maximale L?nge in Bytes, auf die das
SharedArrayBuffer
vergr??ert werden kann. Dies wird beim Erstellen des Arrays festgelegt und kann nicht ge?ndert werden. -
Der anf?ngliche Wert der
[Symbol.toStringTag]
-Eigenschaft ist der String"SharedArrayBuffer"
. Diese Eigenschaft wird inObject.prototype.toString()
verwendet.
Instanzmethoden
-
Vergr??ert das
SharedArrayBuffer
auf die angegebene Gr??e in Bytes. -
Gibt ein neues
SharedArrayBuffer
zurück, dessen Inhalt eine Kopie der Bytes diesesSharedArrayBuffer
ist, vonbegin
(einschlie?lich) bisend
(ausschlie?lich). Wennbegin
oderend
negativ sind, beziehen sie sich auf einen Index vom Ende des Arrays, anstatt vom Anfang.
Beispiele
Erstellen eines neuen SharedArrayBuffer
const sab = new SharedArrayBuffer(1024);
Schneiden des SharedArrayBuffer
sab.slice(); // SharedArrayBuffer { byteLength: 1024 }
sab.slice(2); // SharedArrayBuffer { byteLength: 1022 }
sab.slice(-2); // SharedArrayBuffer { byteLength: 2 }
sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }
Verwendung in einem WebGL-Puffer
const canvas = document.querySelector("canvas");
const gl = canvas.getContext("webgl");
const buffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
gl.bufferData(gl.ARRAY_BUFFER, sab, gl.STATIC_DRAW);
Spezifikationen
Specification |
---|
ECMAScript? 2026 Language?Specification # sec-sharedarraybuffer-objects |
Browser-Kompatibilit?t
Siehe auch
Atomics
ArrayBuffer
- JavaScript typisierte Arrays Leitfaden
- Web Workers
- Gemeinsamer Speicher – ein kurzes Tutorial im TC39 ecmascript-sharedmem-Vorschlag
- Ein Vorgeschmack auf JavaScripts neue parallele Primitive auf hacks.mozilla.org (2016)
- COOP und COEP erkl?rt vom Chrome-Team (2020)
Cross-Origin-Opener-Policy
Cross-Origin-Embedder-Policy
Cross-Origin-Resource-Policy
Window.crossOriginIsolated
undWorkerGlobalScope.crossOriginIsolated
- SharedArrayBuffer-Updates in Android Chrome 88 und Desktop Chrome 92 auf developer.chrome.com (2021)