From 6b6d1022a4bbd2c8ce809e85e12dbcb6cc9ee2c2 Mon Sep 17 00:00:00 2001 From: Yana Klose-Ivanova <75987641+captainspring@users.noreply.github.com> Date: Tue, 6 Apr 2021 01:25:36 +0300 Subject: Update SharedArrayBuffer ru-translation (#375) * Update translation Related to #329 * Fix translation after review --- .../global_objects/sharedarraybuffer/index.html | 227 ++++++++------------- 1 file changed, 83 insertions(+), 144 deletions(-) (limited to 'files/ru/web/javascript/reference/global_objects') diff --git a/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html b/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html index f35e32c051..77c19a0897 100644 --- a/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html +++ b/files/ru/web/javascript/reference/global_objects/sharedarraybuffer/index.html @@ -2,54 +2,71 @@ title: SharedArrayBuffer slug: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer translation_of: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer +tags: + - Класс + - JavaScript + - Разделяемая память + - SharedArrayBuffer + - TypedArrays ---
Объект SharedArrayBuffer
используется для создания разделённого буфера фиксированной длины для хранения примитивных бинарных данных, подобно объекту {{jsxref("ArrayBuffer")}}, но могут быть использованы для создания обзора на разделённую память. В отличие от ArrayBuffer
, SharedArrayBuffer
не может быть отсоединён.
new SharedArrayBuffer(length) -- -
length
Новый объект SharedArrayBuffer
указанной длины. Его содержимое после инициализации равно 0.
Объект SharedArrayBuffer
подобен ArrayBuffer, то есть это буфер фиксированной длины, использующийся для хранения любых бинарных данных. Главное отличие SharedArrayBuffer
от ArrayBuffer
заключается в том, что он используется для создания разделяемой области памяти. В отличие от ArrayBuffer
SharedArrayBuffer
не может быть откреплён от соответствующей ему области памяти.
Для разделения памяти с помощью объекта {{jsxref("SharedArrayBuffer")}} между одним агентом в кластере и другим (агент может быть как основной программой web-страницы, так и одним из web-workers), используются postMessage
и structured cloning.
Для совместного использования памяти с помощью объекта {{jsxref("SharedArrayBuffer")}} между одним агентом в кластере и другим (агентом может быть как основная программа страницы сайта, так и один из её веб-воркеров) используются postMessage
и алгоритм структурированного клонирования.
Алгоритм структурированного клонирования принимает SharedArrayBuffers
и TypedArrays,
отображённый в SharedArrayBuffers
. В обоих случаях, объект SharedArrayBuffer
передаётся получателю, результируя в новый, приватный объект SharedArrayBuffer внутри агента-получателя (так же как для {{jsxref("ArrayBuffer")}}). Однако, блок общих данных, на который ссылаются оба объекта SharedArrayBuffer,
это один и тот же блок данных, и сторонние эффекты в блоке в одном из агентов в итоге станут заметны в другом агенте.
Алгоритм структурированного клонирования принимает SharedArrayBuffers
и TypedArrays
, отображённый в SharedArrayBuffers
. В обоих случаях объект SharedArrayBuffer
передаётся получателю, что приводит к появлению нового приватного объекта SharedArrayBuffer внутри агента-получателя (так же как для {{jsxref("ArrayBuffer")}}). Оба объекта SharedArrayBuffer
ссылаются на один и тот же блок общих данных, и побочный эффект, изменяющий блок данных в одном из агентов, в итоге проявится в другом агенте.
var sab = new SharedArrayBuffer(1024); worker.postMessage(sab);-
Разделённая память может быть создана и изменена одновременно в workers или основном потоке. В зависимости от системы (ЦПУ, ОС, браузер) может уйти время пока изменения будут распространены по всем контекстам. Для синхронизации необходимы {{jsxref("Атомарные", "атомарные", "", 1)}} операции .
+Разделяемую память можно создавать и изменять одновременно в воркерах или основном потоке. В зависимости от системы (ЦПУ, ОС, браузера), распространение изменений по всем контекстам может занять некоторое время. Для синхронизации необходимы {{jsxref("Атомарные", "атомарные", "", 1)}} операции .
SharedArrayBuffer
WebGLRenderingContext.bufferData()
WebGLRenderingContext.bufferSubData()
WebGL2RenderingContext.getBufferSubData()
new
Разделяемая память и таймеры высокого разрешения были отключены в начале 2018 года из-за атаки Spectre. В 2020 году был стандартизирован новый, безопасный подход, чтобы включить разделяемую память обратно. При следовании следующим мерам безопасности postMessage() не будет выкидывать исключение для
SharedArrayBuffer
, и разделяемая память будет доступна в разных потоках.
Конструкторы SharedArrayBuffer
необходимо вызывать с помощью оператора {{jsxref("Operators/new", "new")}}. Вызов конструктора SharedArrayBuffer
как функции без указания new
, вызовет ошибку {{jsxref("TypeError")}}.
Основное требование — ваш документ должен находиться в безопасном контексте
+ +Для документов верхнего уровня нужно устновить два заголовка, чтобы изолировать ваш сайт от других источников (cross-origin):
+ +Cross-Origin-Opener-Policy
со значением same-origin
(защищает ваш источник от атаки)Cross-Origin-Embedder-Policy
со значением require-corp
(защищает жертв от вашего источника)Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp ++ +
Чтобы проверить, что изоляция от других источников прошла успешно, протестируйте свойство crossOriginIsolated
, доступное для контекстов окна и воркера:
if (crossOriginIsolated) { + // Начни работу с SharedArrayBuffer +} else { + // Сделай что-то другое +}+ +
Ознакомьтесь с планируемыми изменениями разделяемой памяти, которые начинают внедряться в браузерах (например, в Firefox 79).
+ +Конструкторы SharedArrayBuffer
необходимо вызывать с помощью оператора {{jsxref("Operators/new", "new")}}. Вызов конструктора SharedArrayBuffer
как функции без указания new
вызовет ошибку {{jsxref("TypeError")}}.
var sab = SharedArrayBuffer(1024); // TypeError: вызов встроенного конструктора SharedArrayBuffer @@ -57,153 +74,75 @@ worker.postMessage(sab);var sab = new SharedArrayBuffer(1024);-Свойства
+Конструктор
SharedArrayBuffer.length
SharedArrayBuffer,
чьё значение равно 1.SharedArrayBuffer
.SharedArrayBuffer()
SharedArrayBuffer
.SharedArrayBuffer
объект prototypeВсе экземпляры SharedArrayBuffer
наследуются от {{jsxref("SharedArrayBuffer.prototype")}}.
{{page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Properties')}}
+SharedArrayBuffer
, чьё содержимое — копия байтов изначального SharedArrayBuffer
с begin
(начала) включительно до end
(конца), но не включая его. Если параметры begin
или end
отрицательны, метод обращается к индексу массива, начиная с конца, а не с начала.{{page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Methods')}}
+var sab = new SharedArrayBuffer(1024);-
Specification | -Status | -Comment | -
---|---|---|
{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}} | -{{Spec2('ESDraft')}} | -Initial definition in ES2017. | -
{{SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}} | -{{Spec2('ES8')}} | -- |
sab.slice(); // SharedArrayBuffer { byteLength: 1024 } +sab.slice(2); // SharedArrayBuffer { byteLength: 1022 } +sab.slice(-2); // SharedArrayBuffer { byteLength: 2 } +sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }-
{{CompatibilityTable}}
+Feature | -Chrome | -Edge | -Firefox (Gecko) | -Internet Explorer | -Opera | -Safari | -
---|---|---|---|---|---|---|
Basic support | -{{CompatNo}} [2] | -{{CompatNo}} | -{{CompatGeckoDesktop("55")}} [1] | -{{CompatNo}} | -{{CompatNo}} | -{{CompatSafari("10.1")}} | -
slice() |
- {{CompatNo}} | -{{CompatNo}} | -{{CompatGeckoDesktop("52")}} [1] | -{{CompatNo}} | -{{CompatNo}} | -{{CompatSafari("10.1")}} | -
SAB in DataView | -{{CompatNo}} | -{{CompatNo}} | -{{CompatGeckoDesktop("53")}} [1] | -{{CompatNo}} | -{{CompatNo}} | -{{CompatSafari("10.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);+ +
Feature | -Android | -Chrome for Android | -Firefox Mobile (Gecko) | -IE Mobile | -Opera Mobile | -Safari Mobile | -|
---|---|---|---|---|---|---|---|
Basic support | -{{CompatNo}} | -{{CompatNo}} | -{{CompatGeckoMobile("55")}} [1] | -{{CompatNo}} | -{{CompatNo}} | -{{CompatSafari("10.1")}} | +Спецификация |
slice() |
- {{CompatNo}} | -{{CompatNo}} | -{{CompatGeckoMobile("52")}} [1] | -{{CompatNo}} | -{{CompatNo}} | -{{CompatSafari("10.1")}} | -|
SAB in DataView | -{{CompatNo}} | -{{CompatNo}} | -{{CompatGeckoMobile("53")}} [1] | -{{CompatNo}} | -{{CompatNo}} | -{{CompatSafari("10.1")}} | +{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}} |
[1] Enabled by default in Firefox 55. In Firefox version 46 until version 54, this feature is disabled by a preference setting (in about:config, set javascript.options.shared_memory
to true
).
[2] The implementation is under development and needs these runtime flags: --js-flags=--harmony-sharedarraybuffer --enable-blink-feature=SharedArrayBuffer
{{Compat("javascript.builtins.SharedArrayBuffer")}}
A Taste of JavaScript’s New Parallel Primitives – Mozilla Hacks
+Немного о новых примитивах JavaScript для параллелизации работ – Mozilla Hacks