From b1743d34a5c9a3c41884648885b0c2b73306dab9 Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Sun, 18 Jul 2021 16:48:50 +0900 Subject: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer を更新 (#1473) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 2021/05/05 時点の英語版に同期 - #329 の修正 --- .../global_objects/sharedarraybuffer/index.html | 145 +++++++++++---------- 1 file changed, 75 insertions(+), 70 deletions(-) (limited to 'files/ja/web') diff --git a/files/ja/web/javascript/reference/global_objects/sharedarraybuffer/index.html b/files/ja/web/javascript/reference/global_objects/sharedarraybuffer/index.html index 2603ebfbd1..d1b478f388 100644 --- a/files/ja/web/javascript/reference/global_objects/sharedarraybuffer/index.html +++ b/files/ja/web/javascript/reference/global_objects/sharedarraybuffer/index.html @@ -2,68 +2,72 @@ title: SharedArrayBuffer slug: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer tags: - - Constructor + - Class - JavaScript - Shared Memory - SharedArrayBuffer - - TypesdArrays + - TypedArrays +browser-compat: javascript.builtins.SharedArrayBuffer translation_of: Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer ---
{{JSRef}}
-

SharedArrayBuffer オブジェクトは、ジェネリックで固定長の生バイナリデータバッファーを表すために使用されます。{{jsxref("ArrayBuffer")}} オブジェクトと似ていますが、これらは共有メモリー上にビューを生成するために使用されます。ArrayBuffer と異なり、SharedArrayBuffer は分離できません。

+

SharedArrayBuffer オブジェクトは、固定長の生バイナリデータバッファーのジェネリックを表すために使用されます。{{jsxref("ArrayBuffer")}} オブジェクトと似ていますが、こちらは共有メモリー上にビューを生成するために使用されます。 ArrayBuffer と異なり、SharedArrayBuffer は分離できません。

-
-

SharedArrayBuffer はすべての主要なブラウザーで 2018 年 1 月 5 日に、Spectre への対応として無効化されましたので注意してください。Chrome では、Spectre 型脆弱性から保護するためのサイト分離機能が有効にされたプラットフォームにおいて、v67 に再度有効化されています

-
+

解説

-
{{EmbedInteractiveExample("pages/js/sharedarraybuffer-constructor.html")}}
+

メモリーの割り当てと共有

+

クラスター内のあるエージェントから別のエージェント (エージェントとは、ウェブページのメインプログラムまたはそのウェブワーカーのひとつ) へ、{{jsxref("SharedArrayBuffer")}} オブジェクトを使用してメモリーを共有するために、postMessage構造化クローンを使用します。

+

構造化クローンアルゴリズムは SharedArrayBuffers と、SharedArrayBuffers にマッピングされた TypedArrays を受け入れます。どちらの場合も SharedArrayBuffer オブジェクトは受信者に転送されて、受信側のエージェントで新たなプライベートの SharedArrayBuffer オブジェクトになります ({{jsxref("ArrayBuffer")}} と同じように)。しかし、2 つの SharedArrayBuffer オブジェクトから参照される共有データブロックは同一のデータブロックであり、あるエージェントによるブロックへの副作用は、結果的に他方のエージェントからも見えます。

-

構文

- -
new SharedArrayBuffer(length)
+
var sab = new SharedArrayBuffer(1024);
+worker.postMessage(sab);
 
-

パラメーター

+

Atomic 操作による共有メモリーを更新や同期

-
-
length
-
array buffer を生成するバイト単位のサイズ。
-
+

共有メモリーは、ワーカー内でもメインスレッド内でも同時に生成や更新ができます。システム (CPU、 OS、ブラウザー) によっては、変更がすべてのコンテキストに通知されるまでに少々時間がかかります。同期するためには、{{jsxref("Atomics", "atomic", "", 1)}} 操作が必要です。

-

戻り値

+

SharedArrayBuffer オブジェクトを使用する API

-

指定したサイズの新しい SharedArrayBuffer。コンテンツは 0 に初期化されている。

+ -

説明

+

セキュリティの要件

-

メモリーの割り当てと共有

+

共有メモリーと高解像度タイマーは、 Spectre の対策として 2018 年の初めに事実上無効化されました。 2020 年には、共有メモリを再び有効にするために、新しい安全なアプローチが標準化されました。いくつかのセキュリティ対策を施すことで、 postMessage()SharedArrayBuffer オブジェクトに対して例外を発生しなくなり、スレッド間の共有メモリが利用できるようになります。

-

クラスター内のあるエージェントから別のエージェント (エージェントとは、ウェブページのメインプログラムまたはその web worker のひとつ) へ、{{jsxref("SharedArrayBuffer")}} オブジェクトを使用してメモリーを共有するために、postMessagestructured cloning を使用します。

+

基本的な要件として、文書が安全なコンテキストにある必要があります。

-

structured clone アルゴリズムは SharedArrayBuffers と、SharedArrayBuffers にマッピングされた TypedArrays を受け入れます。どちらの場合も SharedArrayBuffer オブジェクトは受信者に転送されて、受信側のエージェントで新たなプライベートの SharedArrayBuffer オブジェクトになります ({{jsxref("ArrayBuffer")}} と同じように)。しかし、2 つの SharedArrayBuffer オブジェクトから参照される共有データブロックは同一のデータブロックであり、あるエージェントによるブロックへの副作用は、結果的に他方のエージェントからも見えます。

+

最上位の文書では、サイトにオリジン間の分離性を持たせるため、次の2つのヘッダーを設定する必要があります。

-
var sab = new SharedArrayBuffer(1024);
-worker.postMessage(sab);
-
+ -

Atomic 操作で共有メモリを更新、同期する

+
Cross-Origin-Opener-Policy: same-origin
+Cross-Origin-Embedder-Policy: require-corp
+
-

共有メモリーは、worker 内でもメインスレッド内でも同時に生成や更新ができます。システム(CPU や OS、ブラウザー)によっては、変更がすべてのコンテキストに通知されるまでに少々時間がかかります。同期するためには、{{jsxref("Atomics", "atomic", "", 1)}} 操作が必要です。

+

オリジン間の分離が成功したかどうかは、ウィンドウとワーカーのコンテキストで利用できる crossOriginIsolated プロパティを使って確認することができます。

-

SharedArrayBuffer オブジェクトを受け付ける API

+
if (crossOriginIsolated) {
+  // Post SharedArrayBuffer
+} else {
+  // Do something else
+}
- +

また、ブラウザー (Firefox 79など) で展開され始めている共有メモリーの計画的な変更も参照してください。

-

SharedArrayBuffer の生成には new 演算子が必要

+

SharedArrayBuffer の生成には new 演算子が必要

-

SharedArrayBuffer コンストラクターは、{{jsxref("Operators/new", "new")}} 演算子で呼び出される必要があります。new 演算子なしで関数として SharedArrayBuffer コンストラクターを呼び出すと、{{jsxref("TypeError")}} をスローします。

+

SharedArrayBuffer コンストラクターは、{{jsxref("Operators/new", "new")}} 演算子で呼び出す必要があります。new 演算子なしで関数として SharedArrayBuffer コンストラクターを呼び出すと、{{jsxref("TypeError")}} が発生します。

var sab = SharedArrayBuffer(1024);
 // TypeError: calling a builtin SharedArrayBuffer constructor
@@ -71,62 +75,63 @@ worker.postMessage(sab);
 
 
var sab = new SharedArrayBuffer(1024);
-

プロパティ

+

コンストラクター

-
SharedArrayBuffer.length
-
SharedArrayBuffer コンストラクターの length プロパティの値は 1。
-
{{jsxref("SharedArrayBuffer.prototype")}}
-
すべての SharedArrayBuffer オブジェクトにプロパティ追加を許可する。
+
SharedArrayBuffer()
+
新しい SharedArrayBuffer オブジェクトを生成します。
-

SharedArrayBuffer プロトタイプオブジェクト

+

インスタンスプロパティ

+ +
+
{{jsxref("SharedArrayBuffer.prototype.byteLength")}}
+
配列の大きさをバイト数で表します。これは配列が構築されたときに確立され、変更することはできません。読み取り専用です。
+
+ +

インスタンスメソッド

+ +
+
{{jsxref("SharedArrayBuffer.slice", "SharedArrayBuffer.prototype.slice(begin, end)")}}
+
新しい SharedArrayBuffer を作成し、その中身をこの SharedArrayBufferbegin の位置から end の位置の一つ手前までのバイトをコピーして返します。 begin または end が負の数の場合は、配列の先頭からではなく末尾からの位置で参照します。
+
-

すべての SharedArrayBuffer インスタンスは {{jsxref("SharedArrayBuffer.prototype")}} を継承しています。

+

-

プロパティ

+

新しい SharedArrayBuffer の生成

-

{{page('ja/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','プロパティ')}}

+
var sab = new SharedArrayBuffer(1024);
-

メソッド

+

SharedArrayBuffer の分割

-

{{page('ja/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/prototype','メソッド')}}

+
sab.slice();    // SharedArrayBuffer { byteLength: 1024 }
+sab.slice(2);   // SharedArrayBuffer { byteLength: 1022 }
+sab.slice(-2);  // SharedArrayBuffer { byteLength: 2 }
+sab.slice(0, 1); // SharedArrayBuffer { byteLength: 1 }
-

仕様

+

WebGL バッファー内での使用

- - - - - - - - - - - - - - - - - - -
仕様状態コメント
{{SpecName('ESDraft', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}{{Spec2('ESDraft')}}ES2017 で初期定義。
{{SpecName('ES8', '#sec-sharedarraybuffer-objects', 'SharedArrayBuffer')}}{{Spec2('ES8')}}
+
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);
-

ブラウザー実装状況

+

仕様書

+{{Specifications}} +

ブラウザーの互換性

-

{{Compat("javascript.builtins.SharedArrayBuffer")}}

+

{{Compat}}

-

関連項目

+

関連情報