seungjun.dev

레이스 컨디션

레이스 컨디션 개념 정리

선수지식

운영체제

이름 그대로, 여러 스레드가 하나의 자원을 차지하기 위해 경쟁하다가 문제가 발생하는 상황

핵심 개념 정리

  • 정의: 둘 이상의 스레드(또는 프로세스)가 공유 자원에 동시에 접근하여 조작할 때, 접근 순서나 타이밍에 따라 실행 결과가 달라질 수 있는 문제 상황

  • 임계 구역 (Critical Section): 둘 이상의 스레드나 프로세스가 공유 자원에 접근하는 코드 영역

    • 이 구역은 한 번의 하나의 스레드만 들어가도록 보호되어야 한다
  • 발생 조건 (네 가지 모두 충족 필요)

    • 다중 실행 단위: 두 개 이상의 스레드가 존재
    • 공유 자원: 스레드들이 공동으로 사용하는 변수, 메모리, 파일 등이 있어야 함
    • 쓰기 작업: 최소 하나 이상의 스레드가 공유 자원의 상태를 변경(쓰기)해야 함
      • 모두 읽기만 하면 문제가 없다
    • 비원자적 연산: 읽기 -> 쓰기 과정이 하나의 명령어로 처리되지 않고, 중간에 끊길 수 있어야 한다
      • 이때 컨텍스트 스위칭이 끼어들 여지가 생김

쉽게 이해하기

인기 있는 한정판 신발의 재고가 딱 1개 남은 상황을 가정한다. 이 신발을 두 명의 사용자가 거의 동시에 구매하려고 한다.

  • 공유 자원: 신발의 재고 수량 (1개)
  • 스레드: 사용자 A의 구매 요청, 사용자 B의 구매 요청
  1. 사용자 A가 상품 페이지에 들어오고, 구매하기 버튼을 누름
  2. A의 결제 정보가 서버로 전송되는 그 순간에, B도 상품 페이지에 접속
  3. B에게도 서버는 (아직 A의 구매가 최종 완료되지 않았으므로) 재고가 1개 남았다고 알림
  4. B도 즉시 구매하기 버튼을 누름
  5. 서버에서는 두 개의 구매 요청이 거의 동시에 도착
    • A 요청 처리: 재고 확인 -> 1개가 있음 -> 결제 승인 -> 재고를 0으로 변경
    • B 요청 처리: 재고 확인 -> A가 구매하기 직전이라 1개가 있음 -> 결제 승인 -> 재고를 0으로 변경
  • 결과: 두 사용자 모두 결제에 성공했다는 메시지를 받음
    • 그러나, 실제 상품은 1개 뿐이기에 결국 쇼핑몰은 한 명의 고객의 주문을 취소하고 사과해야 함

이처럼 재고 확인재고 차감이라는 두 단계의 작업이 하나의 묶음(원자적 연산)으로 처리되지 않으면, 그 사이를 다른 요청이 비집고 들어와 데이터가 꼬이게 된다.