Java/병렬 프로그래밍

자바 병렬 프로그래밍 - 자바 메모리 모델

kwon92 2021. 2. 1. 18:13

 

자바 메모리 모델은 무엇이며 , 왜 사용해야 하는가?

aVariable = 3 

변수에 값을 할당 했을때 자바 메모리 모델은 값을 사용 할 수 있으려면 어떤 조건이 돼야 하는지 답을 알고 있다.

 

동기화 기법을 사용하지 않은 경우엔 메모리 대신 CPU 레지스터에 보관이 돼서 값을 못 읽을 수도 있고

캐시의 형태에 따라 할당된 값이 메모리에 실제 보관되는 시점에 차이가 있기도 하고

CPU 내부 캐시에 보관된 값이 다른 CPU 에 보이지 않을 수도 있다.

 

 

단일 스레드로 동작하는 환경에서는 JVM 이 순차적으로 동작하는 것과 동일하게 실행되도록 명시하고 있다.

 

멀티 스레드로 실행되는 환경에서는 성능을 크게 제한하지 않는 한 순차성이 주는 안전성과 높은 성능은 찾아보기 어렵다. 병렬 프로그램이라도 대부분은 각자의 작업을 처리하기 때문에 스레드 간의 조율 기능에 

자원을 많이 낭비하는 일은 별 이득도 없이 성능만 떨어뜨리기 쉽다.

꼭 필요한 곳에만 공유해 사용하는 것이 올바른 방법이고,

JVM 은 동기화 기능을 사용하는 부분에 한해서 프로그램이 스레드 간의 조율을 하고자 한다는 점을 파악 할 수 있다.

 

- 16.1.2 재배치

 

서로 다른 스레드가 각자의 상황에 맞는 순서로 명령어를 실행할수있게 허용이 되어있어서

동기화가 되어있지 않으면 실행 순서를 예측하는 일이 복잡해진다.

특정 작업이 지연되거나 다른 순서로 실행되는 것처럼 보이는 문제는 재배치라고 한다.

 

메모리 수준에서의 재배치 현상은 프로그램을 오작동하게 만들기 쉽다.

동기화 작업을 제대로 해서 재배치가 안 발생 하도록 해줘야한다.

 

 

- 16.1.3 자바 메모리 모델을 간략하게 설명한다면

 

변수를 읽거나 쓰는 작업, 스레드를 시작하거나 끝나길 기다리는 작업 등

여러 작업에 대해 자바 메모리 모델(JMM)을 정의 한다

JMM에서는 내부의 모든 작업을 대상으로 미리 발생 이라는 부분 재배치 연산을 정의한다.

미리 발생 관계가 정해져 있어서 재배치가 일어나지 않게 한다.

 

내부적으로 순서가 정해져 있더라도, 동기화 작업은 항상 완전하게 순서가 정해져 있다.

두 개의 스레드가 서로 다른 락으로 동기화 되어있다면 양쪽 스레드에서 일어나는 작업에 보장이 되지 않는다.

 

 

 

요약

자바 메모리 모델은 특정 스레드에서 메모리를 대상으로 취하는 작업이 다른 스레드에 어떻게 보이는지의 여부를 명시한다.

가시성을 보장해주는 연산은 미리 발생이라는 규칙을 통해 부분적으로 실행 순서가 정렬된 상태를 유지하며,

미리 발생 규칙은 개별적인 메모리 작업이나 동기화 작업의 수준에서 정의 되는 규칙이다.

 

충분히 동기화 되지 않은 상태에서는 공유된 데이터를 여러 스레드에서 사용할때 굉장히 이상한 현상이 발생 할 수 있다.