도서/기술

[책] 데이터 지향 프로그래밍 - 8장 고급 동시성 제어

egg528 2024. 12. 21. 13:54

DOP의 동시성 관리


 일반적으로 다중 스레드 환경에서 동시성을 관리하기 위해 임계 영역(Critical Section) 접근 작업을 뮤텍스와 같은 잠금 장치로 보호한다. 보호 대상에는 읽기 영역도 포함되는데 그 이유는 읽기 도중에 다른 스레드에 의해 값이 변경되어 일관성을 잃을 수 있기 때문이다.

 

 하지만 DOP에서 읽기 작업은 다중 스레드를 고려하지 않아도 된다. 그 이유는 DOP에서 데이터는 불변이기 때문이다. 즉, 다른 작업에 의해 값이 변해도 문제가 없다. 그렇다면 쓰기 작업의 경우 어떨까?

 

 

 

 DOP에서는 쓰기 작업에서도 잠금을 사용하는 대신 더 원자라는 단순한 구조를 사용한다. DOP의 쓰기는 사진과 같은 단계를 거치는데 상태가 변경됐는가? 부분에서 원자적으로 비교 후 상태를 반영한다. 이때 언어 별로 이런 동작을 지원하는 구현체가 이미 존재하거나 외부 라이브러리를  활용할 수 있다.

 

# Class: Concurrent::Atom

# 초기값 생성
atom = Concurrent::Atom.new(1)

# compare_and_set(old_value, new_value)
# old_value가 일치하기 때문에 2로 변경이 된다;
atom.compare_and_set(1, 2);

# old_value가 일치하지 않기 때문에 3으로 변경에 실패한다.
atom.compare_and_set(1, 3);

 최근 Ruby를 사용하고 있기 때문에 Ruby의 기능으로 알아보자. Concurrent::Atom을 활용하면 DOP의 원자를 쉽게 구현할 수 있다.

 

 

 

내 생각


 원자를 활용하면 확실히 성능적인 손실을 방지할 수 있을 것 같다. 하지만 많은 작업 상황에서 많은 스레드가 while문을 돌며 스냅샷을 생산해내면 서버에 어떤 영향을 줄지도 궁금하다. 또한 2개 이상의 서버가 동작하는 상황에서 어떻게 해야할지도 궁금하다. 이 의문은 지금 메모리에서 관리하는 데이터를 결국 DB에 어떻게 저장하느냐와도 연관된 것 같은데 좀 더 읽어나가다 보면 궁금증이 풀리지 않을까 싶다.