-
Race Conditions, Deadlocks, Process Starvation프로그래밍 기초 공부 2023. 1. 16. 17:03
Race Condition (경쟁 상태)
두 개 이상의 프로세스가 공통 자원을 병행적으로 읽거나 쓸 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황
두 개의 스레드가 하나의 자원을 놓고 서로 사용하려고 경쟁하는 상황을 말함Critical Section (임계 영역)
- 운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 자원에 접근하는 프로그래밍 코드 부분을 의미
- 프로세스간에 공유자원을 접근하는데 있어서 문제가 발생하지 않도록 공유 자원의 독점을 보장해주어야 하는 영역
임계 영역 문제을 해결하기 위한 3가지 조건
- Mutual Exclusion (상호 배제)
한 프로세스가 자신의 임계 영역이면 다른 프로세스들은 임계영역에 진입할 수 없음 - Progress (진행)
아무도 임계 영역에 있지 않다면, 진입하고자 하는 프로세스를 진입하게 해줘야 함
임계영역에 아무도 진입하지 못하면 안되며 다음에 어떤 프로세스가 임계 영역에 진입해야 하는지는 유한한 시간에 결정되어야 함 - Bounded Waiting (유한 대기)
프로세스가 임계영역에 집입하기 위해 무한정으로 기다리는 현상이 발생해서는 안됨
Race Condition 해결방안
Semaphore
- 공유된 자원의 데이터를 여러 프로세스가 접근하는 것을 막는 것
- 리소스의 상태를 나타내는 간단한 카운터
- 일반적으로 비교적 긴 시간을 확보하는 리소스에 대해 이용하게 되며, 운영체제의 리소스를 경쟁적으로 사용하는 다중 프로세스에서 행동을 조정하거나 동기화 시키는 기술
- 하나의 스레드만 들어가게 할 수도 있고 여러 개의 스레드가 들어가게 할 수 있음
- Mutex와의 차이점
Mutex
- 공유된 자원의 데이터를 여러 스레드가 접근하는 것을 막는 방법
- 임계 영역을 가진 쓰레드들의 Running time이 서로 겹치지 않게 각각 단독으로 실행되게 하는 기술
- 다중 프로세스들이 공유 리소스에 대한 접근을 조율하기 위해 locking과 unloking을 사용
- 상호배제를 함으로써 두 쓰레드가 동시에 사용할 수 없다는 것
Deadlock
- 상호 배제를 시행하면 추가적인 제어 문제가 발생
- 프로세스가 각자 프로그램을 실행하기 위해 두 자원 모두에 엑세스 해야 한다고 가정할 때 프로세스는 두 자원 모두를 필요로 하므로 필요한 두 리소스를 사용하여 프로그램을 수행할 때까지 이미 소유한 리소스를 해제하지 않음
- 이러한 상황에서 두 프로세스는 교착 상태에 빠지게 됨
Deadlock 발생조건
1. Mutual exclusion (상호 배제)
- 매 순간 하나의 프로세스만이 자원을 사용할 수 있음
2. Hold and wait (보유 대기)
- 자원을 가진 프로세스가 다른 자원을 기다릴 때, 보유하고 있는 자원을 놓지 않고 계속 가지고 있음
3. No preemption (비선점)
- 프로세스는 OS에 의해 강제로 자원을 빼앗기지 않음
4. Circular wait (순환 대기)
- 자원을 기다리는 프로세스 간에 사이클이 형성되어야 함
교착 상태 예방
교착 상태 발생 조건 중 하나를 제거하면서 해결
- 상호배제 부정 : 여러 프로세스가 공유 자원 사용
- 점유대기 부정 : 프로세스 실행전 모든 자원을 할당
- 비선점 부정 : 자원 점유 중인 프로세스가 다른 자원을 요구할 때 가진 자원 반납
- 순환대기 부정 : 자원에 고유번호 할당 후 순서대로 자원 요구
-> 자원 낭비가 시함
교착 상태 회피
교착 상태 발생 시 피해나가는 방법
은행원 알고리즘(Banker's Algorithm)
- 은행에서 모든 고객의 요구가 충족되도록 현금을 할당하는데서 유래
- 프로세스가 자원을 요구할 때, 시스템은 자원을 할당한 후에도 안정 상태로 남아있게 되는지 사전에 검사
- 교착 상태 회피
- 안정 상태면 자원 할당, 아니면 다른 프로세스들이 자원 해지까지 대기
교착 상태를 탐지 및 회복
교착 상태가 되도록 허용한 다음 회복시키는 방법
탐지
- 자원 할당 그래프를 통해 교착 상태를 탐지함
- 자원 요청 시, 탐지 알고리즘을 실행시켜 그에 대한 오버헤드 발생함
회복
교착 상태 일으킨 프로세스를 종료하거나, 할당된 자원을 해제시켜 회복시키는 방법
프로세스 종료 방법
- 교착 상태의 프로세스를 모두 중지
- 교착 상태가 제거될 때까지 하나씩 프로세스 중지
자원 선점 방법
- 교착 상태의 프로세스가 점유하고 있는 자원을 선점해 다른 프로세스에게 할당
- 해당 프로세스 일시정지 시킴
- 우선 순위가 낮은 프로세스나 수행 횟수 적은 프로세스 위주로 프로세스 자원 선점
Starvation
- 프로세스들이 더 이상 진행을 하지 못하고 영구적으로 블록되어 있는 상태
- 시스템 자원에 대한 경쟁 도중에 발생할 수 있고 프로세스 간의 통신 과정에도 발생할 수 있는 문제
- 프로세스의 우선순위가 낮아서 필요한 자원을 결코 할당받지 못하고 계속 기다리고 있음
Starvation 해결방안
우선순위 변경
- 프로세스 우선순위를 수시로 변경해서 각 프로세스가 높은 우선순위를 가질 기회를 줌
- 오래 기다린 프로세스의 우선순위를 높여줌
- 우선순위가 아닌 요청 순서대로 처리하는 FIFO 기반 요청 큐를 사용
'프로그래밍 기초 공부' 카테고리의 다른 글
iBatis와 MyBatis (0) 2023.01.24 애자일과 워터폴 (0) 2023.01.19 그래프와 트리 (0) 2023.01.10 slf4j란? (0) 2023.01.10 정규화란? (0) 2023.01.03