?uem/p1-90`메모리 일관성 모델, 즉 메모리 모델은 SharedArrayBuffer를 기반으로 하는
메모리 모델은 평가 중 SharedArrayBuffer에 대한
이 절은 SharedArrayBuffer에 대한
공유 메모리 접근(읽기 및 쓰기)은 아래에 정의된 원자적 접근과 데이터 접근이라는 두 그룹으로 나뉩니다. 원자적 접근은 순차적으로 일관됩니다. 즉,
순차적 일관성보다 약하고 순서 없음보다 강한 release-acquire와 같은 순서는 지원되지 않습니다.
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-write 이벤트는 항상 순차적으로 일관됩니다. | |
| [[NoTear]] | Read-modify-write 이벤트는 찢어질 수 없습니다. | |
| [[Block]] | a |
이벤트가 동작하는 블록입니다. |
| [[ByteIndex]] | a non-negative integer | [[Block]]에서 read-modify-write의 바이트 주소입니다. |
| [[ElementSize]] | a non-negative integer | read-modify-write의 크기입니다. |
| [[Payload]] | a |
[[ModifyOp]]에 전달할 |
| [[ModifyOp]] | a read-modify-write modification function | 읽은 |
Shared Data Block 이벤트는
Shared Data Block 이벤트 e의 메모리 범위를 e.[[ByteIndex]](포함)부터 e.[[ByteIndex]] + e.[[ElementSize]](제외)까지
고려해야 하는 postMessage),
이벤트는 아래에 정의된 관계에 따라
Agent Events Record는 다음 필드를 갖는
| 필드 이름 | 값 | 의미 |
|---|---|---|
| [[AgentSignifier]] | an agent signifier | 평가로 인해 이 순서가 발생한 |
| [[EventList]] | a |
이벤트는 평가 중 이 |
| [[AgentSynchronizesWith]] | a |
연산 의미론이 도입한 |
Chosen Value Record는 다음 필드를 갖는
| 필드 이름 | 값 | 의미 |
|---|---|---|
| [[Event]] | a |
이 선택된 값에 대해 도입된 |
| [[ChosenValue]] | a |
평가 중 비결정적으로 선택된 바이트입니다. |
| 필드 이름 | 값 | 의미 |
|---|---|---|
| [[EventsRecords]] | a |
|
| [[ChosenValues]] | a |
read-modify-write 수정 [[ModifyOp]]는
이
다음 관계와 수학적 함수는 특정
이벤트 eventA와 eventB에 대해 다음 조건 중 하나라도 참이면 execution에서 eventA happens-before eventB입니다.
happens-before는 agent-order의 상위 집합이므로
다음 알고리즘이
다음 알고리즘이
다음 알고리즘이
직관적으로 이 요구 사항은
execution에서 readEvent
이 항목은 동일한
is-memory-order-before는
다음이 모두 참이면
모든 프로그램에는 적어도 하나의 유효한 실행이 있습니다.
실행 execution과
실행 execution과
프로그램의 모든 실행에
다음은 공유 메모리를 사용하는 ECMAScript 프로그래머를 위한 지침입니다.
프로그램에
더 일반적으로 프로그램에
다음은 공유 메모리를 사용하는 프로그램에 대해 컴파일러 변환을 작성하는 ECMAScript 구현자를 위한 지침입니다.
다중
단일
공유 메모리가 없을 때 유효한 agent-order slice의 모든 변환은 다음 예외를 제외하고 공유 메모리가 있을 때도 유효합니다.
Atomics는 변경할 수 없습니다: 프로그램 변환은 [[Order]]가
(실제로 순서 변경 금지는 컴파일러가 모든
읽기는 안정적이어야 합니다: 주어진 공유 메모리 읽기는 한 실행에서 하나의 값만 관찰해야 합니다.
(예를 들어 프로그램에서 의미상 하나의 읽기가 여러 번 실행되면 프로그램은 그 뒤 읽힌 값 중 하나만 관찰할 수 있습니다. rematerialization으로 알려진 변환은 이 규칙을 위반할 수 있습니다.)
쓰기는 안정적이어야 합니다: 공유 메모리에 대한 모든 관찰 가능한 쓰기는 실행의 프로그램 의미론에서 비롯되어야 합니다.
(예를 들어 더 작은 데이터를 쓰기 위해 더 큰 위치에 read-modify-write 연산을 사용하거나, 프로그램이 쓸 수 없는 값을 메모리에 쓰거나, 읽은 위치가 읽기 후 다른
가능한 읽기 값은 비어 있지 않아야 합니다: 프로그램 변환으로 인해 공유 메모리 읽기의 가능한 읽기 값이 빈 집합이 되어서는 안 됩니다.
(직관과 달리 이 규칙은 사실상 쓰기에 대한 변환을 제한합니다.
계속 유효한 변환의 예로는 동일한 위치에서 여러 비원자적 읽기를 병합하는 것, 비원자적 읽기의 순서를 바꾸는 것, 추측적 비원자적 읽기를 도입하는 것, 동일한 위치에 대한 여러 비원자적 쓰기를 병합하는 것, 서로 다른 위치에 대한 비원자적 쓰기의 순서를 바꾸는 것, 종료 여부에 영향을 미치더라도 비원자적 읽기를 루프 밖으로 끌어올리는 것이 있습니다. 일반적으로 별칭이 있는
다음은 공유 메모리 접근을 위한 기계어 코드를 생성하는 ECMAScript 구현자를 위한 지침입니다.
LOCK 접두사가 붙은 명령, ARM의 load-exclusive/store-exclusive 명령, Power의 load-link/store-conditional 명령과 같은 대상 아키텍처의 read-modify-write 명령으로 컴파일할 수 있습니다.
구체적으로
단순한 코드 생성은 다음 패턴을 사용합니다:
LOCK 접두사가 붙은 명령을 사용하므로 fence가 필요하지 않습니다. 많은 플랫폼에는 여러 강도의 fence가 있으며 특정 컨텍스트에서는 순차적 일관성을 깨뜨리지 않고 더 약한 fence를 사용할 수 있습니다.