임계영역(Critical Section)
임계영역(Critical Section)이란 여러 프로세스 또는 스레드가 동시에 자원에 접근할 경우 문제가 발생할 수 있는 코드 영역을 말합니다.
임계영역에서는 아래 3가지 조건을 만족해야 교착상태를 피할 수 있습니다
- 상호 배제(Mutual Exclusion)
하나의 프로세스가 임계영역에 있다면, 다른 프로세스는 들어갈 수 없다.
- 진행(Progress)
임계영역에 아무도 없는 상태라면, 진입을 요청하는 프로세스 중 어느 것이 들어갈지를 적절히 결정해주어야 한다.
- 한정 대기(Bounded Waiting)
한 프로세스가 계속해서 임계영역에 들어가지 못하는 일이 없도록 보장해야 합니다.
뮤텍스(Mutex)
뮤텍스(Mutual Exclusion Object)는 임계영역에 대한 접근을 제어하는 락(Lock)입니다.
- 하나의 스레드만 락을 획득할 수 있으며, 락을 획득한 스레드만 해제할 수 있습니다.
- 락을 통해 동시성 제어를 하며, 동시에 하나의 스레드만 접근 가능하도록 만듭니다.
세마포어(Semaphore)
세마포어는 뮤텍스보다 유연한 동기화 도구입니다. 자원의 동시 접근 가능 개수를 제어할 수 있습니다.
- counting semaphore: 0 이상의 값을 가질 수 있음 → 동시에 여러 스레드 접근 가능
- binary semaphore: 0 또는 1만 가짐 → 뮤텍스처럼 동작하지만 역시나 제어권은 스레드에 있다.
특징
- 세마포어는 다른 스레드가 signal로 값을 증가시킬 수 있음
- wait() → 자원 접근 대기
signal() → 자원 해제 및 다른 프로세스에 접근 허용
교착상태(Deadlock)
교착상태란 여러 프로세스가 서로가 가진 자원을 기다리며 무한 대기에 빠지는 상태입니다.
교착 상태 발생 조건 (점순이 비상ㅋ)
- 상호 배제(Mutual Exclusion)
자원은 한 번에 하나의 프로세스만 사용할 수 있어야 함
- 점유와 대기(Hold and Wait)
자원을 가진 상태에서 다른 자원을 기다리는 상태
- 비선점(No Preemption)
자원을 강제로 빼앗을 수 없음
- 원형 대기(Circular Wait)
프로세스 간 자원 요청이 원형 구조를 이룸
교착 상태 해결 방법
- 예방(Prevention)
위 조건 중 하나를 사전에 제거하여 발생 자체를 막음
- 회피(Avoidance)
대표 알고리즘: 은행가 알고리즘(Banker's Algorithm)
시스템 상태를 계속 평가하여 안전한 경우에만 자원 할당
- 발생 후 회복(Recovery)
교착상태가 감지되면
→ 프로세스를 종료하거나 자원을 강제로 회수
댓글 영역