본문 바로가기
Back-end

volatile

by 신재권 2023. 8. 23.

volatile이란?

volatile은 자바의 키워드 중 하나로, 변수 선언 시 사용되며, 해당 변수의 값을 메인 메모리에 직접 읽고 쓰도록 지정 하는 역할을 한다.

이는 다중 스레드 환경에서 변수의 값이 스레드 간에 정확하게 동기화되도록 보장하기 위해 사용된다.

하지만 동기화가 보장되는 것으로 인해 가시성 문제는 해결할 수 있지만, 동시 접근 문제는 해결할 수 없다.

왜 필요한가?

volatile 키워드를 사용하면 변수를 항상 메인 메모리에 쓰기 및 읽기를 하므로, 다중 스레드 환경에서 값의 일관성과 가시성을 보장할 수 있다.

공유 변수나 상태 정보 등이 여러 스레드에 의해 접근되는 경우 사용한다.

  1. 가시성 보장 : 하나의 스레드에서 변경한 값을 다른 스레드에서 바로 읽을 수 있도록 한다.
  2. 순서 보장 : volatile 변수에 대한 쓰기 연산은 다른 스레드에서의 쓰기 연산과 동기화 되어 정확한 순서를 보장한다.

CPU 데이터를 어떻게 쓰고 처리할까?

프로그램 코드, 클래스, 객체 등의 데이터가 메인 메모리에 저장된다. 모든 스레드가 공유하는 데이터는 메인 메모리에 위치한다.

각 스레드는 CPU 캐시를 갖고있어서, 다른 스레드의 캐시와 독립적으로 동작하고 캐시 간 데이터 공유가 발생하지 않는다.

즉, volatile 키워드는 CPU 캐시에서 값을 가져오는 것이 아닌 메모리에서 직접 가져오거나 쓰게 하여 변수의 값을 정확하게 동기화 하기 위해 사용한다.

캐시 정책

캐시 정책인 Write Through와 Write Back은 메모리에 데이터를 쓸 때 캐시와 메인 메모리 간의 동기화 방식을 나타낸다.

Write Through

Write Through 정책은 데이터가 캐시에 쓰일 때 동시에 메인 메모리에도 즉시 업데이트 된다.

즉, 데이터 변경이 발생하면 캐시와 메인 메모리에 모두 데이터가 동시에 쓰여진다.

데이터 일관성이 중요한 시스템에서 사용한다.

데이터 일관성을 보장하나, 메인 메모리에 접근하므로 성능이 저하된다.

Write Back

Write Back 정책은 데이터가 캐시에 쓰여지면 해당 데이터는 메인 메모리에 업데이트 되지 않는다.

변경된 데이터는 캐시 내부에 저장되며, 메인 메모리는 최신 데이터를 업데이트 하기 전까지 변경내용이 반영되지 않는다.

성능을 우선시하는 시스템에서 사용된다.

성능이 좋지만, 데이터 일관성을 보장하기 위해 추가적인 메커니즘이 필요하다.

Dirty Bit

더티 비트는 캐시와 메인 메모리 간 데이터의 일관성을 관리하기 위해 사용되는 하드웨어 기법 이다.

Write Back 캐시 정책과 관련이 있다.

Dirty Bit는 캐시 라인에 있는 데이터가 변경되었는지를 나타내는 플래그이다. 즉, 해당 데이터가 캐시에서 메인 메모리로 다시 기록되어야 하는지 여부를 나타냅니다.

Dirty Bit가 1이면, 캐시의 데이터가 변경된 상태라는 것을 의미하며, 이후 해당 캐시 라인이 다른 데이터로 교체되거나, 더 캐시되는 경우 해당 데이터를 메인 메모리에 기록하는 작업이 수행된다.

캐시 블록마다 더티 비드가 1개씩 존재한다.

'Back-end' 카테고리의 다른 글

sychronized, Atomic  (0) 2023.08.24
Servlet, ServletContainer vs DispatcherServlet  (0) 2023.08.24
Thread(Java/OS)  (0) 2023.08.23
동기식 vs 비동기식, Blocking vs Non-Blocking  (0) 2023.08.23
2023.08.22 TIL  (0) 2023.08.22