Movatterモバイル変換


[0]ホーム

URL:


  1. Web
  2. JavaScript
  3. JavaScript-Referenz
  4. Eingebaute Standardobjekte
  5. SharedArrayBuffer

Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.

View in EnglishAlways switch to English

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.

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.

js
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:

js
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:

  • DasAtomics-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.Memory kann dennoch verwendet werden, um eine Instanz zu erhalten.
  • Sofern die beiden oben genannten Header nicht gesetzt sind, werfen die verschiedenenpostMessage()-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 neuesSharedArrayBuffer-Objekt.

Statische Eigenschaften

SharedArrayBuffer[Symbol.species]

Gibt den Konstruktor zurück, der zur Konstruktion von Rückgabewerten vonSharedArrayBuffer-Methoden verwendet wird.

Instanz-Eigenschaften

Diese Eigenschaften sind aufSharedArrayBuffer.prototype definiert und werden von allenSharedArrayBuffer-Instanzen geteilt.

SharedArrayBuffer.prototype.byteLength

Die Größe, in Bytes, des Arrays. Diese wird festgelegt, wenn das Array erstellt wird und kann nur geändert werden, wenn derSharedArrayBuffer wachstumsfähig ist, unter Verwendung derSharedArrayBuffer.prototype.grow()-Methode.

SharedArrayBuffer.prototype.constructor

Die Konstruktorfunktion, die das Instanzobjekt erstellt hat. FürSharedArrayBuffer-Instanzen ist der Initialwert derSharedArrayBuffer-Konstruktor.

SharedArrayBuffer.prototype.growable

Schreibgeschützt. Gibttrue zurück, wenn derSharedArrayBuffer wachsen kann, oderfalse, wenn nicht.

SharedArrayBuffer.prototype.maxByteLength

Die schreibgeschützte maximale Länge, in Bytes, auf die derSharedArrayBuffer wachsen 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 denSharedArrayBuffer auf die angegebene Größe in Bytes.

SharedArrayBuffer.prototype.slice()

Gibt einen neuenSharedArrayBuffer zurück, dessen Inhalt eine Kopie der Bytes diesesSharedArrayBuffer vonbegin (einschließlich) bisend (ausschließlich) ist. Wenn entwederbegin oderend negativ 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

js
const sab = new SharedArrayBuffer(1024);

Slicing des SharedArrayBuffer

js
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

js
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

Help improve MDN

Learn how to contribute Diese Seite wurde automatisch aus dem Englischen übersetzt.

[8]ページ先頭

©2009-2026 Movatter.jp