기계 메모리 순서

기계 메모리 순서 (Machine Memory Order)

병렬 스레드·퓨처(future)·플레이스(place)는 약한 메모리 순서(weak memory ordering)를 포함해 기반 머신의 메모리 모델을 드러낼 수 있어요. 여러 스레드가 가변 벡터의 여러 슬롯에 쓰기를 할 때, 명시적으로 동기화하지 않으면 어떤 플랫폼에서는 다른 스레드가 그 쓰기를 다른 순서로 보거나 아예 못 볼 수도 있습니다.

출처: Racket Reference - Machine Memory Order

본문

병렬 스레드, 퓨처, 플레이스는 약한 메모리 순서를 포함해 기반 머신의 메모리 모델을 드러낼 수 있어요. 예를 들어 병렬 스레드가 가변 벡터의 여러 슬롯에 쓰기를 할 때, 어떤 플랫폼에서는 다른 병렬 스레드가 그 쓰기를 다른 순서로 관찰하거나 아예 관찰하지 못할 수 있어요. 단, 스레드가 명시적으로 동기화되어 있지 않다면 말이죠. 마찬가지로, 공유된 바이트 문자열이나 fxvector는 플레이스에 걸쳐 머신의 메모리 모델을 드러낼 수 있습니다.

Racket은 머신의 메모리 모델이 기본 데이터타입의 구현을 안전하지 않게 드러내는 방식으로 관찰되지 않도록 보장해요. 예를 들어 한 스레드가 다른 스레드가 변이(mutate) 중인 벡터를 읽어서, 일부만 구성된 기본(primitive) 값이 보이게 되는 일은 없습니다.

box-cas!, vector-cas!, unsafe-box*-cas!, unsafe-vector*-cas!, unsafe-struct*-cas! 연산들은 모두 머신 수준의 compare-and-set을 제공해요. 그래서 머신의 메모리 모델이 구체적으로 지원하는 방식으로 쓸 수 있죠. (memory-order-acquire)(memory-order-release) 연산도 비슷하게 머신 수준의 저장(store)과 로드(load)를 제약합니다. 세마포어, sync, 플레이스 메시지, 퓨처 touch, 퓨처 세마포어 같은 동기화 연산들은 그에 맞는 머신 수준의 acquire/release 순서를 함의해요.

프로시저

(memory-order-acquire)void?

(memory-order-release)void?

이 연산들은 동기화에 머신 수준의 메모리 펜스(fence)가 필요한 플랫폼에서 그 펜스를 구현합니다. memory-order-acquire 연산은 머신 수준에서 적어도 load–load와 load–store 펜스를 보장하고, memory-order-release 연산은 적어도 store–store와 store–load 펜스를 보장해요.

버전 7.7.0.11 (패키지 base)에서 추가됨.

더 알아보기