CS/운영체제

경쟁 상태(Race condition)의 간단한 예시

alpacadabra 2022. 8. 25. 15:17

 

전역 변수 count = 5에 대하여 각각의 스레드가 count++, count--를 한 번씩 수행하도록 했다.

그렇다면 두 스레드가 모두 Join되었을 때 count는 5를 그대로 유지하고 있을까?

...

만약 그렇다고 생각했다면 아래의 설명을 읽어보자.

 


 

count++는 Low level에서 아래와 같이 동작한다.

 

공룡책

 

그래서 count++를 수행하는 도중에도, 드물긴 하지만 Preemptive 스케쥴러에 의해 Context switch가 발생할 수 있고 이는 count의 일관성을 해치는 결과를 낳는다.

아래는 그 과정이다.

 

공룡책

 

스레드 1에서 count++를 수행하던 도중 Context switch가 발생한 경우다.

원래대로라면 스레드 2는 count = 6을 레지스터로 가져와 연산을 진행했어야 하는데, 문제는 count가 채 갱신되기도 전에 Context switch가 발생하여 그러지 못했다는 것이다.

그래서 스레드 2는 원치 않던 타이밍에 계산을 하게 되었고, count 또한 원치 않던 값인 4가 되고 말았다.

 

만약 작업이 다른 순서로 수행되었다면 count는 5가 되었을 수도 있다. 아니면 6이 되었을 수도 있고...

이렇듯 여러 프로세스나 스레드가 공유 자원을 동시에 사용할 때, 그 순서에 의해 결과값이 달라질 수 있는 상태를 경쟁 상태(Race condition)라고 한다.