레이스 컨디션
레이스 컨디션 개념 정리
운영체제선수지식
운영체제
이름 그대로, 여러 스레드가 하나의 자원을 차지하기 위해 경쟁하다가 문제가 발생하는 상황
핵심 개념 정리
-
정의: 둘 이상의 스레드(또는 프로세스)가 공유 자원에 동시에 접근하여 조작할 때, 접근 순서나 타이밍에 따라 실행 결과가 달라질 수 있는 문제 상황
-
임계 구역 (Critical Section): 둘 이상의 스레드나 프로세스가 공유 자원에 접근하는 코드 영역
- 이 구역은 한 번의 하나의 스레드만 들어가도록 보호되어야 한다
-
발생 조건 (네 가지 모두 충족 필요)
- 다중 실행 단위: 두 개 이상의 스레드가 존재
- 공유 자원: 스레드들이 공동으로 사용하는 변수, 메모리, 파일 등이 있어야 함
- 쓰기 작업: 최소 하나 이상의 스레드가 공유 자원의 상태를 변경(쓰기)해야 함
- 모두 읽기만 하면 문제가 없다
- 비원자적 연산: 읽기 -> 쓰기 과정이 하나의 명령어로 처리되지 않고, 중간에 끊길 수 있어야 한다
- 이때 컨텍스트 스위칭이 끼어들 여지가 생김
쉽게 이해하기
인기 있는 한정판 신발의 재고가 딱 1개 남은 상황을 가정한다. 이 신발을 두 명의 사용자가 거의 동시에 구매하려고 한다.
- 공유 자원: 신발의 재고 수량 (1개)
- 스레드: 사용자 A의 구매 요청, 사용자 B의 구매 요청
- 사용자 A가 상품 페이지에 들어오고, 구매하기 버튼을 누름
- A의 결제 정보가 서버로 전송되는 그 순간에, B도 상품 페이지에 접속
- B에게도 서버는 (아직 A의 구매가 최종 완료되지 않았으므로) 재고가 1개 남았다고 알림
- B도 즉시 구매하기 버튼을 누름
- 서버에서는 두 개의 구매 요청이 거의 동시에 도착
- A 요청 처리: 재고 확인 -> 1개가 있음 -> 결제 승인 -> 재고를 0으로 변경
- B 요청 처리: 재고 확인 -> A가 구매하기 직전이라 1개가 있음 -> 결제 승인 -> 재고를 0으로 변경
- 결과: 두 사용자 모두 결제에 성공했다는 메시지를 받음
- 그러나, 실제 상품은 1개 뿐이기에 결국 쇼핑몰은 한 명의 고객의 주문을 취소하고 사과해야 함
이처럼 재고 확인과 재고 차감이라는 두 단계의 작업이 하나의 묶음(원자적 연산)으로 처리되지 않으면, 그 사이를 다른 요청이 비집고 들어와 데이터가 꼬이게 된다.