경쟁 상태(Race Condition)란
- 공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과 값에 영향을 줄 수 있는 상태를 의미한다.
- 공유 자원에 여러 프로세스가 동시에 접근할 때 자료의 일관성을 해치는 결과가 나타날 수 있다.
- 공유 메모리를 쓰는 프로세스끼리는 경쟁상태가 발생할 수 있는데, 이에 대한 해결책이 동기화다.
- 경쟁 상태가 발생하는 경우
Producer-Consumer 상황을 예시로 들어보겠다.
Producer는 공유 메모리에 데이터를 쓰는 쓰레드고, Consumer는 공유 메모리에서 데이터를 가져가는 쓰레드다
int counter = 0;
item nextProduced;
item nextConsumed;
//Producer thread
while(TRUE){
while(counter == BUFFER_SIZE);
buffer[in] = nextProduced;
in = (in + 1) % BUFFER_SIZE;
counter++;
}
//Consumer thread
while(TRUE){
while(counter == 0);
nextConsumed = buffer[out];
out = (out + 1) % BUFFER_SIZE;
counter--;
}
counter++; //Rroducer thread
counter--; //Consumer thread
counter = 3 ?? // counter의 값이 3이 맞을까??
항상 3임을 보장받을 수 없다. counter++, counter--는 3가지 assembly code로 이루어져
있다. 단계는 아래와 같다.
//counter++
register1 = counter // load from memory
register1 = register +1;
counter = register1; // store in memory
//counter--
register2 = counter //load from memory
register2 = register -1;
counter = register2 // store in memory
차례대로 실행되는 과정을 자세히 풀어보겠다.
- TO : producer execute register1 = counter {register1 = 3}
- T1 : producer execute register1 = register1+1 {register1 = 4}
- T2 : producer execute counter = register1 {counter = 4}
- T3 : consumer execute register2 = counter {register2 = 4}
- T4 : consumer execute register2 = register2-1 {register2 = 3}
- T5 : consumer execute counter = register2 {counter = 3}
counter의 값이 3이 되는 경우는 T0~T5가 순서대로 실행될 때다. 하지만 producer와 consumer는 서로 다른 쓰레드다. 만약에 context switch가 발생한다면 어떻게 될까
- TO : producer execute register1 = counter {register1 = 3}
- T1 : producer execute register1 = register1+1 {register1 = 4}
- context switch P1 -> P2
- T2 : consumer execute register2 = counter {register2 = 3}
- T3 : consumer execute register2 = register2-1 {register2 = 2}
- context switch P2 -> P1
- T4 : producer execute counter = register1 {counter = 4}
- context switch P1 -> P2
- T5 : consumer execute counter = register2 {counter = 2}
counter의 최종값은 2가 되었다. 이렇게 실행 순서에 따라 순서가 달라지는 현상을 경쟁 상태라고 한다. 경쟁상태의 근본적인 원인은 메모리 공유이다.
이에 대한 해결방안은 동기화이다.
🙇 참고 사이트 🙇
https://daily-progress.tistory.com/65 https://charles098.tistory.com/88