레이스 컨디션 (Race Condition)
두 개 이상의 프로세스(Process) 또는 스레드(Thread)가 동시에 공유 자원에 접근하려고 할 때 발생하는 문제로, 접근 순서를 예측할 수 없는 상황에서 발생하기 때문에, 결과 역시 예측할 수 없어 불안정한 프로그램 동작을 초래할 수 있다. 주로 다중 스레딩 환경에서 빈번히 발생하는데, 예를 들어 계좌 잔액을 동시에 업데이트하는 두 스레드가 있는 경우, 레이스 컨디션이 발생하면 잔액이 정확히 반영되지 않는 문제가 생길 수 있다. 이를 방지하기 위해 동기화 기법을 사용하며, 대표적으로 세마포어와 뮤텍스가 있다.
세마포어 (Semaphore)
여러 스레드가 공유 자원에 접근하는 것을 제어하는 동기화 도구로, 주로 특정 리소스를 사용할 수 있는 티켓의 개수를 제한하는 방식으로 동작한다. 즉, 사용 가능한 티켓이 있는 경우에만 스레드가 접근할 수 있게 한다. (공유 자원에 접근하는 스레드의 수를 제한한다.)
예시
공용 프린터가 3대 있다면, 세마포어의 초기값을 3으로 설정하여 최대 3개의 스레드가 동시에 프린터를 사용할 수 있게 만든다.
뮤텍스 (Mutex)
상호 배제를 의미하며, 공유 자원에 대한 접근을 단 하나의 스레드로 제한한다. 뮤텍스는 한 번에 한 스레드만 자원에 접근할 수 있도록 허용하며, 다른 스레드가 접근하려면 현재 자원 사용이 끝날 때까지 대기해야 한다.
예시
단일 계좌의 잔액을 업데이트할 때, 한 스레드가 잔액을 수정하는 동안 다른 스레드는 접근하지 못하고 대기해야 하는 상황에서 뮤텍스를 사용할 수 있다.
데드락 (Deadlock)
두 개 이상의 프로세스가 서로 자원을 얻으려 대기하다가 영원히 멈춰버리는 상태. 예를 들어, 프로세스 A는 자원 1을 소유하고 자원 2가 필요하며, 프로세스 B는 자원 2를 소유하고 자원 1이 필요한 상황에서 발생할 수 있다.
데드락의 발생 조건 4가지
- 상호 배제 (Mutual Exclusion): 자원은 한 번에 하나의 프로세스만 사용할 수 있다.
- 점유 대기 (Hold and Wait): 자원을 점유한 상태에서 다른 자원의 사용을 대기하는 프로세스가 있다.
- 비선점 (No Preemption): 다른 프로세스의 자원을 강제로 뺏을 수 없다.
- 순환 대기 (Circular Wait): 두 개 이상의 프로세스가 자원을 서로 점유하고 대기하는 상태가 순환 구조를 이룬다.
해결 방법
- 예방 (Prevention): 데드락 발생 조건 중 하나를 피하도록 시스템을 설계한다. 예를 들어, 순환 대기를 방지하기 위해 모든 자원을 필요한 시점에 한 번에 할당하도록 하는 방법이 있다.
- 회피 (Avoidance): 자원 할당 시 시스템의 안전 상태 여부를 확인하는 알고리즘(ex. 은행가 알고리즘)을 사용해 데드락을 피한다.
- 탐지 및 복구 (Detection and Recovery): 데드락이 발생했는지 확인하고, 발견되면 프로세스를 강제로 종료하거나 자원을 해제하는 방식으로 데드락을 해소한다.
- 무시: 데드락 발생 확률이 낮다고 판단되면, 데드락 감지 및 해결을 하지 않고 시스템을 운영할 수도 있다.

'CS' 카테고리의 다른 글
레디스 캐싱 전략 (1) | 2024.12.18 |
---|---|
컨텍스트 스위칭? (0) | 2024.11.12 |
프로세스(Process) / 스레드(Thread) ? (0) | 2024.11.08 |
면접 질문 연습하기(2) (1) | 2024.10.25 |
TCP 서버를 공부하기 전에... (2) | 2024.10.17 |