임계구역(Critical section)은 여러 프로세스나 스레드가 동시에 접근하면 경쟁조건(race condition) 이 발생할 수 있는 공유 자원(변수, 파일, 데이터 등)에 접근하는 코드 영역을 의미한다. 예를 들어 두 개의 프로세스가 은행 계좌 잔고를 동시에 수정하려 하면, 정상적으로 동작하지 않거나 값이 꼬일 수 있다.
임계구역 문제를 해결하기 위해서는 동기화(synchronization) 가 필요하다. 그 이유는 여러 프로세스가 순서를 지키지 않고 임계 구역에 진입하면 실행 결과가 예측할 수 없게 바뀌기 때문이다.
동기화가 필요한 이유는, 여러 실행 흐름이 동시에 같은 자원에 접근하면 경쟁 조건(Race Condition)이 발생해서 결과가 예측할 수 없게 되기 때문입니다. 동기화는 이런 문제를 막아줍니다.
임계구역 문제를 올바르게 해결하려면 아래 세 가지 조건을 반드시 만족해야 한다.
뮤텍스는 Mutual Exclusion(상호배제)의 줄임말로, 임계 구역에 한 번에 하나의 프로세스(스레드)만 들어가도록 lock/unlock 기법을 제공하는 동기화 도구다. lock을 소유한 프로세스만 임계구역 사용 권한이 있다. 작업이 끝나면 반드시 unlock하여 다른 프로세스가 들어올 수 있게 한다.
세마포어는 카운팅 가능한 동기화 객체로, 일정 개수의 자원을 여러 프로세스가 공유해야 할 때 사용한다. 대표적으로 wait(P 연산), signal(V 연산) 두 가지 기본 연산을 지원한다. wait는 자원을 요청하는 연산, signal은 자원을 반납하는 연산이다. 세마포어는 이진 세마포어(Binary Semaphore, 값이 0 또는 1)와 일반 세마포어(Counting Semaphore, 0 이상 정수)로 나뉜다.
모니터는 한 번에 하나의 프로세스만 임계구역 코드를 실행할 수 있도록 언어(자바의 synchronized 블록 등) 또는 운영체제 수준에서 lock과 조건변수를 제공한다. 즉, 뮤텍스 + 조건 변수의 조합. lock 관리가 자동으로 이루어져 코드가 간결해지고 디버깅이 쉬워진다. 단점은 성능 오버헤드가 발생할 수 있다.
Deadlock은 둘 이상의 프로세스가 서로 자원을 점유한 채, 상대방의 자원이 해제되기를 무한히 기다리는 상태다. 데드락의 4가지 발생 조건은 다음과 같다.
4가지 조건이 동시에 성립하면 데드락이 발생한다.
데드락을 해결하거나 예방하는 대표적인 방법.
참고로 데드락의 발생 조건 중 일부만 달성된 상태를 "데드락이 예방된 상태" 또는 "데드락 발생 가능성이 없는 상태" 라고 부른다
간단하게 정리해주셔서 보기 쉬웠어요!