콘텐츠로 이동

트랜잭셔널 메모리 (Transactional Memory)

Jan 28, 2026

트랜잭셔널 메모리(Transactional Memory)는 데이터베이스 트랜잭션 개념을 메모리 연산에 적용하여, 락 없이 원자적 메모리 접근을 보장하는 동기화 기법이다. 락 기반 동기화는 교착 상태 가능성, 확장성 저하, 복잡한 설계 등의 문제가 있어, 멀티코어 시대에 시스템이 원자성을 자동 보장하는 방법이 필요하다.

비유하면, 은행 계좌 이체에서 전통 방식은 양쪽 계좌에 락을 걸어야 하지만, 트랜잭셔널 메모리는 “A에서 빼고 B에 넣기”를 원자적으로 선언만 하면 시스템이 처리한다.

// 전통적 락 방식
void update() {
acquire();
/* modify shared data */
release();
}
// Transactional Memory 방식
void update() {
atomic {
/* modify shared data */
}
}

개발자는 “이 블록은 원자적으로 실행되어야 한다”만 명시하고, 시스템이 충돌 감지, 롤백, 재시도를 자동 처리한다.

  1. 트랜잭션 시작 → 읽기/쓰기 추적
  2. 충돌 감지 (다른 트랜잭션과 겹침?)
    • 충돌 없음 → Commit (확정)
    • 충돌 있음 → Abort (롤백) → 재시도
방식설명장점단점
STM (Software)컴파일러가 계측 코드 삽입특수 하드웨어 불필요오버헤드 큼
HTM (Hardware)캐시/캐시 일관성 프로토콜 활용오버헤드 적음하드웨어 수정 필요

함수형 프로그래밍: 불변 상태(immutable state)로 경쟁 조건, 교착 상태 자체를 원천 차단한다. Erlang(동시성/분산 강점), Scala(함수형+객체지향) 등이 대표적이다.

두 스레드가 동시에 같은 변수 수정 시도:

Thread A: Thread B:
atomic { atomic {
read counter (=10) read counter (=10)
counter = 10 + 1 counter = 10 + 5
} }
→ Thread A가 먼저 commit → counter = 11
→ Thread B는 충돌 감지 → rollback → 재시도
→ Thread B 재시도: read counter (=11), counter = 16 → commit