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

결론: 다중 코어 기반의 멀티 스레딩 프로그래밍에서는 공유되는 메모리에 관련해서 메모리 가시성을 파악하고 적절히 메모리 장벽을 사용하는 것이 중요함

'Computer' 카테고리의 다른 글

Firmware(펌웨어)와 elf, bin, hex 파일  (0) 2023.04.04
하이퍼바이저(hypervisor) 와 도커(docker)  (0) 2023.04.04

+ Recent posts