Baseline Widely available *
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.
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.:
WebGLRenderingContext.bufferData()
WebGLRenderingContext.bufferSubData()
WebGL2RenderingContext.getBufferSubData()
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.
Je nachdem, ob die oben genannten SicherheitsmaÃnahmen ergriffen werden, sind die verschiedenen APIs zur Speicherfreigabe unterschiedlich verfügbar:
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.postMessage()
-APIs für SharedArrayBuffer
-Objekte einen Fehler. Wenn sie gesetzt sind, funktioniert postMessage()
auf Window
-Objekten und dedizierten Workern und erlaubt die Speicherfreigabe.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.
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.
Erstellt ein neues SharedArrayBuffer
-Objekt.
Gibt den Konstruktor zurück, der verwendet wird, um Rückgabewerte von SharedArrayBuffer
-Methoden zu konstruieren.
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 der SharedArrayBuffer.prototype.grow()
-Methode.
Die Konstrukturfunktion, die das Instanzobjekt erstellt hat. Für SharedArrayBuffer
-Instanzen ist der Anfangswert der SharedArrayBuffer
-Konstruktor.
Schreibgeschützt. Gibt true
zurück, wenn das SharedArrayBuffer
vergröÃert werden kann, oder false
, 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 in Object.prototype.toString()
verwendet.
VergröÃert das SharedArrayBuffer
auf die angegebene GröÃe in Bytes.
Gibt ein neues SharedArrayBuffer
zurück, dessen Inhalt eine Kopie der Bytes dieses SharedArrayBuffer
ist, von begin
(einschlieÃlich) bis end
(ausschlieÃlich). Wenn begin
oder end
negativ sind, beziehen sie sich auf einen Index vom Ende des Arrays, anstatt vom Anfang.
const sab = new SharedArrayBuffer(1024);
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 Browser-Kompatibilität Siehe auch
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4