- 임계영역(Critical Section)
다수의 프로세스가 접근 가능한 영역이면서 한 순간에 하나의 프로세스만 사용할 수 있는 영역
어떤 프로세스가 임계영역에 들어가면 다른 프로세스는 임계영역으로의 진입이 금지되어야 한다
프로세스/스레드 동기화를 함으로써 임계구역 문제를 해결하고 프로세스 실행 순서를 제어할 수 있다
임계영역 문제 해결책
상호배제(Mutual Exclusion): 한 프로세스가 임계영역에서 작업시 다른 프로세스는 접근 불가능
진행(Progress): 임계영역에서 작업하는 프로세스가 없을 때 여러 프로세스가 임계영역에 진입하고자 한다면 알고리즘에 따라 프로세스 선정, 프로세스 선택을 무한정 미룰 수 없다
제한된 대기(Bounded Waiting): 한 프로세스가 임계영역 진입을 요청한 후 수락되기 전까지 다른 프로세스가 진입할 수 있는 횟수를 제한
동기화 도구: 세마포어, 모니터
- 세마포어(Semaphore)
- 다익스트라가 제안
- 구조: 정수형 변수 + 두 개의 동작(P, V)
- 세마포어란 음이 아닌 정수값을 가지는 플래그 변수
- 임계영역에 들어가기전에 P: acquire() 하고
- 임계영역으로부터 나올 때 V: release() 한다
- P와 V를 다음과 같이 정의한다
1
2
3- P(S): while S <= 0 do no-op; // 세마포어 변수 S가 0이면 임계구역 진입 불가
S = S - 1; // 세마포어 변수 S가 1이면 진입하여 0으로 만든 후 다른 프로세스 진입 못 하게 블락
- V(S): S = S + 1; // 작업을 완료하고 나올 때 1을 더해줘 다른 프로세스가 진입 가능하게 만듬
- 모니터(Monitor)
- 세마포어보다 고수준의 개념
- 구조: 공유자원 + 공유자원 접근 함수
- 2개의 queues: 배타동기 + 조건동기
- 교착상태(Deadlock)
- 교착상태의 필요조건: 상호배타(Mutual Exclusion), 보유 및 대기(Hold and Wait), 비선점(No Preemption), 환형대기(Circular Wait)
- 교착상태의 처리: 방지, 회피, 검출 및 복구, 무시
- 실제 상황에서 교착상태는 잘 일어나지 않는다