컴퓨터과학/운영체제

[운영체제] 동기화(Synchronization), 경쟁 상태(Race Condition)

PureStack 2021. 11. 29. 00:01

Race Condition

프로세스들이나 스레드들이 공유 자원에 대해 경쟁 상태에 있는 것을 의미한다. 다시 말해서, 여러 프로세스들과 스레드들이 공유 자원에 동시에 접근할 때, 접근 타이밍과 순서가 얽혀서 의도한 결과가 달라지는 데이터 일관성을 해칠 수 있는 상태에 이르게 될 수 있다.

예를 들어, 5의 값을 가지고 있는 공유 자원인 count가 있고, 이 자원에 동시에 접근하는 스레드 A, B가 있다. 여기서 A는 count++를 수행하고, B는 count--를 수행한다.

스레드 A는 내부적으로 이러한 작업을 수행한다.

register1 = count
register1 = register1 + 1
count = register1




한편, 스레드 B는 내부적으로 이러한 작업을 수행한다.

register2 = count
register2 = register2 - 1
count = register2



두 프로세스의 작업이 서로 조금씩 나누어 수행되면, 데이터 불일치를 초래할 수 있다.
스레드 A: register1 = count {register1 = 5}
스레드 A: register1 = register1 + 1 {register1 = 6}
스레드 B: register2 = count {register2 = 5}
스레드 B: register2 = register2 - 1 {register2 = 4}
스레드 A: count = register1 {count = 6}
스레드 B: count = register2 {count = 4}


마지막에 실행된 문장이 무엇이냐에 따라 count 값는 4 또는 6이 될 수도 있다. 이처럼, 스레드 A와 스레드 B가 공유 자원에 접근하기 위해 서로 경쟁상태에 있는 것을 race condition이라 한다. 이런 경우에 동기화를 이용해야 하는데, 이는 여러 프로세스나 스레드의 순서를 정해서 여러 개의 프로세스, 스레드가 동시에 접근하는 것을 방지하여 데이터의 일관성을 유지시켜주는 기법이다.