일문일답/OS
[일문일답][OS] Race Condition
HGLee--
2022. 9. 6. 20:45
Race Condition(경쟁 상태)
- 여러 스레드 or 프로세스가 한정된 공유 자원에 동시에 접근하는 경우
- 경쟁 상태는 데이터의 불일치 문제를 야기할 수 있다.
- 경쟁 상태를 다루기 위해서는 동기화되어야 한다.
- 경쟁 상태의 예시
- A와 B가 하나의 계좌에 동시에 접근해서 돈을 인출하는 경우
- 스레드 1과 스레드 2가 변수 x의 값을 동시에 다른 값으로 바꾸는 경우
OS에서 Race Condition이 일어나는 경우
→ 주로, user mode일 때보다(일반 프로세스가 cpu를 잡고 사용할 경우) 커널 모드일 때 race condition이 일어난다.
→ 프로세스 간에는 주소 공간이 독립적이지만 커널 모드에서는, 커널에 있는 자원을 여러 프로세스가 공유할 수 있기 때문
1. Process가 system call을 해서 kernel mode로 수행중인데 context switch가 일어나는 경우
위의 그림의 경우를 보자.
프로세스 A가 커널 모드로 작업을 수행하면서, count 변수의 값을 읽어오고 증가시키려고 하는 와중에 context switch가 발생하였다. 프로세스 B도 마찬가지로 count 변수의 값을 변경하게 된다.
이 때, 프로세스 B에 의해 변경된 count의 값은 반영되지 않는다. 그 이유는 이미 커널에서는 프로세스 A의 작업을 할 때 변경되기 이전 count 값을 가져온 상태이기 때문이다.
(참고 : 컴퓨터에서의 연산은 메모리에 있는 값을 레지스터로 옮겨 계산하고 다시 레지스터로 저장하는 방식으로 이루어진다.)
해결 방안
→ 커널모드에서 수행중일 때는 CPU를 뺏지 않는다. → 커널 모드에서 user 모드로 바뀔 때 CPU를 빼앗는다.
2. 커널 모드로 작업 중 인터럽트가 발생한 경우
해결 방안
→ 커널에서 공유 변수에 접근하고 있을 때에는, 인터럽트를 받지 아니함
3. multiprocessor에서, 커널에 있는 shared memory에 접근할 때
- multiprocessor = cpu가 여러개
- 2번 방법에서 사용한 disable interrupt로 해결되지 않음
해결방안
→ 한번에 하나의 CPU만이 커널에 접근할 수 있도록 함
→ 커널 내부에 있는 공유 데이터에 접근할 때마다 lock/unlock을 하는 방법