정의
경쟁상태(Race Condition)는 프로세스나 스레드가 데이터에 어떤 순서로 접근하냐에 따라 결과값이 달라질 수 있는 상태를 말한다. 버그를 초래할 수 있으므로 동기화를 통해 경쟁상태를 해결해야 한다.
경쟁상태 해결을 위한 조건
- 상호배제(Mutual Exclusion)
프로세스나 스레드가 임계영역(Critical Section)에 접근한 상태라면 다른 프로세스나 스레드는 임계영역에 접근할 수 없어야 한다는 조건 - 진행(Progress)
임계영역에 접근해있는 프로세스나 스레드가 없고 임계영역 밖에서 대기하고 있는 프로세스나 스레드가 있다면 순서에 맞는 프로세스나 스레드가 임계영역에 접근할 수 있도록 선택한다는 조건 - 한정대기(Bounded Waiting)
임계구역에 접근하기만을 기다리는 기아(Starvation)를 방지하기 위해 한번 임계구역에 접근한 스레드나 프로세스는 다시 임계구역에 접근할 때 제한을 두는 조건
경쟁상태를 해결하기 위한 알고리즘
뮤텍스(Mutex)
- Mutual Exclusion의 준말로 상호배제를 뜻한다.
- Mutex에서는 Lock과 Unlock을 사용하여 임계영역에 접근하는 프로세스나 스레드의 갯수를 1개로 제한하여 경쟁상태를 해소하는 알고리즘이다.
- 공유 자원을 점유하고 있는 대상이 Lock을 할 수 있는 권한을 가지고 Lock을 수행해 다른 프로세스나 스레드를 임계영역에 접근하지 못하게 만든다. 대기중인 프로세스와 스레드는 공유자원을 접근중인 프로세스나 스레드가 Unlock을 수행하면 공유자원에 접근이 가능하다.
세마포어(Semaphore)
- 뮤텍스와 가장 두드러지는 차이점은 동기화 대상의 갯수이다.
- 뮤텍스는 임계영역에 한번에 오직 1개의 프로세스나 스레드만이 접근할 수 있지만 세마포어는 접근 가능한 프로세스나 스레드의 갯수를 지정할 수 있다.
- 세마포어의 구조
semInit: 세마포어를 음수가 아닌 값으로 초기화 한다.
semWait: 세마포어 값을 감소시킨다/세마포어 값이 음수일 경우 호출한 프로세스나 스레드는 대기시킨다.
semSignal: 세마포어 값을 증가시킨다/세마포어 값이 음수가 아닐 경우 semWait 연산에 의해 대기중인 프로세스나 스레드를 준비시킨다.
'IT 지식' 카테고리의 다른 글
데이터베이스 정규화(Normalization)란? (0) | 2021.12.16 |
---|---|
프로세스(Process)와 스레드(Thread)의 차이 (0) | 2021.12.13 |
HTTP와 HTTPS의 차이 (0) | 2021.12.10 |