- 메모리 가시성이란 한 thread 에서 변경한 특정 메모리 값이 다른 thread에서 제대로 읽어지는지 여부를 의미함
- 이 가시성이 이슈가 되는 경우는 멀티 코어 환경에서 여러 thread 가 동시에 실행되는 상황임
- 첫번째 이유는 CPU 메모리 아키텍쳐 (레지스터& 캐시) 때문임
- 각 코어(CPU)가 메인 메모리와 별도로 이러한 메모리 아키텍쳐를 갖고 있기 때문.
- 두번째 이유는 컴파일러의 최적화 때문임
- 컴파일러에서 프로그램이 최대한 빠르게 실행될 수 있도록 코어의 레지스터와 캐시를 적극 사용하도록 최적화 하는 것
- 따라서, Shard memory 모델의 concurrent , parallel programming 에서는 한 코어에서의 값 변경을 여러 코어가 공유하는 메인 메모리로 반영하는 작업을 적절히 수행해줘야함
- 하지만 코어 메모리 아키텍처에 쓰는 것에 비해 메인 메모리에 값을 쓰는(flash) 것은 느림
- 매번 메모리에 쓰는 것은 비효율적이므로 적절한 시점에만 메인 메모리에 쓰는 것이 필요함
- 여기서 등장하는 내용이 메모리 장벽(memory barrier)임
- 이 장벽을 만나면 이전까지의 레지스터나 캐시값의 변경을 메모리에 쓰는 것임
- 이 장벽을 세울려면 결국 컴파일러가 장벽을 설치할수 있도록 프로그래머가 코드에 추가해줘야 함
- 멀티스레딩에서 등장하는 lock 도 메모리 장벽이 필수적임
- lock을 소유하는 코어가 특정 메모리에 표시를 해두면, 다른 코어가 그 값을 보고 자신이 lock을 소유할 수 없는 상태라는 것을 판단하기 때문에 이 lock을 위한 메모리를 읽고 쓰는 과정에 메모리 장벽이 반드시 필요한 것임
- atomic 클래스가 나온 것도 이러한 메모리 가시성 때문임
- 즉, atomic 클래스로 정의한 변수에 값을 쓰거나 읽는 것은 레지스터나 캐시가 아니라 메인 메모리에서 수행되도록 해주는 것임
- 추가적으로 메모리 장벽은 메모리 재배치(reordering) 과도 관련이 있음
- 컴파일러가 메모리 장벽을 넘어서까지 재배치를 하지 않는 다는 것
(메모리 장벽 이전까지 메모리 작업을 메인 메모리에 반영하고 그 이후는 재배치를 하지 않게 되는 것)
결론: 다중 코어 기반의 멀티 스레딩 프로그래밍에서는 공유되는 메모리에 관련해서 메모리 가시성을 파악하고 적절히 메모리 장벽을 사용하는 것이 중요함
'Computer' 카테고리의 다른 글
Firmware(펌웨어)와 elf, bin, hex 파일 (0) | 2023.04.04 |
---|---|
하이퍼바이저(hypervisor) 와 도커(docker) (0) | 2023.04.04 |