다수의 프로세스(스레드)가 공용 자원에 동시에 접근할 때, 접근 순서에 따라 결과값이 달라질 수 있는 상태
예를 들어 커플이 동시에 다른 ATM에서 커플통장의 돈을 뽑는 경우, 남자가 돈을 뽑는 과정을 수행하는 도중 interrupt가 걸려 여자가 돈을 뽑는 과정이 수행되면 여자의 돈 뽑는 과정이 반영되지 않은 채 남자가 돈뽑는 과정이 수행된다.
-> 공유 자원을 접근 할 때 순서를 조절하여 비정상적인 상태를 예방해야 한다!(동기화)
(위의 예제와 같은 경우 디버깅 시에는 문제점이 전혀 보이지 않기 때문에 에러를 찾기가 매우 어려움! 따라서 동기화 문제를 고려하여 설계를 하는 것이 매우 중요!)
Race Condition이 발생하는 경우
커널 작업을 수행하는 중에 인터럽트가 발생하는 경우
커널모드에서 데이터를 로드하여 작업을 수행하다가 인터럽트가 발생하여 같은 데이터를 조작하는 경우
해결법 : 커널모드에서 작업을 수행하는 동안 인터럽트를 disable 시켜 CPU 제어권을 가져가지 못하게 한다.
프로세스가 'System Call'을 하여 커널 모드로 진입하여 작업을 수행하는 도중 문맥 교환이 발생할 때
프로세스1이 커널모드에서 데이터를 조작하는 도중, 시간이 초과되어 CPU 제어권이 프로세스2로 넘어가 같은 데이터를 조작하는 경우 (프로세스2가 작업에 반영되지 않음)(위의 예제같은 경우)
해결법 : 프로세스가 커널모드에서 작업을 하는 경우 시간이 초과되어도 CPU 제어권이 다른 프로세스에게 넘어가지 않도록 함
멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
멀티 프로세서 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우
해결법 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다, 그 데이터에 대한 lock/unlock을 하는 방법
Critical Section(임계 영역)
코드상에서 경쟁조건이 발생할 수 있는 특정 부분(각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분)
Critiacl Section 문제를 해결하기 위해서는 다음과 같은 조건을 충족해야 한다.
Mutual Exclution(상호 배제)
이미 한 프로세스가 Critiacl Section에서 작업중일 때 다른 프로세스는 Critical Section에 진입해서는 안된다.
주의! Mutal Exclution을 시행하면 Deadlock으로 인한 Starvation이 발생할 수 있음!!
Progress(진행)
Critical Section에서 작업중인 프로세스가 없다면 다른 프로세스가 Critical Section에 진입할 수 있어야 한다.
Bounded Waiting(한정대기)
Critical Section에 진입하려는 프로세스가 무한하게 대기해서는 안된다.(한번 임계 구역에 들어간 프로세스는 다음번 임계영역에 들어갈 때 제한을 두어야 한다.)(Starvation 방지)
소통해요