| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer | [Back] [Original] |
Get to know MDN better
Dieser Inhalt wurde automatisch aus dem Englischen bersetzt, und kann Fehler enthalten. Erfahre mehr ber dieses Experiment.
Diese Funktion ist gut etabliert und funktioniert auf vielen Gerten und in vielen Browserversionen. Sie ist seit Dezember 2021 browserbergreifend verfgbar.
* Einige Teile dieser Funktion werden mglicherweise unterschiedlich gut untersttzt.
Das SharedArrayBuffer-Objekt wird verwendet, um einen generischen rohen binren Datenpuffer darzustellen, hnlich dem ArrayBuffer-Objekt, jedoch so, dass es mglich ist, Ansichten auf gemeinsam genutzten Speicher zu erstellen. Ein SharedArrayBuffer ist kein Transferable Object, im Gegensatz zu einem ArrayBuffer, der bertragbar ist.
Um Speicher mithilfe von SharedArrayBuffer-Objekten von einem Agent im Cluster zu einem anderen zu teilen (ein Agent ist entweder das Hauptprogramm der Webseite oder einer ihrer Webworker), wird postMessage und strukturiertes Klonen verwendet.
Der Algorithmus fr strukturiertes Klonen akzeptiert SharedArrayBuffer-Objekte und Typarrays, die auf SharedArrayBuffer-Objekte abgebildet sind. In beiden Fllen wird das SharedArrayBuffer-Objekt an den Empfnger bermittelt, was zu einem neuen, privaten SharedArrayBuffer-Objekt im empfangenden Agent fhrt (genau wie bei ArrayBuffer). Der gemeinsam genutzte Datenblock, auf den die beiden SharedArrayBuffer-Objekte verweisen, ist jedoch derselbe Datenblock, und ein Nebeneffekt auf den Block in einem Agent wird schlielich 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, sind atomare Operationen erforderlich.
SharedArrayBuffer-Objekte werden von einigen Web-APIs verwendet, wie zum Beispiel:
WebGLRenderingContext.bufferData()WebGLRenderingContext.bufferSubData()WebGL2RenderingContext.getBufferSubData()Gemeinsam genutzter Speicher und hochauflsende Timer wurden Anfang 2018 effektiv deaktiviert im Lichte von Spectre. Im Jahr 2020 wurde ein neuer, sicherer Ansatz standardisiert, um gemeinsamen Speicher wieder zu ermglichen.
Um gemeinsam genutzten Speicher zu verwenden, muss Ihr Dokument in einem sicheren Kontext sein und ber Ursprnge isoliert sein. Sie knnen die Eigenschaften Window.crossOriginIsolated und WorkerGlobalScope.crossOriginIsolated verwenden, um zu berprfen, ob das Dokument ber Ursprnge 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 Ursprnge isoliert, wirft postMessage() fr SharedArrayBuffer-Objekte nicht lnger Ausnahmen, und gemeinsam genutzter Speicher zwischen Threads ist daher verfgbar.
Je nachdem, ob die oben genannten Sicherheitsmanahmen ergriffen werden, haben die verschiedenen Speicherfreigabe-APIs unterschiedliche Verfgbarkeiten:
Atomics-Objekt ist immer verfgbar.SharedArrayBuffer-Objekte sind prinzipiell immer verfgbar, aber leider ist der Konstruktor im globalen Objekt verborgen, es sei denn, die beiden oben erwhnten Header sind gesetzt, fr die Kompatibilitt mit Web-Inhalten. Es besteht die Hoffnung, dass diese Einschrnkung in Zukunft aufgehoben werden kann. WebAssembly.Memory kann dennoch verwendet werden, um eine Instanz zu erhalten.postMessage()-APIs fr SharedArrayBuffer-Objekte Ausnahmen. Wenn sie jedoch gesetzt sind, funktionieren postMessage() auf Window-Objekten und dedizierten Workern und ermglichen die Speicherfreigabe.WebAssembly.Memory-Objekte knnen 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, genau wie SharedArrayBuffer, und der zugrunde liegende buffer des Memory-Objekts ist ein SharedArrayBuffer. Daher gelten die oben aufgefhrten Anforderungen fr das Teilen eines SharedArrayBuffer zwischen Workern auch fr das Teilen eines WebAssembly.Memory.
Der WebAssembly Threads-Vorschlag definiert auch einen neuen Satz von atomaren Instruktionen. Genau wie SharedArrayBuffer 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.
SharedArrayBuffer-Objekte knnen durch Einschlieen der maxByteLength-Option beim Aufruf des SharedArrayBuffer()-Konstruktors wachstumsfhig gemacht werden. Sie knnen berprfen, ob ein SharedArrayBuffer wachstumsfhig ist und wie gro es maximal sein kann, indem Sie auf seine growable- und maxByteLength-Eigenschaften zugreifen. Sie knnen einem wachstumsfhigen SharedArrayBuffer mit einem grow()-Aufruf eine neue Gre zuweisen. Neue Bytes werden auf 0 initialisiert.
Diese Funktionen machen das Wachstum von SharedArrayBuffers effizienter andernfalls mssen Sie eine Kopie des Puffers mit einer neuen Gre erstellen. Es bringt auch die JavaScript-Paritt mit WebAssembly in dieser Hinsicht (Wasm-Speicher kann mit WebAssembly.Memory.prototype.grow() resized werden).
Aus Sicherheitsgrnden knnen SharedArrayBuffers nicht in der Gre reduziert werden, sondern nur wachsen.
SharedArrayBuffer()Erstellt ein neues SharedArrayBuffer-Objekt.
SharedArrayBuffer[Symbol.species]Gibt den Konstruktor zurck, der zur Konstruktion von Rckgabewerten von SharedArrayBuffer-Methoden verwendet wird.
Diese Eigenschaften sind auf SharedArrayBuffer.prototype definiert und werden von allen SharedArrayBuffer-Instanzen geteilt.
SharedArrayBuffer.prototype.byteLengthDie Gre, in Bytes, des Arrays. Diese wird festgelegt, wenn das Array erstellt wird und kann nur gendert werden, wenn der SharedArrayBuffer wachstumsfhig ist, unter Verwendung der SharedArrayBuffer.prototype.grow()-Methode.
SharedArrayBuffer.prototype.constructorDie Konstruktorfunktion, die das Instanzobjekt erstellt hat. Fr SharedArrayBuffer-Instanzen ist der Initialwert der SharedArrayBuffer-Konstruktor.
SharedArrayBuffer.prototype.growableSchreibgeschtzt. Gibt true zurck, wenn der SharedArrayBuffer wachsen kann, oder false, wenn nicht.
SharedArrayBuffer.prototype.maxByteLengthDie schreibgeschtzte maximale Lnge, in Bytes, auf die der SharedArrayBuffer wachsen kann. Diese wird bei der Erstellung des Arrays festgelegt und kann nicht gendert werden.
SharedArrayBuffer.prototype[Symbol.toStringTag]Der anfngliche Wert der [Symbol.toStringTag]-Eigenschaft ist der String "SharedArrayBuffer". Diese Eigenschaft wird in Object.prototype.toString() verwendet.
SharedArrayBuffer.prototype.grow()Vergrert den SharedArrayBuffer auf die angegebene Gre in Bytes.
SharedArrayBuffer.prototype.slice()Gibt einen neuen SharedArrayBuffer zurck, dessen Inhalt eine Kopie der Bytes dieses SharedArrayBuffer von begin (einschlielich) bis end (ausschlielich) ist. Wenn entweder begin oder end negativ ist, bezieht es sich auf einen Index vom Ende des Arrays, im Gegensatz zum Anfang.
Beachten Sie, dass diese Beispiele nicht direkt aus der Konsole oder einer beliebigen Webseite ausgefhrt werden knnen, da SharedArrayBuffer nicht definiert ist, es sei denn, seine Sicherheitsanforderungen sind erfllt.
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 }
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);
| Spezifikation |
|---|
| ECMAScript 2027 LanguageSpecification # sec-sharedarraybuffer-objects |
AtomicsArrayBufferCross-Origin-Opener-PolicyCross-Origin-Embedder-PolicyCross-Origin-Resource-PolicyWindow.crossOriginIsolated und WorkerGlobalScope.crossOriginIsolatedSharedArrayBufferObject/FunctionDer Bauplan fr ein besseres Internet.
Teile dieses Inhalts sind 19982026 von einzelnen mozilla.org-Mitwirkenden. Inhalte sind verfgbar unter einer Creative-Commons-Lizenz.
| Web Proxy Viewer | New URL | Original Page |