?um/p1-90`メモリ一貫性モデル、またはメモリモデルは、SharedArrayBuffer によって裏付けられた
メモリモデルは、評価中に SharedArrayBuffer 上の抽象操作または Atomics オブジェクト上のメソッドによって導入される
この節は、SharedArrayBuffer 上の抽象操作によって導入される
共有メモリアクセス(読み取りおよび書き込み)は、以下で定義される 2 つのグループ、atomic access と data access に分けられる。atomic access は逐次一貫であり、すなわちエージェントクラスタ内のすべてのエージェントが合意するイベントの厳密な全順序が存在する。非 atomic access には、すべてのエージェントが合意する厳密な全順序は存在しない、すなわち unordered である。
release-acquire のような、逐次一貫より弱く unordered より強い順序付けはサポートされない。
Shared Data Block イベントは、ReadSharedMemory、WriteSharedMemory、または ReadModifyWriteSharedMemory
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Order]] | そのイベントについて |
|
| [[NoTear]] | Boolean | このイベントが、このイベントと等しい |
| [[Block]] | そのイベントが操作するブロック。 | |
| [[ByteIndex]] | 非負整数 | [[Block]] 内の読み取りのバイトアドレス。 |
| [[ElementSize]] | 非負整数 | 読み取りのサイズ。 |
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Order]] | そのイベントについて |
|
| [[NoTear]] | Boolean | このイベントが、このイベントと等しい |
| [[Block]] | そのイベントが操作するブロック。 | |
| [[ByteIndex]] | 非負整数 | [[Block]] 内の書き込みのバイトアドレス。 |
| [[ElementSize]] | 非負整数 | 書き込みのサイズ。 |
| [[Payload]] | バイト値の |
他のイベントによって読み取られるバイト値の |
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Order]] | read-modify-write イベントは常に逐次一貫である。 | |
| [[NoTear]] | read-modify-write イベントは tear しない。 | |
| [[Block]] | そのイベントが操作するブロック。 | |
| [[ByteIndex]] | 非負整数 | [[Block]] 内の read-modify-write のバイトアドレス。 |
| [[ElementSize]] | 非負整数 | read-modify-write のサイズ。 |
| [[Payload]] | バイト値の |
[[ModifyOp]] に渡されるバイト値の |
| [[ModifyOp]] | read-modify-write 変更関数 | 読み取られたバイト値の |
Shared Data Block イベントは、抽象操作または Atomics オブジェクト上のメソッドによって
Shared Data Block イベント e のメモリ範囲を、e.[[ByteIndex]](含む)から e.[[ByteIndex]] + e.[[ElementSize]](含まない)までの区間内のすべての整数の Set とする。2 つのイベントのメモリ範囲は、それらのイベントが同じ [[Block]]、[[ByteIndex]]、および [[ElementSize]] を持つとき等しい。2 つのイベントのメモリ範囲は、それらのイベントが同じ [[Block]] を持ち、範囲が等しくなく、かつそれらの共通部分が空でないとき重なっている。2 つのイベントのメモリ範囲は、それらのイベントが同じ [[Block]] を持たないか、またはそれらの範囲が等しくも重なってもいないとき、互いに素である。
考慮されるべき postMessage による)、エージェントの開始と停止、および共有メモリ以外のチャネルを介したエージェントクラスタ内での通信がある。特定の execution execution について、それらのイベントは
イベントは、以下で定義される関係によって
Agent Events Record は、次のフィールドを持つ
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[AgentSignifier]] | この順序付けを生じさせた評価を行ったエージェント。 | |
| [[EventList]] | イベントは評価中にこのリストへ追加される。 | |
| [[AgentSynchronizesWith]] | 操作的意味論によって導入される |
Chosen Value Record は、次のフィールドを持つ
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[Event]] | この chosen value のために導入された |
|
| [[ChosenValue]] | バイト値の |
評価中に非決定的に選ばれたバイト。 |
エージェントクラスタの評価のcandidate execution は、次のフィールドを持つ
| フィールド名 | 値 | 意味 |
|---|---|---|
| [[EventsRecords]] | エージェントを、評価中に追加された |
|
| [[ChosenValues]] |
空の candidate execution は、そのフィールドが空の
The
The
The
The
read-modify-write 変更 [[ModifyOp]] は、
この抽象操作は、
The
次の関係および数学的関数は、特定の
各エージェントは、評価中にエージェントごとの厳密な全順序でイベントを導入する。これはそれらの厳密な全順序の和集合である。
この postMessage などの追加の同期機構を提供できる。
イベント eventA および eventB について、次の条件のいずれかが真である場合、execution において eventA は eventB より happens-before である。
happens-before は
直感的には、この要件は、
execution において readEvent が writeEvent から
この節はさらに、等しい
is-memory-order-before は
すべてのプログラムは少なくとも 1 つの valid execution を持つ。
execution execution および
execution execution および
execution execution は、
プログラムは、そのすべての execution が data race free である場合、data race free である。
以下は、共有メモリを扱う ECMAScript プログラマーのための指針である。
プログラムを
より一般に、プログラムが
以下は、共有メモリを使用するプログラムに対するコンパイラ変換を書く ECMAScript 実装者のための指針である。
単一エージェント設定で有効なほとんどのプログラム変換を、マルチエージェント設定でも許可することが望ましい。これは、マルチエージェントプログラム内の各エージェントの性能が単一エージェント設定と同程度に良好であることを保証するためである。しばしば、これらの変換は判断が難しい。ここでは、(
agent-order slice を、単一のエージェントに関係する
共有メモリが存在しない場合に有効な agent-order slice の任意の変換は、次の例外を除き、共有メモリが存在する場合にも有効である。
Atomics are carved in stone:プログラム変換は、[[Order]] が
(実際には、並べ替えの禁止により、コンパイラはすべての
Reads must be stable:任意の与えられた共有メモリ読み取りは、1 回の execution において単一の値のみを観測しなければならない。
(例えば、プログラム内で意味論的に単一の読み取りであるものが複数回実行された場合、その後プログラムは読み取られた値のうち 1 つだけを観測することが許される。rematerialization と呼ばれる変換はこの規則に違反し得る。)
Writes must be stable:共有メモリへのすべての観測可能な書き込みは、execution におけるプログラム意味論から従わなければならない。
(例えば、変換は、より小さいデータを書き込むためにより大きなロケーション上の read-modify-write 操作を使用すること、プログラムが書き込めなかった値をメモリに書き込むこと、または読み取られたロケーションが読み取り後に別のエージェントによって上書きされ得た場合に、読み取ったばかりの値をそのロケーションへ書き戻すことなど、特定の観測可能な書き込みを導入してはならない。)
Possible read values must be non-empty:プログラム変換は、共有メモリ読み取りの possible read values を空にしてはならない。
(直感に反するが、この規則は、
有効なままである変換の例には、同じロケーションからの複数の非 atomic read のマージ、非 atomic read の並べ替え、投機的な非 atomic read の導入、同じロケーションへの複数の非 atomic write のマージ、異なるロケーションへの非 atomic write の並べ替え、および終了性に影響しても非 atomic read をループ外へ巻き上げることがある。一般に、エイリアスされた
以下は、共有メモリアクセスのための機械語コードを生成する ECMAScript 実装者のための指針である。
ARM または Power のLOCK プレフィックス付き命令、ARM 上の load-exclusive/store-exclusive 命令、および Power 上の load-link/store-conditional 命令にコンパイルされてよい。
具体的には、
単純なコード生成では、次のパターンを使用する。
この写像は、ある
これらの基本パターンへの局所的な改善も、
LOCK プレフィックス付き命令を使用するためである。多くのプラットフォームには複数の強度の fence があり、特定の文脈では逐次一貫性を壊すことなくより弱い fence を使用できる。