Movatterモバイル変換


[0]ホーム

URL:


MDN Web Docs

Experiment: Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.

SharedArrayBuffer

BaselineWidely available *

DasSharedArrayBuffer-Objekt wird verwendet, um einen generischen Rohdatenpuffer darzustellen, ähnlich demArrayBuffer-Objekt, jedoch auf eine Weise, dass darauf Ansichten des gemeinsamen Speichers erstellt werden können. EinSharedArrayBuffer ist keinTransferable Object, im Gegensatz zu einemArrayBuffer, das übertragbar ist.

Beschreibung

Um Speicher mittelsSharedArrayBuffer-Objekten von einem Agenten im Cluster zum anderen zu teilen (ein Agent ist entweder das Hauptprogramm der Webseite oder einer ihrer Web Worker), werdenpostMessage und dasstrukturierte Klonen verwendet.

Der Algorithmus für strukturiertes Klonen akzeptiertSharedArrayBuffer-Objekte und typisierte Arrays, die aufSharedArrayBuffer-Objekte abgebildet sind. In beiden Fällen wird dasSharedArrayBuffer-Objekt an den Empfänger übertragen, was zu einem neuen, privatenSharedArrayBuffer-Objekt im empfangenden Agenten führt (genauso wie beimArrayBuffer). Der gemeinsam genutzte Datenblock, auf den sich die beidenSharedArrayBuffer-Objekte beziehen, ist jedoch derselbe Datenblock, und eine Auswirkung auf den Block bei einem Agenten wird schließlich im anderen Agenten sichtbar.

js
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 sindatomare Operationen erforderlich.

SharedArrayBuffer-Objekte werden von einigen Web-APIs verwendet, wie z.B.:

Sicherheitsanforderungen

Gemeinsamer Speicher und hochauflösende Timer wurden Anfang 2018wirksam deaktiviert im Lichte vonSpectre. 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 einemsicheren Kontext undcross-origin isoliert sein. Sie können die EigenschaftenWindow.crossOriginIsolated undWorkerGlobalScope.crossOriginIsolated verwenden, um zu überprüfen, ob das Dokument cross-origin 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 es cross-origin isoliert ist, wirftpostMessage() nicht mehr fürSharedArrayBuffer-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:

  • 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 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 verschiedenenpostMessage()-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 demshared-Konstruktor-Flag erstellt werden. Wenn dieses Flag auftrue gesetzt ist, kann das konstruierteMemory-Objekt zwischen Workern überpostMessage() geteilt werden, ähnlich wieSharedArrayBuffer, und der unterstützendebuffer desMemory-Objekts ist einSharedArrayBuffer. Daher gelten die oben genannten Anforderungen für das Teilen einesSharedArrayBuffer zwischen Workern auch für das Teilen einesWebAssembly.Memory.

Der WebAssembly Threads-Vorschlag definiert auch eine neue Reihe vonatomaren Anweisungen. Genau wieSharedArrayBuffer 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 dermaxByteLength-Option beim Aufruf desSharedArrayBuffer()-Konstruktors erweiterbar gemacht werden. Sie können abfragen, ob einSharedArrayBuffer erweiterbar ist und wie groß seine maximale Größe ist, indem Sie seinegrowable- undmaxByteLength-Eigenschaften abfragen. Sie können einem erweiterbarenSharedArrayBuffer mit einem Aufruf vongrow() 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 neuer Größe erstellen. Es gleicht auch JavaScript in diesem Punkt mit WebAssembly an (Wasm-Linear-Speicher kann mitWebAssembly.Memory.prototype.grow() vergrößert werden).

Aus Sicherheitsgründen könnenSharedArrayBuffers nicht verkleinert werden, sondern nur wachsen.

Konstruktor

SharedArrayBuffer()

Erstellt ein neuesSharedArrayBuffer-Objekt.

Statische Eigenschaften

SharedArrayBuffer[Symbol.species]

Gibt den Konstruktor zurück, der verwendet wird, um Rückgabewerte vonSharedArrayBuffer-Methoden zu konstruieren.

Instanzeigenschaften

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

SharedArrayBuffer.prototype.byteLength

Die Größe in Bytes des Arrays. Dies wird beim Erstellen des Arrays festgelegt und kann nur geändert werden, wenn dasSharedArrayBuffer erweiterbar ist, mittels derSharedArrayBuffer.prototype.grow()-Methode.

SharedArrayBuffer.prototype.constructor

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

SharedArrayBuffer.prototype.growable

Schreibgeschützt. Gibttrue zurück, wenn dasSharedArrayBuffer vergrößert werden kann, oderfalse, wenn nicht.

SharedArrayBuffer.prototype.maxByteLength

Die schreibgeschützte maximale Länge in Bytes, auf die dasSharedArrayBuffer vergrößert werden kann. Dies wird beim Erstellen 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.

Instanzmethoden

SharedArrayBuffer.prototype.grow()

Vergrößert dasSharedArrayBuffer auf die angegebene Größe in Bytes.

SharedArrayBuffer.prototype.slice()

Gibt ein neuesSharedArrayBuffer 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

js
const sab = new SharedArrayBuffer(1024);

Schneiden 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

MDN-Feedback-Box

Diese Seite wurde automatisch aus dem Englischen übersetzt.


[8]ページ先頭

©2009-2025 Movatter.jp