[운영체제] 메모리 오더

RisingJade의 개발기록·2022년 6월 20일
0

메모리 오더

기본 지식

Atomic 연산에 한해, 모든 쓰레드가 동일 객체에 대해서 동일한 수정 순서를 관찰!
Atomic<Typename T>를 통해 선언한 Atomic 객체는 원자적으로 load와 store가 가능한데, 이때 유일하게 지켜지는 것은 동일 객체에 대해 동일한 수정 순서를 관찰한다는 점이다!

메모리 가시성

어떤 한 데이터에 대해 여러 쓰레드가 값을 가져가서 사용하고 읽을때, 각 쓰레드가 관찰한 데이터의 값은 다를 수 있다.
예를 들어, 1->3->5->9 이런식으로 흘러가는 데이터가 있을때, 여러 쓰레드가 읽는 시간과 자신들이 그 데이터에 write한 결과에 따라 다르게 데이터 값이 나올 수 있다.
각 코어의 L1,L2캐시는 따로 존재하니 이런 일이 생긴다. 즉, 제대로 맞추려면 동기화를 해줘야 한다.

정리

"다중 코어에서의 메모리 아키텍처, 캐쉬와 레지스터의 존재 및 컴파일러 성능 최적화에 따른 재배치 현상으로 인하여 일부 상태의 업데이트(쓰기) 작업이 끝난 뒤,
작업을 실행하는 쓰레드 외에 다른 쓰레드에게는 상태의 변경이 보이지 않는 상황이 발생한다."

메모리 장벽

  • 코어의 레지스터나 캐시의 값을 메인 메모리에 언젠간 반영해야하기 때문에 필요하다.
  • 이 메모리 장벽을 만나면 코어의 레지스터나 캐쉬값의 변경을 메인 메모리로 반영한다.
  • 일반적으로 동기화를 위한 lock을 사용하는 곳에 암시적으로 메모리 장벽이 설치된다.

Atomic memory-order

memory_order_acq_rel

  • memory_order_acq_rel: acquire 와 release 를 모두 수행하는 것. 읽기와 쓰기를 모두 수행하는 fetch_add 와 같은 함수에서 사용될 수 있다.

memory_order_seq_cst

  • memory_order_seq_cst: 메모리 명령의 순차적 일관성(sequential consistency) 을 보장한다.
    순차적 일관성이란, 메모리 명령 재배치도 없고, 모든 쓰레드에서 모든 시점에 동일한 값을 관찰할 수 있는, 여러분이 생각하는 그대로 CPU 가 작동하는 방식 생각하자
    memory_order_seq_cst 를 사용하는 메모리 명령들 사이에선 이러한 순차적 일관성을 보장해준다.

    Atomic타입을 일반적으로 쓸땐 memory_order_seq_cst가 디폴트 값으로 적용된다.
    이게 생각보다 비싼 연산이긴 한데 인텔이나 암드의 x86(64) CPU의 경우 사실 거의 순차적 일관성이 보장되서 seq_cst를 강제해도 차이가 드라마틱하게 나진 않는다고 한다. 근데 ARM CPU는 꽤 차이난다고 하니 조심하자.

profile
언제나 감사하며 살자!

0개의 댓글