반응형
시작하기 앞서 위키에서 설명하는 Race Condition 은 아래와 같다.
공유 자원에 대해 여러 개의 프로세스가 동시에 접근을 시도할 때 접근의 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있다. 이를 방지하기 위해서는 프로세스 협력 기법이 필요하다.
https://ko.wikipedia.org/wiki/%EA%B2%BD%EC%9F%81_%EC%83%81%ED%83%9C
위키에서의 말을 이해한다면 이미 지식이 있는 사람이고, 한번에 이해가 안갈수도 있는데 한마디로
두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황
이다.
이전 포스팅에서 다뤘던 내용 중 뮤텍스와 세마포어 라는 개념이 있다.
자세한 내용은 아래 참고 포스팅을 참고 바란다.
또는 데드락 개념을 한번 알고 가면 도움이 된다.(참고 포스팅 참고)
발생 원인
- 불충분한 동기화
여러 스레드 또는 프로세스가 적절한 동기화 없이 공유 리소스에 액세스하면 Race Condition이 발생할 수 있다. - 비원자적 작업
여러 단계로 구성되고 단계 사이에서 중단될 수 있는 작업은 비원자적이다. 여러 스레드가 공유 리소스에서 비원자적 작업을 수행하는 경우 Race Condition이 발생할 수 있다.(더 이상 쪼갤 수 없는 행위를 '원자성을 가진다'라고 하며 이러한 특성을 가진 것을 '원자적이다'고 한다.) - 실행 순서에 대한 잘못된 가정
프로그래머가 강제하지 않고 특정 실행 순서를 가정할 때 실제 실행 순서가 다를 경우 Race Condition이 발생할 수 있다.
예시
상황은 트랜잭션 단위로 생각하면 쉽다.
- 통장 계좌 1000원
- A 와 B 가 동시에 통장 읽음
- A는 700원 인출( 1000-700 = 잔액 300원)
- B는 300원 인출( 1000-300 = 잔액 700원)
- A 거래 후 트랜잭션은 300원으로 update
- B 거래 후 트랜잭션은 700원으로 update
예방법
- 상호 배제(Mutual Exclusion)
공유 데이터에 접근하는 부분을 임계 영역(Critical Section)으로 지정하고, 한 번에 하나의 실행 흐름만 해당 영역에 들어가도록 한다. - 공유 데이터를 최소화한 병렬 처리 설계
데이터를 적절히 분리하여 각 스레드가 독립적으로 처리하도록 설정 - 스레드 안전성 보장(Thread Safe)
공유 데이터를 수정하는 함수나 메서드를 스레드 안전하도록 구현
이를 위해 스레드 동기화 기법을 사용하거나 불변 객체(Immutable Object)패턴 적용 - 테스트와 검증
코드를 작성 후 테스트를 진행
테스트 코드를 작성해서 원하는 결과가 나오는지 확인 필수
참고 포스팅
https://thenicesj.tistory.com/356
https://thenicesj.tistory.com/381
반응형
'IT > Knowledge' 카테고리의 다른 글
Reactive Programming(리액티브 프로그래밍) 이란? (18) | 2024.10.17 |
---|---|
키네시스 스프링(Kinesis Spring) 이란 (12) | 2024.10.15 |
웹 GL(WebGL) (21) | 2024.10.03 |
webOS 란? (10) | 2024.10.02 |
프림(Prim) 알고리즘 (13) | 2024.10.01 |
댓글