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 ---
{{JSRef}}
-

Объект SharedArrayBuffer используется для создания разделённого буфера фиксированной длины для хранения примитивных бинарных данных, подобно объекту {{jsxref("ArrayBuffer")}}, но могут быть использованы для создания обзора на разделённую память. В отличие от ArrayBufferSharedArrayBuffer не может быть отсоединён.

- -

Синтаксис

- -
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)}} операции .

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

-

Конструкции требуют оператор 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
+
+ +

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

+ +
if (crossOriginIsolated) {
+  // Начни работу с SharedArrayBuffer
+} else {
+  // Сделай что-то другое
+}
+ +

Ознакомьтесь с планируемыми изменениями разделяемой памяти, которые начинают внедряться в браузерах (например, в Firefox 79).

+ +

Всегда используйте оператор new для создания SharedArrayBuffer

+ +

Конструкторы 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.
-
{{jsxref("SharedArrayBuffer.prototype")}}
-
Позволяет дополнительные свойства для всех объектов SharedArrayBuffer.
+
SharedArrayBuffer()
+
Создаёт новый объект SharedArrayBuffer.
-

SharedArrayBuffer объект prototype

+

Свойства

-

Все экземпляры SharedArrayBuffer наследуются от {{jsxref("SharedArrayBuffer.prototype")}}.

+
+
{{jsxref("SharedArrayBuffer.prototype.byteLength")}}
+
Размер буферного массива в байтах. Задаётся при создании массива и не может быть изменён. Только для чтения.
+
-

Свойства

+

Методы

-

{{page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Properties')}}

+
+
{{jsxref("SharedArrayBuffer.slice", "SharedArrayBuffer.prototype.slice(begin, end)")}}
+
Возвращает новый SharedArrayBuffer, чьё содержимое — копия байтов изначального SharedArrayBuffer с begin (начала) включительно до end (конца), но не включая его. Если параметры begin или end отрицательны, метод обращается к индексу массива, начиная с конца, а не с начала.
+
-

Методы

+

Примеры

-

{{page('en-US/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','Methods')}}

+

Создание нового SharedArrayBuffer

-

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

+
var sab = new SharedArrayBuffer(1024);
- - - - - - - - - - - - - - - - - - -
SpecificationStatusComment
{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}{{Spec2('ESDraft')}}Initial definition in ES2017.
{{SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}{{Spec2('ES8')}} 
+

Нарезание SharedArrayBuffer

-

Поддержка браузерами

+
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}}

+

Использование в буфере WebGL

-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
FeatureChromeEdgeFirefox (Gecko)Internet ExplorerOperaSafari
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);
+ +

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

-
- +
- - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - +
FeatureAndroidChrome for AndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari 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")}}

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

-- cgit v1.2.3-54-g00ecf