SharedArrayBuffer
=================

Объект **`SharedArrayBuffer`** подобен ArrayBuffer, то есть это буфер фиксированной длины, использующийся для хранения любых бинарных данных. Главное отличие `SharedArrayBuffer` от `ArrayBuffer` заключается в том, что он используется для создания разделяемой области памяти. В отличие от `ArrayBuffer` `SharedArrayBuffer` не может быть откреплён от соответствующей ему области памяти.

Описание
--------

### Выделение и совместное использование памяти

Для совместного использования памяти с помощью объекта `SharedArrayBuffer` между одним агентом в кластере и другим (агентом может быть как основная программа страницы сайта, так и один из её веб-воркеров) используются `postMessage` и алгоритм структурированного клонирования.

Алгоритм структурированного клонирования принимает `SharedArrayBuffers` и `TypedArrays`, отображённый в `SharedArrayBuffers`. В обоих случаях объект `SharedArrayBuffer` передаётся получателю, что приводит к появлению нового приватного объекта SharedArrayBuffer внутри агента-получателя (так же как для `ArrayBuffer`). Оба объекта `SharedArrayBuffer` ссылаются на один и тот же блок общих данных, и побочный эффект, изменяющий блок данных в одном из агентов, в итоге проявится в другом агенте.


```js
var sab = new SharedArrayBuffer(1024);
worker.postMessage(sab);
```

### Обновление и синхронизация разделяемой памяти с помощью атомарных операций

Разделяемую память можно создавать и изменять одновременно в воркерах или основном потоке. В зависимости от системы (ЦПУ, ОС, браузера), распространение изменений по всем контекстам может занять некоторое время. Для синхронизации необходимы атомарные операции .

### API, принимающие объекты `SharedArrayBuffer`

* `WebGLRenderingContext.bufferData()` (en-US)
* `WebGLRenderingContext.bufferSubData()` (en-US)
* `WebGL2RenderingContext.getBufferSubData()` (en-US)
### Требования безопасности

Разделяемая память и таймеры высокого разрешения были отключены в начале 2018 года из-за атаки Spectre. В 2020 году был стандартизирован новый, безопасный подход, чтобы включить разделяемую память обратно.

Основное требование — ваш документ должен находиться в безопасном контексте (en-US).

Для документов верхнего уровня нужно установить два заголовка, чтобы изолировать ваш сайт от других источников:

* `Cross-Origin-Opener-Policy` (en-US) со значением `same-origin`` (защищает ваш источник от атаки)
* `Cross-Origin-Embedder-Policy` (en-US) со значением `require-corp` или `credentialless` (защищает жертв от вашего источника)

Чтобы проверить, что изоляция от других источников прошла успешно, протестируйте свойство `crossOriginIsolated` (en-US), доступное для контекстов окна и воркера:


```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);
}
```

Спецификации
------------

| Specification |
| --- |
| ECMAScript Language Specification # sec-sharedarraybuffer-objects |

Совместимость с браузерами
--------------------------

BCD tables only load in the browser with JavaScript enabled. Enable JavaScript to view data.

Смотрите также
--------------

* `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` (en-US)
* `Cross-Origin-Embedder-Policy` (en-US)
* `Cross-Origin-Resource-Policy` (en-US)
* `crossOriginIsolated` (en-US)
* SharedArrayBuffer updates in Android Chrome 88 and Desktop Chrome 92 on developer.chrome.com (2021)