Concurrency
Concurrency
Concurrency
Race Condition
공유 자원에 대해 여러 프로세스가 동시에 접근 할 경우 각 결과 값에 영향을 줄 수 있는 상태 (multi-thread 환경에서도 time-safety 한가?)
→ 동시 접근의 치명적인 문제점
어떻게 해결하지?
핵심은 동기화
- Race condition의 가능성이 있는 구역을 임계 구역(Critical Section)
- 그리고 그곳에 한 프로세스만 접근이 가능한 것을 상호 배제(Mutually exclusive)
이러한 방식에 있어서 아래와 같은 DeadLock이 발생한다…
DeadLock
두개 이상의 프로레스가 서로 무한히 다음 자원을 기다리게 되는 상태
언제 발생하는가?
- 멀티 프로그래밍 환경에서 서로 경쟁하는 상황
- 서로
wait
상태로 상대의 자원이 끝나기를 기다린다. → 교착 상태
DeadLock 발생 조건
- 상호 배제
- 자원은 한번에 하나의 프로세스만 사용 가능
- 점유 대기
- 최소한 하나의 자원을 점유하고 있으면서 대기하는 방식
- 비선점
- 다른 프로세스에 할당 된 자원은 끝날떄 까지 강제로 뺏지 못한다.
- 순환 대기
- 프로세스들이 서로 순환 형태로 자원을 대기하고 있어야한다.
위 4가지들이 모두 성립 해야 DeadLock 이라고 볼 수 있다.
DeadLock 처리
- 상호 배제 부정
- 여러 프로세스가 여러개의 자원을 사용하게 한다.
- 점유 대기 부정
- 프로세스는 실행전에 모든 자원을 할당하고 실행함
- 비 선점 부정
- 자신의 자원을 반납 하고 다른 프로레스에 자원을 요청 할 수 있음
- 순환 대기 부정
- 자원에 고유번호를 할당 하고 순서대로 요구
이 방식은 매우 자원 낭비가 심하다…
DeadLock 회피
- 은행원 알고리즘
- 프로세스가 자원을 할당 할때 얘한테 할당 한 뒤에도 시스템이 안전 상태로 남아있는지 검사
- 자원 할당 그래프 알고리즘
- 자원 - 프로세스를 요청 간선과 할당 간선으로 적용 하여 교착상태를 회피
- 자원 요구시에 요청 간선을 할당 간선으로 변경해 사이클 파악
매우 큰 오버헤드를 가지고 있음…
교착 상태를 탐지 & 회복 & 무시
- 탐지
- 자원 할당 그래프로 탐지 → 오버헤드 유발
- 교착 상태의 프로세스를 모두 중지 하거나
- 제거 될 때 까지 하나씩 중지
- 자원 할당 그래프로 탐지 → 오버헤드 유발
- 회복
- 교착 상태를 일으킨 프로세스를 종료
- 자원 선점방법
- 교착 상태가 종료 될 때까지 점유한 자원을 선점해 다른 프로세스에게 할당
- 무시
- 윈도우는 교착 상태 탐지 비용 > 교착상태 손해 비용 이라고 판단
- 그냥 무시한다…
Semaphore & Mutex
- 임계영역에 접근을 막기 위해 허락된 프로세스만 들어갈 수 있게 만든 것
Mutex
- 임계영역에 프로세스나 스레드들이 하나만 접근하게 제어하는 기술
lock
: 임계 구역에 들어가 다른 프로세스/ 스레드의 접근을 막음unlock
: 현재 임계 구역을 모두 사용했음 → 다른 얘들도 접근이 가능
Semaphore
- 하나 이상의 프로레스 / 스레드를 임계영역에 받아들임 (S)
- 세마 포어 (P, V) 연산
- P: 임계 영역에 들어가기 전에 프로세스 진입 여부를 (S)를 통해 결정
- V: 나올 때 반납하면서 수행
- 스레드간의 실행 순서를 정할 수 있음
- S =1 일때 하나의 프로세스가 들어간다.
- 해당 프로세스가 내부에서 S = 2로 증가시킨다.
- 대기 큐에 있던 프로세스가 들어간다.
- 정리 완료!
- 뮤텍스는 외부에서
unlock
할 수 없지만 세마포어는 외부에서도 S의 제어가 가능하다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.