메모리 가시성 (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 |