본문 바로가기

etc

[C++] 메모리 가시성과 메모리 장벽


메모리 가시성 (Memory Visiblity)

1. 정의

- Thread에서 변경한 특정 메모리 값이, 다른 Thread에서 제대로 읽어지는가 라고 할 수 있다


2. 문제

- cpu의 메모리 아키텍쳐. 즉, 레지스터와 캐쉬가 존재하기 때문이다. 

: 각각의 코어는 메인 메모리와 별도로 각각의 레지스터와 캐쉬를 가지기 때문이다.

- 컴파일러의 최적화

: 컴파일러는 프로그램이 최대한 빠르게 실행될 수 있도록 코어의 레지스터와 캐쉬를 사용하도록 한다.


3. 결론

- Shared Memory 모델의 Concurrent, Parallel Programming에서는, 한 코어에서의 값 변경을 여러 코어가 공유하는 메인 

메모리로 반영하는 작업을 적절히 수행해야 메모리 가시성을 유지할 수 있다


메모리 장벽 Memory Barrier (Fence)

1. 배경

- 코어의 레지스터나 캐쉬의 값을 메인 메모리로 반영하는 것은 느리다. 하지만 꼭 필요하다.


2. 정의

- 메모리 장벽을 만나면 그전까지 코어의 레지스터나 캐쉬값의 변경을 메인 메모리로 반영하는 것이라고 할 수 있다.

- 메인 메모리로 flush 한다고 보면 된다. 이렇게 함으로 다른 코어에서 변경된 값을 읽을 수 있도록 한다.


3. 사용

- 컴파일러가 어떤 식으로든 메모리 장벽을 설치하도록 지시해야 한다.

- 일반적으로 동기화를 위한 lock을 사용하는 곳에는 암시적으로 메모리 장벽이 설치된다.

: lock이라는 것도 lock을 소유하는 코어가 특정 메모리에 표시를 해 두면 다른 코어가 그 값을 보고 자신이 lock을 소유할 수 없는 상태라는 것을 판단해야하다.

- 즉, lock을 위한 메모리를 쓰고 읽는 과정에는 메모리 장벽이 필수로 들어간다.


※ Re-Ordering

- 컴파일러가 장벽을 넘어서까지 재비치 하지 않는다는 것

- 메모리 장벽은 이전까지 메모리 작업을 메인 메모리로 반영한다는 것인데, 이때 그 메모리 장벽 이전까지라는 것은 프로그래머가 코드에 표현한 순서로 메모리 장벽 이전까지가 된다.


결론

- 다중 코어를 대상으로 하는 Multi Thread프로그래밍에서는, 공유되는 메모리에 관련해서 메모리 가시성을 파악하고 적절히 메모리 장벽을 사용하는 것이 필요하다고 할 수 있겠다.

'etc' 카테고리의 다른 글

Ubuntu FTP Server 1.  (0) 2017.09.19
[STL] 지역 변수를 STL Container에 삽입시 발생하는 일.  (0) 2015.08.03
[C++] Explicit 의미  (0) 2013.05.10
[C++] 문자열 분리(strtok, strtok_s)  (0) 2013.03.04
[Network] IRC구조  (0) 2013.02.22