레이스 컨디션
- 여러 프로세스나 스레드가 공유 자원에 동시에 접근할 때 발생하는 문제
- 접근 순서에 따라 결과가 달라질 수 있는 상황
세마포어
- 동시에 여러 스레드가 접근할 수 있는 자원의 수를 제한
동작방식
- 세마포어는 자원에 접근할 수 있는 허가된 "카운트"를 가지며, 이 카운트가 0이 되면 더 이상 접근이 불가능
- 자원에 접근하기 위해 P() 또는 wait() 연산을 수행하여 카운트를 1 감소시키고, 작업을 마친 후 V() 또는 signal() 연산을 통해 카운트를 1 증가
종류
- 이진 세마포어(Binary Semaphore): 카운트가 0 또는 1만 가지며, 자원에 한 번에 하나의 스레드만 접근(뮤텍스처럼 동작)
- 계수기 세마포어(Counting Semaphore): 특정 자원에 여러 개의 접근을 허용할 수 있는 세마포어로, 자원의 허용 가능한 최대 접근 수를 나타내는 초기값을 가짐
뮤텍스
- 한 번에 하나의 스레드만 자원에 접근할 수 있도록 상호 배제를 보장하는 도구
동작방식
- 잠금(Lock) 개념을 사용하여 자원 접근을 관리
- 스레드가 자원에 접근할 때 뮤텍스를 잠그고, 작업이 끝나면 뮤텍스를 해제
- 뮤텍스가 잠겨 있으면 대기
데드락
- 여러 스레드나 프로세스가 서로의 자원을 기다리며 무한히 대기하는 상태
- ex: 스레드 A는 자원 X를 잠그고 자원 Y를 기다리는 동안, 스레드 B는 자원 Y를 잠그고 자원 X를 기다린다면 두 스레드는 영원히 대기
데드락을 발생시키는 접근 제한 조건
- 상호 배제(Mutual Exclusion): 자원은 한 번에 한 프로세스만 접근
- 점유 대기(Hold and Wait): 자원을 점유한 프로세스가 추가로 다른 자원을 기다림
- 비선점(No Preemption): 다른 프로세스가 자원을 강제로 빼앗을 수 없음
- 순환 대기(Circular Wait): 프로세스들이 자원을 기다리는 관계가 순환 구조
데드락 해결방법
- 데드락 예방
- 접근 제한 조건중 하나라도 사용하지 않으면 됨
- 데드락 회피
- 은행가 알고리즘(Banker's Algorithm): 자원 요청 시 현재 시스템 상태를 확인하고, 데드락 상태가 발생하지 않는 경우에만 자원을 할당
- 데드락 검출과 회복
- 검출: 주기적으로 자원 할당 그래프를 검사하여 데드락 상태를 감지
- 회복: 데드락 상태가 감지되면 일부 프로세스를 종료하거나 자원을 회수하여 데드락을 해소
- 타임아웃 설정
- 특정 자원을 일정 시간 동안 얻지 못하면 요청을 취소하고 자원을 재요청