?uem/p1-90`メモリ一貫性モデル、またはメモリモデルは、SharedArrayBuffer を基盤とする
メモリモデルは、評価中に SharedArrayBuffer 上の
この節では、SharedArrayBuffer 上の
共有メモリアクセス(読み取りおよび書き込み)は、以下で定義する atomic アクセスと data アクセスの2つのグループに分けられます。Atomic アクセスは逐次一貫しており、すなわち agent cluster 内のすべての agent が合意するイベントの厳密な全順序があります。非 atomic アクセスには、すべての agent が合意する厳密な全順序はなく、すなわち順序付けされていません。
release-acquire のような、逐次一貫性より弱く unordered より強い順序付けはサポートされません。
Shared Data Block イベントは、ReadSharedMemory、WriteSharedMemory、または ReadModifyWriteSharedMemory
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Order]] | イベントについて |
|
| [[NoTear]] | a Boolean | このイベントと等しい |
| [[Block]] | a |
イベントが操作するブロック。 |
| [[ByteIndex]] | a non-negative integer | [[Block]] 内の読み取りのバイトアドレス。 |
| [[ElementSize]] | a non-negative integer | 読み取りのサイズ。 |
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Order]] | イベントについて |
|
| [[NoTear]] | a Boolean | このイベントと等しい |
| [[Block]] | a |
イベントが操作するブロック。 |
| [[ByteIndex]] | a non-negative integer | [[Block]] 内の書き込みのバイトアドレス。 |
| [[ElementSize]] | a non-negative integer | 書き込みのサイズ。 |
| [[Payload]] | a |
他のイベントによって読み取られる |
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Order]] | read-modify- |
|
| [[NoTear]] | read-modify- |
|
| [[Block]] | a |
イベントが操作するブロック。 |
| [[ByteIndex]] | a non-negative integer | [[Block]] 内の read-modify-write のバイトアドレス。 |
| [[ElementSize]] | a non-negative integer | read-modify-write のサイズ。 |
| [[Payload]] | a |
[[ModifyOp]] に渡される |
| [[ModifyOp]] | a |
読み取った |
Shared Data Block イベントは、
Shared Data Block イベント e のメモリ範囲を、e.[[ByteIndex]](含む)から e.[[ByteIndex]] + e.[[ElementSize]](含まない)までの
考慮されるべきpostMessage)、agent の開始と停止、および共有メモリ以外のチャネルを介した agent cluster 内の通信があります。特定の実行 execution について、これらのイベントは
イベントは、以下で定義される関係によって
Agent Events Record は次のフィールドを持つ
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[AgentSignifier]] | an agent signifier | その評価によってこの順序付けが生じた agent。 |
| [[EventList]] | a |
イベントは評価中にこの |
| [[AgentSynchronizesWith]] | a |
操作的意味論によって導入される |
Chosen Value Record は次のフィールドを持つ
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Event]] | a |
この chosen value のために導入された |
| [[ChosenValue]] | a |
評価中に非決定的に選択されたバイト。 |
agent cluster の評価の候補実行は、次のフィールドを持つ
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[EventsRecords]] | a |
agent を、評価中に追加された |
| [[ChosenValues]] | a |
read-modify-write の変更 [[ModifyOp]] は、
この
次の関係および数学関数は、特定の
各 agent は、評価中に agent ごとの厳密な全順序でイベントを導入します。これは、それらの厳密な全順序の和集合です。
イベント eventA および eventB について、次の条件のいずれかが真である場合、execution において eventA happens-before eventB です。
happens-before は agent-order の上位集合であるため、
直感的には、この要件は、
execution において readEvent
この項は、等しい
is-memory-order-before は
すべてのプログラムは少なくとも1つの有効な実行を持ちます。
実行 execution は、
プログラムは、そのすべての実行にデータ競合がない場合、
以下は、共有メモリを扱う ECMAScript プログラマー向けのガイドラインです。
プログラムを
より一般的には、プログラムに
以下は、共有メモリを使用するプログラム向けにコンパイラー変換を記述する ECMAScript 実装者向けのガイドラインです。
各 agent の性能を単一 agent 環境と同等に良好に保つため、単一 agent 環境で有効なほとんどのプログラム変換を複数 agent 環境でも許可することが望まれます。多くの場合、これらの変換を判断することは困難です。ここでは、規範的なものとして扱われることを意図した(すなわち
agent-order slice を、単一 agent に関係する
共有メモリがない場合に有効な agent-order slice の変換は、次の例外を除き、共有メモリが存在する場合にも有効です。
Atomic は不変である: プログラム変換は、[[Order]] が
(実際には、この並べ替え禁止により、コンパイラーはすべての
Read は安定していなければならない: 任意の共有メモリ read は、1回の実行において単一の値だけを観測しなければなりません。
(たとえば、プログラム内で意味論的には単一の read であるものが複数回実行された場合、その後プログラムが観測できるのは読み取られた値のうち1つだけです。rematerialization と呼ばれる変換はこの規則に違反する可能性があります。)
Write は安定していなければならない: 共有メモリへの観測可能なすべての write は、1回の実行におけるプログラム意味論に由来しなければなりません。
(たとえば、より小さいデータを書き込むためにより大きな位置に対する read-modify-write 操作を使用する、プログラムが書き込めなかった値をメモリへ書き込む、または読み取った直後の値を読み取った位置へ書き戻す、といった特定の観測可能な write を変換によって導入してはなりません。特に、その位置が read 後に別の agent によって上書きされ得る場合です。)
可能な read 値は空であってはならない: プログラム変換は、共有メモリ read の可能な read 値を空にしてはなりません。
(直感に反して、この規則は実質的には write に対する変換を制限します。
引き続き有効な変換の例として、同じ位置からの複数の非 atomic read の統合、非 atomic read の並べ替え、投機的な非 atomic read の導入、同じ位置への複数の非 atomic write の統合、異なる位置への非 atomic write の並べ替え、およびそれが終了性に影響する場合でもループ外へ非 atomic read を hoist することがあります。一般に、alias された
以下は、共有メモリアクセス用の機械語コードを生成する ECMAScript 実装者向けのガイドラインです。
ARM または Power のLOCK プレフィックス付き命令、ARM の load-exclusive/store-exclusive 命令、Power の load-link/store-conditional 命令など、対象アーキテクチャ上の read-modify-write 命令へコンパイルできます。
具体的には、
単純なコード生成では次のパターンを使用します。
この対応付けは、ある
LOCK プレフィックス付き命令を使用するため fence は不要です。多くのプラットフォームには複数の強度の fence があり、逐次一貫性を損なわずに特定の文脈でより弱い fence を使用できます。