Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
SharedArrayBuffer
Baseline Widely available *
This feature is well established and works across many devices and browser versions. It’s been available across browsers since Dezember 2021.
* Some parts of this feature may have varying levels of support.
DasSharedArrayBuffer-Objekt wird verwendet, um einen generischen rohen binären Datenpuffer darzustellen, ähnlich demArrayBuffer-Objekt, jedoch so, dass es möglich ist, Ansichten auf gemeinsam genutzten Speicher zu erstellen. EinSharedArrayBuffer ist keinTransferable Object, im Gegensatz zu einemArrayBuffer, der übertragbar ist.
In diesem Artikel
Beschreibung
Um Speicher mithilfe vonSharedArrayBuffer-Objekten von einem Agent im Cluster zu einem anderen zu teilen (ein Agent ist entweder das Hauptprogramm der Webseite oder einer ihrer Webworker), wirdpostMessage undstrukturiertes Klonen verwendet.
Der Algorithmus für strukturiertes Klonen akzeptiertSharedArrayBuffer-Objekte und Typarrays, die aufSharedArrayBuffer-Objekte abgebildet sind. In beiden Fällen wird dasSharedArrayBuffer-Objekt an den Empfänger übermittelt, was zu einem neuen, privatenSharedArrayBuffer-Objekt im empfangenden Agent führt (genau wie beiArrayBuffer). Der gemeinsam genutzte Datenblock, auf den die beidenSharedArrayBuffer-Objekte verweisen, ist jedoch derselbe Datenblock, und ein Nebeneffekt auf den Block in einem Agent wird schließlich im anderen Agent sichtbar.
const sab = new SharedArrayBuffer(1024);worker.postMessage(sab);Gemeinsam genutzter Speicher kann gleichzeitig in Workern oder dem Hauptthread erstellt und aktualisiert werden. Je nach System (CPU, Betriebssystem, Browser) kann es eine Weile dauern, bis die Änderung in allen Kontexten propagiert wird. Um dies zu synchronisieren, sindatomare Operationen erforderlich.
SharedArrayBuffer-Objekte werden von einigen Web-APIs verwendet, wie zum Beispiel:
Sicherheitsanforderungen
Gemeinsam genutzter Speicher und hochauflösende Timer wurden Anfang 2018effektiv deaktiviert im Lichte vonSpectre. Im Jahr 2020 wurde ein neuer, sicherer Ansatz standardisiert, um gemeinsamen Speicher wieder zu ermöglichen.
Um gemeinsam genutzten Speicher zu verwenden, muss Ihr Dokument in einemsicheren Kontext sein undüber Ursprünge isoliert sein. Sie können die EigenschaftenWindow.crossOriginIsolated undWorkerGlobalScope.crossOriginIsolated verwenden, um zu überprüfen, ob das Dokument über Ursprünge 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 über Ursprünge isoliert, wirftpostMessage() fürSharedArrayBuffer-Objekte nicht länger Ausnahmen, und gemeinsam genutzter Speicher zwischen Threads ist daher verfügbar.
Verfügbarkeit von APIs
Je nachdem, ob die oben genannten Sicherheitsmaßnahmen ergriffen werden, haben die verschiedenen Speicherfreigabe-APIs unterschiedliche Verfügbarkeiten:
- 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 erwähnten Header sind gesetzt, für die Kompatibilität mit Web-Inhalten. Es besteht die Hoffnung, dass diese Einschränkung in Zukunft aufgehoben werden kann.WebAssembly.Memorykann dennoch verwendet werden, um eine Instanz zu erhalten.- Sofern die beiden oben genannten Header nicht gesetzt sind, werfen die verschiedenen
postMessage()-APIs fürSharedArrayBuffer-Objekte Ausnahmen. Wenn sie jedoch gesetzt sind, funktionierenpostMessage()aufWindow-Objekten und dedizierten Workern und ermöglichen die Speicherfreigabe.
WebAssembly gemeinsamer Speicher
WebAssembly.Memory-Objekte können mit demshared Konstruktor-Flag erstellt werden. Wenn dieses Flag auftrue gesetzt ist, kann das konstruierteMemory-Objekt zwischen Workern überpostMessage() geteilt werden, genau wieSharedArrayBuffer, und der zugrunde liegendebuffer desMemory-Objekts ist einSharedArrayBuffer. Daher gelten die oben aufgeführten Anforderungen für das Teilen einesSharedArrayBuffer zwischen Workern auch für das Teilen einesWebAssembly.Memory.
Der WebAssembly Threads-Vorschlag definiert auch einen neuen Satz vonatomaren Instruktionen. Genau wieSharedArrayBuffer und seine Methoden bedingungslos aktiviert sind (und nur das Teilen zwischen Threads durch die neuen Header gesteuert wird), sind die WebAssembly-atomaren Instruktionen ebenfalls bedingungslos erlaubt.
Wachstum von SharedArrayBuffers
SharedArrayBuffer-Objekte können durch Einschließen dermaxByteLength-Option beim Aufruf desSharedArrayBuffer()-Konstruktors wachstumsfähig gemacht werden. Sie können überprüfen, ob einSharedArrayBuffer wachstumsfähig ist und wie groß es maximal sein kann, indem Sie auf seinegrowable- undmaxByteLength-Eigenschaften zugreifen. Sie können einem wachstumsfähigenSharedArrayBuffer mit einemgrow()-Aufruf eine neue Größe zuweisen. Neue Bytes werden auf 0 initialisiert.
Diese Funktionen machen das Wachstum vonSharedArrayBuffers effizienter — andernfalls müssen Sie eine Kopie des Puffers mit einer neuen Größe erstellen. Es bringt auch die JavaScript-Parität mit WebAssembly in dieser Hinsicht (Wasm-Speicher kann mitWebAssembly.Memory.prototype.grow() resized werden).
Aus Sicherheitsgründen könnenSharedArrayBuffers nicht in der Größe reduziert werden, sondern nur wachsen.
Konstruktor
SharedArrayBuffer()Erstellt ein neues
SharedArrayBuffer-Objekt.
Statische Eigenschaften
SharedArrayBuffer[Symbol.species]Gibt den Konstruktor zurück, der zur Konstruktion von Rückgabewerten von
SharedArrayBuffer-Methoden verwendet wird.
Instanz-Eigenschaften
Diese Eigenschaften sind aufSharedArrayBuffer.prototype definiert und werden von allenSharedArrayBuffer-Instanzen geteilt.
SharedArrayBuffer.prototype.byteLengthDie Größe, in Bytes, des Arrays. Diese wird festgelegt, wenn das Array erstellt wird und kann nur geändert werden, wenn der
SharedArrayBufferwachstumsfähig ist, unter Verwendung derSharedArrayBuffer.prototype.grow()-Methode.SharedArrayBuffer.prototype.constructorDie Konstruktorfunktion, die das Instanzobjekt erstellt hat. Für
SharedArrayBuffer-Instanzen ist der Initialwert derSharedArrayBuffer-Konstruktor.SharedArrayBuffer.prototype.growableSchreibgeschützt. Gibt
truezurück, wenn derSharedArrayBufferwachsen kann, oderfalse, wenn nicht.SharedArrayBuffer.prototype.maxByteLengthDie schreibgeschützte maximale Länge, in Bytes, auf die der
SharedArrayBufferwachsen kann. Diese wird bei der Erstellung des Arrays festgelegt und kann nicht geändert werden.SharedArrayBuffer.prototype[Symbol.toStringTag]Der anfängliche Wert der
[Symbol.toStringTag]-Eigenschaft ist der String"SharedArrayBuffer". Diese Eigenschaft wird inObject.prototype.toString()verwendet.
Instanz-Methoden
SharedArrayBuffer.prototype.grow()Vergrößert den
SharedArrayBufferauf die angegebene Größe in Bytes.SharedArrayBuffer.prototype.slice()Gibt einen neuen
SharedArrayBufferzurück, dessen Inhalt eine Kopie der Bytes diesesSharedArrayBuffervonbegin(einschließlich) bisend(ausschließlich) ist. Wenn entwederbeginoderendnegativ ist, bezieht es sich auf einen Index vom Ende des Arrays, im Gegensatz zum Anfang.
Beispiele
Beachten Sie, dass diese Beispiele nicht direkt aus der Konsole oder einer beliebigen Webseite ausgeführt werden können, daSharedArrayBuffer nicht definiert ist, es sei denn, seineSicherheitsanforderungen sind erfüllt.
Erstellen eines neuen SharedArrayBuffer
const sab = new SharedArrayBuffer(1024);Slicing 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
AtomicsArrayBuffer- JavaScript typisierte Arrays Leitfaden
- Web Worker
- 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-PolicyCross-Origin-Embedder-PolicyCross-Origin-Resource-PolicyWindow.crossOriginIsolatedundWorkerGlobalScope.crossOriginIsolated- SharedArrayBuffer-Updates in Android Chrome 88 und Desktop Chrome 92 auf developer.chrome.com (2021)