동시성 제어 (Concurrency Control)#
동시성 제어는 여러 프로세스나 스레드가 동시에 공유 자원에 접근할 때, 데이터의 일관성과 무결성을 보장하기 위한 제어 메커니즘.
다중 사용자 환경에서 필수적으로 지원해야 하는 기능으로, 병행제어라고도 한다.
동시성 제어의 중요성#
동시성 제어는 다음과 같은 문제를 방지하여 데이터베이스의 무결성을 유지한다:
- 갱신 손실: 동시에 수행된 갱신 작업으로 인한 데이터 손실
- 모순성: 일관성 없는 데이터 읽기
- 연쇄 복귀: 하나의 트랜잭션 실패로 인한 다른 트랜잭션들의 복귀
- 트랜잭션의 직렬성 보장
- 데이터의 무결성 및 일관성 유지
- 시스템 활용도 최대화 (공유도 최대, 응답 시간 최소, 처리량 최대화)
주요 동시성 제어 기법#
락킹(Locking) 기법#
락킹은 가장 기본적인 동시성 제어 방법으로, 데이터에 접근할 때 잠금을 설정하여 다른 프로세스의 접근을 제한한다.
공유 락(Shared Lock):
- 읽기 작업을 위한 락
- 여러 프로세스가 동시에 획득 가능
- 데이터 읽기만 허용됨
배타적 락(Exclusive Lock):
- 쓰기 작업을 위한 락
- 한 번에 하나의 프로세스만 획득 가능
- 데이터 읽기와 쓰기 모두 가능
타임스탬프 기반 기법(Timestamp-based Protocol)#
각 트랜잭션에 고유한 타임스탬프를 부여하여 실행 순서를 결정하는 방식.
작동 원리#
- 트랜잭션 시작 시 타임스탬프 부여
- 읽기/쓰기 타임스탬프 관리
- 충돌 발생 시 타임스탬프 비교하여 처리
- 교착상태 발생하지 않음
- 우선순위 기반 처리 가능
낙관적 병행 제어(Optimistic Concurrency Control)#
충돌이 적을 것이라 가정하고, 검증 단계에서 충돌을 확인하는 방식.
처리 단계#
- 읽기 단계: 데이터 읽기와 로컬 복사본 생성
- 수행 단계: 로컬 복사본에서 작업 수행
- 검증 단계: 충돌 여부 확인
- 쓰기 단계: 검증 성공 시 결과 반영
다중버전 병행 제어(Multiversion Concurrency Control, MVCC)#
데이터의 여러 버전을 유지하여 읽기 작업의 병행성을 향상시키는 기법.
- 각 쓰기 작업마다 새로운 버전 생성
- 읽기 작업은 특정 시점의 버전을 참조
- 트랜잭션의 일관성 보장
실제 적용 예시#
PostgreSQL이나 Oracle 같은 데이터베이스 시스템에서 MVCC를 사용하여 읽기 작업의 성능을 향상시킨다.
동시성 제어의 구현 시 고려사항#
성능과 확장성
- 락의 세분성 조절
- 데드락 방지 메커니즘
- 캐시 일관성 유지
일관성 수준
- 직렬성(Serializability)
- 스냅샷 격리(Snapshot Isolation)
- 읽기 일관성(Read Consistency)
장애 복구
동시성 제어의 발전 방향#
분산 시스템에서의 동시성 제어
- 분산 락 관리
- 합의(Consensus) 알고리즘
- 최종 일관성(Eventual Consistency)
새로운 하드웨어 지원
- 하드웨어 트랜잭션 메모리
- 원자적 명령어 활용
- 멀티코어 최적화
인메모리 데이터베이스
- 락-프리 알고리즘
- 비동기 복제
- 실시간 동시성 제어
실제 구현 시 주의사항#
데드락 예방
- 타임아웃 설정
- 자원 순서화
- 데드락 감지 알고리즘 구현
성능 최적화
- 락 경합(Lock Contention) 최소화
- 트랜잭션 분할
- 캐시 활용
모니터링과 디버깅
- 락 획득/해제 로깅
- 성능 메트릭 수집
- 병목 지점 분석
참고 및 출처#
Lock and Mutex Lock과 Mutex는 둘 다 여러 스레드가 공유 자원에 동시에 접근하는 것을 방지하는 동기화 도구이다. 한 스레드가 자원을 사용할 때 다른 스레드의 접근을 막는 것이다.
특성 Mutex Lock 기본 개념 상호 배제를 위한 동기화 객체로, 소유권 개념이 있음 일반적인 동기화 메커니즘으로, 단순한 잠금/해제 기능 소유권 소유권 개념이 있어 획득한 스레드만 해제 가능 소유권 개념이 없어 다른 스레드도 해제 가능 재진입성 보통 재진입 가능 (같은 스레드가 여러 번 획득 가능) 구현에 따라 재진입 가능할 수 있음 용도 스레드 간 엄격한 상호 배제가 필요한 경우 간단한 동기화가 필요한 일반적인 상황 성능 소유권 검사 등으로 인한 오버헤드 존재 상대적으로 가벼운 오버헤드, 단 구현에 따라 다름 에러 처리 소유권 위반 시 예외 발생 가능 단순한 실패/성공 여부만 반환 구현 복잡도 상대적으로 복잡한 구현 단순한 구현, 그러나 고급 기능 추가 시 복잡해질 수 있음 적용 범위 프로세스 내 스레드 간 동기화 프로세스 내 또는 프로세스 간 동기화에 사용 가능 우선순위 상속 우선순위 상속 지원 가능 일반적으로 지원하지 않음, 구현에 따라 다를 수 있음 교착상태 처리 소유권 추적으로 교착상태 감지 용이 기본적인 교착상태 감지만 가능 에러 검사 상세한 에러 검사 및 보고 기능 기본적인 에러 검사, 구현에 따라 확장 가능 메모리 사용 소유권 정보 저장으로 추가 메모리 필요 최소한의 메모리 사용 유연성 엄격한 규칙으로 유연성 제한 상대적으로 유연한 사용 가능 디버깅 소유권 정보로 디버깅 용이 디버깅이 상대적으로 어려움, 구현에 따라 다를 수 있음 사용 예시 데이터베이스 트랜잭션, 파일 시스템 접근 간단한 공유 자원 보호, 카운터 타임아웃 지원 보통 타임아웃 기능 내장 구현에 따라 타임아웃 지원 가능 복구 기능 비정상 종료 시 자동 복구 지원 구현에 따라 자동 복구 기능 추가 가능 중첩 사용 재진입성으로 중첩 사용 가능 구현에 따라 중첩 사용 가능, 주의 필요 시스템 수준 주로 커널 수준에서 구현 사용자 수준 및 커널 수준 모두에서 구현 가능 표준화 POSIX 표준으로 잘 정의됨 구현에 따라 동작이 다를 수 있음 성능 특성 경쟁 상황에서 성능 저하 가능 스핀락 구현 시 짧은 대기 시간에 효율적 공정성 일반적으로 공정성 메커니즘 내장 구현에 따라 공정성 보장 여부가 다름 실제 구현 시에는 고려할 사항 동시성 요구사항 (얼마나 많은 스레드가 동시에 접근하는가) 성능 요구사항 (응답 시간, 처리량 등) 리소스 사용량 (메모리, CPU 사용률) 오류 처리 및 복구 요구사항 데드록 방지 필요성 플랫폼 및 운영체제의 지원 여부 참고 및 출처
동시성 (Concurrency) 동시성 (Concurrency)은 여러 작업이 동시에 실행되는 것처럼 보이지만, 실제로는 매우 빠르게 작업 간 전환을 하면서 처리하는 방식이다. 예를 들어, 하나의 CPU 코어에서 여러 작업을 빠르게 번갈아가며 실행하여 마치 동시에 여러 작업이 처리되는 것처럼 보이게 만든다.
Source: https://dynamogeeks.com/blog/concurrency-vs-parallelism-a-simplified-explanation
동시성의 특징 논리적 개념: 동시성은 물리적으로 동시에 실행되는 것이 아닌, 논리적으로 동시에 실행되는 것처럼 보이게 하는 개념이다. 자원 효율성: CPU가 유휴 상태로 있지 않고 계속해서 작업을 처리하므로 시스템 자원을 효율적으로 사용할 수 있다. 응답성 향상: 여러 작업을 번갈아가며 처리하므로 전체적인 시스템의 응답성이 향상된다. 동시성의 구현 방법 멀티스레딩: 하나의 프로세스 내에서 여러 스레드를 사용하여 작업을 동시에 처리한다. 비동기 프로그래밍: 작업을 비동기적으로 처리하여 한 작업이 완료되기를 기다리지 않고 다른 작업을 수행할 수 있게 한다. 동시성의 장점 성능 향상: 여러 작업을 동시에 처리함으로써 전체적인 처리 속도를 높일 수 있다. 자원 활용 최적화: CPU와 같은 시스템 자원을 최대한 활용할 수 있다. 사용자 경험 개선: 특히 UI 애플리케이션에서 동시성을 활용하면 사용자 반응성을 크게 향상시킬 수 있다. 동시성의 주의점 복잡성 증가: 동시성 프로그래밍은 일반적인 순차적 프로그래밍보다 복잡할 수 있다. 동기화 문제: 여러 작업이 공유 자원에 동시에 접근할 때 발생할 수 있는 문제를 주의해야 한다. 디버깅의 어려움: 동시에 실행되는 작업들 간의 상호작용으로 인해 버그를 찾고 수정하기가 어려울 수 있다. 동시성의 실제 예시 웹 브라우저: 여러 탭을 동시에 열어 각각 다른 웹페이지를 로드하면서 사용자 입력을 받는 것은 동시성의 좋은 예이다. 데이터베이스 시스템: 여러 사용자의 쿼리를 동시에 처리하는 데이터베이스 시스템도 동시성을 활용한다. 동시성은 현대 프로그래밍에서 매우 중요한 개념으로, 시스템의 성능을 향상시키고 사용자 경험을 개선하는 데 크게 기여한다.
...