SharedArrayBuffer
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since December 2021.
Объект SharedArrayBuffer
подобен ArrayBuffer, то есть это буфер фиксированной длины, использующийся для хранения любых бинарных данных. Главное отличие SharedArrayBuffer
от ArrayBuffer
заключается в том, что он используется для создания разделяемой области памяти. В отличие от ArrayBuffer
SharedArrayBuffer
не может быть откреплён от соответствующей ему области памяти.
Описание
Выделение и совместное использование памяти
Для совместного использования памяти с помощью объекта SharedArrayBuffer
между одним агентом в кластере и другим (агентом может быть как основная программа страницы сайта, так и один из её веб-воркеров) используются postMessage
и алгоритм структурированного клонирования.
Алгоритм структурированного клонирования принимает SharedArrayBuffers
и TypedArrays
, отображённый в SharedArrayBuffers
. В обоих случаях объект SharedArrayBuffer
передаётся получателю, что приводит к появлению нового приватного объекта SharedArrayBuffer внутри агента-получателя (так же как для ArrayBuffer
). Оба объекта SharedArrayBuffer
ссылаются на один и тот же блок общих данных, и побочный эффект, изменяющий блок данных в одном из агентов, в итоге проявится в другом агенте.
var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
Обновление и синхронизация разделяемой памяти с помощью атомарных операций
Разделяемую память можно создавать и изменять одновременно в воркерах или основном потоке. В зависимости от системы (ЦПУ, ОС, браузера), распространение изменений по всем контекстам может занять некоторое время. Для синхронизации необходимы атомарные операции .
API, принимающие объекты SharedArrayBuffer
Требования безопасности
Разделяемая память и таймеры высокого разрешения были отключены в начале 2018 года из-за атаки Spectre. В 2020 году был стандартизирован новый, безопасный подход, чтобы включить разделяемую память обратно.
Основное требование — ваш документ должен находиться в безопасном контексте.
Для документов верхнего уровня нужно установить два заголовка, чтобы изолировать ваш сайт от других источников:
Cross-Origin-Opener-Policy
со значением `same-origin`` (защищает ваш источник от атаки)Cross-Origin-Embedder-Policy
со значениемrequire-corp
илиcredentialless
(защищает жертв от вашего источника)
Чтобы проверить, что изоляция от других источников прошла успешно, протестируйте свойство crossOriginIsolated
, доступное для контекстов окна и воркера:
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);
}
Спецификации
Specification |
---|
ECMAScript Language Specification # sec-sharedarraybuffer-objects |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
Atomics
ArrayBuffer
- JavaScript typed arrays guide
- Web Workers
- Shared Memory – a brief tutorial in the TC39 ecmascript-sharedmem proposal
- A Taste of JavaScript's New Parallel Primitives on hacks.mozilla.org (2016)
- COOP and COEP explained by the Chrome team (2020)
Cross-Origin-Opener-Policy
Cross-Origin-Embedder-Policy
Cross-Origin-Resource-Policy
crossOriginIsolated
- SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92 on developer.chrome.com (2021)