?
u
m
/
p
1-9
0
`
메모리 일관성 모델 또는 memory model 은 SharedArrayBuffer 로 백업된
메모리 모델은 SharedArrayBuffer 의 추상 연산 또는 평가 중 Atomics 객체 메서드에 의해 도입된 이벤트에 대한 관계 제약으로 정의된다.
이 절은 SharedArrayBuffer 추상 연산이 도입하는 이벤트에 대한 공리적(axiomatic) 모델을 제공한다. 모델은 명세의 나머지와 달리 알고리즘적으로 표현될 수 없음을 강조해야 한다. 추상 연산에 의한 비결정적 이벤트 도입은 ECMAScript 평가의 실행 의미와 메모리 모델의 공리적 의미 사이의 인터페이스이다. 이러한 이벤트의 의미는 평가 내 모든 이벤트의 그래프를 고려하여 정의된다. 이것들은 정적 의미(Static Semantics)나 런타임 의미(Runtime Semantics)가 아니다. 입증된 알고리즘 구현이 아니라 특정 이벤트 그래프가 허용되는지 금지되는지를 결정하는 제약 집합이다.
공유 메모리 접근(읽기/쓰기)은 아래에서 정의되는 두 그룹, atomic 접근과 data 접근으로 나뉜다. Atomic 접근은 순차적 일관성을 가지며, 즉 에이전트 클러스터의 모든 에이전트가 동의하는 엄격한 전체 순서가 있다. 비-atomic 접근은 모든 에이전트가 동의하는 엄격한 전체 순서가 없으므로 정렬되지(unordered) 않는다.
순차적 일관성과 unordered 보다 약하거나 강한(예: release-acquire) 순서는 지원되지 않는다.
Shared Data Block event 는 ReadSharedMemory, WriteSharedMemory 또는 ReadModifyWriteSharedMemory
Field Name | Value | Meaning |
---|---|---|
[[Order]] | 이벤트에 대해 메모리 모델이 보장하는 가장 약한 순서. | |
[[NoTear]] | Boolean | 이 이벤트가 동일 범위를 가진 여러 write 이벤트로부터 읽을 수 있는지 여부. |
[[Block]] | 이벤트가 동작하는 블록. | |
[[ByteIndex]] | 음이 아닌 정수 | [[Block]] 내 읽기의 바이트 주소. |
[[ElementSize]] | 음이 아닌 정수 | 읽기의 크기. |
Field Name | Value | Meaning |
---|---|---|
[[Order]] | 이벤트에 대해 메모리 모델이 보장하는 가장 약한 순서. | |
[[NoTear]] | Boolean | 이 이벤트가 동일 범위를 가진 여러 read 이벤트로부터 읽힐 수 있는지 여부. |
[[Block]] | 이벤트가 동작하는 블록. | |
[[ByteIndex]] | 음이 아닌 정수 | [[Block]] 내 쓰기의 바이트 주소. |
[[ElementSize]] | 음이 아닌 정수 | 쓰기의 크기. |
[[Payload]] | 바이트 값 |
다른 이벤트가 읽을 바이트 값 |
Field Name | Value | Meaning |
---|---|---|
[[Order]] | Read-modify-write 이벤트는 항상 순차적 일관성. | |
[[NoTear]] | Read-modify-write 이벤트는 tear 될 수 없다. | |
[[Block]] | 이벤트가 동작하는 블록. | |
[[ByteIndex]] | 음이 아닌 정수 | [[Block]] 내 read-modify-write 의 바이트 주소. |
[[ElementSize]] | 음이 아닌 정수 | read-modify-write 의 크기. |
[[Payload]] | 바이트 값 |
[[ModifyOp]] 에 전달될 바이트 값 |
[[ModifyOp]] | 읽은 바이트 |
이러한 이벤트는 추상 연산 또는 Atomics 객체 메서드에 의해 도입된다.
일부 연산은 Synchronize 이벤트도 도입할 수 있다. Synchronize event 는 필드가 없으며, 다른 이벤트의 허용 순서를 직접 제한하기 위해 존재한다.
ReadSharedMemory, WriteSharedMemory, ReadModifyWriteSharedMemory 이벤트의 범위(range)는 [[ByteIndex]] 부터 [[ByteIndex]] + [[ElementSize]] - 1 까지의 연속 정수 집합이다. 두 이벤트의 [[Block]] 이 같고 범위가 원소별 동일하면 범위가 같다. [[Block]] 이 같고 범위가 동일하지 않으며 교집합이 비어 있지 않으면 범위가 겹친다(overlapping). [[Block]] 이 다르거나 범위가 같지도 겹치지도 않으면 범위는 분리(disjoint)되었다.
계정해야 할 postMessage
), 에이전트 시작/종료, 공유 메모리 외 채널을 통한 에이전트 클러스터 내 통신. 특정 실행 execution 에 대해 이러한 이벤트는
이벤트는 아래에 정의된 관계에 의해 후보 실행 내에서 순서화된다.
Agent Events Record 는 다음 필드를 가진
Field Name | Value | Meaning |
---|---|---|
[[AgentSignifier]] | 에이전트 식별자 | 이 순서를 발생시킨 평가의 에이전트. |
[[EventList]] | 이벤트 |
평가 중 리스트에 이벤트가 추가된다. |
[[AgentSynchronizesWith]] | 운영상 의미가 도입한 동기화 관계. |
Chosen Value Record 는 다음 필드를 가진
Field Name | Value | Meaning |
---|---|---|
[[Event]] | 이 선택 값에 대해 도입된 |
|
[[ChosenValue]] | 바이트 값 |
평가 동안 비결정적으로 선택된 바이트. |
candidate execution 은 에이전트 클러스터 평가의 다음 필드를 가진
Field Name | Value | Meaning |
---|---|---|
[[EventsRecords]] | 평가 중 추가된 이벤트 |
|
[[ChosenValues]] | 평가 중 선택된 바이트 값 |
empty candidate execution 은 필드가 빈
The abstract operation EventSet takes argument execution (a
The abstract operation SharedDataBlockEventSet takes argument execution (a
The abstract operation HostEventSet takes argument execution (a
The abstract operation ComposeWriteEventBytes takes arguments execution (a
read-modify-write 수정 [[ModifyOp]] 는
이 추상 연산은 write 이벤트
The abstract operation ValueOfReadEvent takes arguments execution (a
다음 관계와 수학적 함수는 특정 후보 실행 위에서 매개변수화되며 그 이벤트들을 순서화한다.
후보 실행 execution 에 대해, 그 is-agent-order-before 관계는 다음을 만족하는 최소 관계이다.
각 에이전트는 평가 중 per-
후보 실행 execution 에 대해, 그 reads-bytes-from 함수는
후보 실행은 항상 reads-bytes-from 함수를 허용한다.
후보 실행 execution 에 대해, 그 reads-from 관계는 다음을 만족하는 최소 관계이다.
후보 실행 execution 에 대해, 그 host-synchronizes-with 관계는 적어도 다음을 만족하는
두
이 관계는 HTML 워커 간 postMessage
같은 추가 동기화 메커니즘을
후보 실행 execution 에 대해, 그 synchronizes-with 관계는 다음을 만족하는 최소 관계이다.
문헌 관례상 write 이벤트가 read 이벤트와 synchronizes-with 관계를 가진다.
W synchronizes-with R 라도 R 은 W 이외의 write 로부터
후보 실행 execution 에 대해, 그 happens-before 관계는 다음을 만족하는 최소 관계이다.
이벤트 E, D 에 대해 다음 중 하나가 참이면 E happens-before D:
happens-before 는
후보 실행 execution 이 아래 알고리즘이
후보 실행 execution 이 아래 알고리즘이
후보 실행 execution 이 아래 알고리즘이
이벤트의 [[NoTear]] 가
직관적으로 이는 정렬된(
후보 실행 execution 에 대해 is-memory-order-before 는
R
이 항목은 동일 범위의
이 항목과 에이전트의 forward progress 보장은
후보 실행이 is-memory-order-before 관계를 허용하면 sequentially consistent atomics 를 가진다.
is-memory-order-before 는
후보 실행 execution 이 아래 모두 참이면 유효 실행(또는 실행)이다.
모든 프로그램은 적어도 하나의 유효 실행을 가진다.
실행 execution 과
실행 execution 과
실행 execution 이
모든 실행이 data race free 이면 프로그램은 data race free 이다.
메모리 모델은 data race free 프로그램에 대해 모든 이벤트의 순차적 일관성을 보장한다.
다음은 공유 메모리를 사용하는 ECMAScript 프로그래머를 위한 지침이다.
프로그램을
더 일반적으로, 프로그램이
다음은 공유 메모리를 사용하는 프로그램에 대한 컴파일러 변환을 작성하는 ECMAScript 구현자를 위한 지침이다.
단일 에이전트 환경에서 유효한 대부분의 프로그램 변환이 다중 에이전트 환경에서도 유효하도록 허용하는 것이 바람직하다. 종종 이러한 변환은 판단이 어렵다. 우리는 메모리 모델이 함축하거나 그보다 강한 규칙 몇 가지를 개략적으로 제시한다.
agent-order slice 를 단일 에이전트에 속하는
read 이벤트의 possible read values 는 모든 유효 실행에서 그 이벤트에 대한
공유 메모리가 없을 때 유효한 agent-order slice 변환은 아래 예외를 제외하고 공유 메모리 존재 시에도 유효하다.
Atomics 는 고정: 변환은 agent-order slice 의
(실제로 재배열 금지는
읽기는 안정적: 주어진 shared memory read 는 한 실행에서 단일 값만 관찰해야 한다.
쓰기는 안정적: 관찰 가능한 모든 shared memory write 는 실행의 프로그램 의미에서 비롯해야 한다.
가능한 읽기 값은 공집합이 아님: 변환은 가능한 읽기 값 집합을 비게 할 수 없다.
여전히 유효한 변환 예: 동일 위치 다수 비-atomic 읽기 병합, 비-atomic 읽기 재배열, 추측 비-atomic 읽기 도입, 동일 위치 다수 비-atomic 쓰기 병합, 서로 다른 위치 비-atomic 쓰기 재배열, 루프 밖으로 비-atomic 읽기 hoist (종료 영향 있어도). 일반적으로 alias 된
다음은 공유 메모리 접근에 대한 기계어 코드를 생성하는 ECMAScript 구현자를 위한 지침이다.
ARM 또는 Power 보다 약하지 않은 메모리 모델을 가진 아키텍처에서 비-atomic store/load 는 일반 store/load 로 컴파일할 수 있다. Atomic store/load 는 순차적 일관성을 보장하는 명령으로 컴파일한다. 없으면 메모리 배리어 사용. Read-modify-write 는 아키텍처의 read-modify-write 명령(예: x86 LOCK prefix, ARM load-exclusive/store-exclusive, Power load-link/store-conditional)으로 컴파일.
구체적으로 메모리 모델은 다음과 같은 코드 생성을 허용한다.
단순 코드 생성 패턴:
이 매핑은 주소 범위에 대한 atomic 연산이 비-atomic 쓰기나 다른 크기 atomic 과 race 하지 않는 한 올바르다. 메모리 모델은 race 에 관여한 atomic 을 비-atomic 수준으로 강등하여 충분하다. 다만 이 단순 매핑은 atomic 연산을 순차적 일관성 펜스로 사용할 수 있게 하는 등 꽤 강하다.
허용되는 로컬 개선 예: