작성
·
233
·
수정됨
1
안녕하세요. CAS 이해와 활용 -1 편 강의를 듣다가 질문 드립니다. 3분쯤에 PDF 자료에 'CAS는 CPU 캐시와 메인메모리의 두 값을 비교하고 그 값이 동일할 경우 새로운 값으로 교체하는 동기화 연산으로 여러 스레드가 공유하는 메모리 영역을 보호하는 데 사용된다'라고 나와있는습니다.
그런데 이후 강의를 듣다 보면 Main Memory Value, Expected Value, New Value 이렇게 세 가지 키워드로 CAS가 진행되더라구요. 여기서 Expected Value가 PDF 설명에 나와 있는 'CPU 캐시'를 의미하는 것 같은데요(강의 19분 쯤)
기대값은 특정 블록 안에 있는 지역 변수인데 지역 변수는 JVM 스택에 저장되는 걸로 알고 있습니다. JVM 스택에 저장되는 것이 CPU 캐시인가요? 어떤 관계인지 잘 모르겠어서 질문을 드립니다ㅠ
답변 1
0
CAS 는 기대값과 메모리값을 비교하는 연산자체를 락을 사용하지 않고도 원자적으로 실행할 수 있도록 해 주는 개념입니다.
여기서 스레드가 스택이 되었든 힙이 되었던 데이터를 메인 메모리에 저장하고 메모리로부터 읽을 수 있습니다.
그러나 여러 CPU 에서 실행되는 각 스레드는 메인메모리가 아닌 자신에게 할당된 CPU 캐시메모리로부터 데이터를 저장하고 읽기도 합니다.
즉 스택이 되었던 힙이 되었던 스레드는 메인메모리 혹은 캐시메모리에서 값을 읽거나 저장합니다.
CAS 에서 지역변수는 스택에 저장됩니다. 다만 저장되는 매체가 메인메모리일지 아니면 CPU 캐시메모리일지는 여러 기준에 의해 결정됩니다.
스택은 데이터가 저장되는 하드웨어가 아닌 자료 구조입니다.
즉 스택 자료구조에 저장되는 데이터도 결국은 캐시 메모리든 메인 메모리든 저장되어야 합니다.
그래서 스레드는 성능향상을 위해 지역변수도 메인 메모리가 아닌 캐시 메모리에 저장할 수 있습니다.
위 강의 설명에서 중요한 것은 캐시메모리든 메인 메모리든 읽어들인 두 값이 원자적 상호 비교하에 동기화 이슈가 발생하지 않았는지가 핵심입니다.
감사합니다 강사님!