CS/Operating System
[Operating System] Race Condition(경쟁 상태)
hanseongbugi
2024. 4. 8. 17:47
Race Condition?
- 공유 자원에 대해 여러 프로세스가 동시에 접근할 때, 결과 값에 영향을 줄 수 있는 상태
- 자원 동시 접근 시 자료의 일관성을 해치는 결과가 나타남
- 공유 메모리를 사용하는 프로세스간에는 경쟁 상태가 발생할 수 있으며 이에 대한 해결책은 동기화다
Race Condition 발생하는 경우
- 커널 작업 수행 중 인터럽트 발생
- 커널 모드에서 데이터를 로드하여 작업을 수행하다 인터럽트가 발생하여 같은 데이터를 조작하는 경우
- 해결법 : 커널모드에서 작업을 수행하는 동안, 인터럽트를 disable 시켜 CPU 제어권을 가져가지 못하도록 한다.
- 프로세스가 시스템 콜을 통해 커널모드로 진입하여 작업을 수행하는 중 문맥 교환이 발생하였을 때
- 프로세스1이 커널모드에서 데이터를 조작하는 도중, 시간이 초과되어 CPU 제어권이 프로세스2로 넘어가 같은 데이터를 조작하는 경우
- 프로세스2가 진행한 작업이 데이터에 반영되지 않는 경우
- 해결법 : 프로세스가 커널모드에서 작업을 하는 경우 시간이 초과되어도 CPU 제어권이 다른 프로세스에게 넘어가지 않도록 함
- 멀티 프로세서 환경에서 공유 메모리 내의 커널 데이터에 접근할 때
- 멀티 프로세서 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우
- 해결법 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다, 그 데이터에 대한 lock/unlock을 하는 방법
Race Condition 예시
- Producer-Consumer가 있을 때 Producer는 공유 메모리에 데이터를 쓰는 스레드이고, Consumer는 공유 메모리에서 데이터를 가져오는 스레드인 경우
int counter = 0; // 전역 변수
item nextProduced;
item nextConsumed;
// Producer thread
while(true){
while(conter == 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 변수에서 race condition이 발생할 수 있다.
- counter 변수가 의도한 값과 다를 수 있다.
- 메모리 공유에 의해 문제가 발생
Race Condition 해결 방법 (동기화)
- 경쟁 상태는 메모리 공유에 의해 발생하므로 동기화를 통해 해결 할 수 있음
- 동기화란 스레드의 순차적인 실행을 보장하는 것
- 공유 변수가 존재하는 공간을 임계 구역(Critical Section)이라고 하며, 임계 구역에 하나의 스레드만 접근할 수 있는 것을 상호 배제라고 한다.
임계 구역(Critical Section)
- 임계 구역은 특별한 공간이 아닌 코드의 일부분을 의미
- 경쟁 상태가 발생할 수 있는 코드의 조각을 임계 구역이라고 부른다.
- 스레드 또는 프로세스간 공유하고 있는 변수가 있는 코드 조각
- 임계 구역에서 경쟁 상태가 발생하는 것을 임계 구역 문제(Critical Section Problem)이라고 함
- 임계 구역은 3가지 조건을 만족해야 함
- 상호 배제(Mutual Exclusion) : 하나의 자원에는 하나의 프로세스만 접근할 수 있다.
- 진행(Progress) : 임계 구역이 비어있는 경우 자원을 사용할 수 있어야 한다.
- 한계 대기(Bounded Waiting) : 기다리면 언젠가 임계 구역에 진입할 수 있어야한다.
출처
https://charles098.tistory.com/88
https://github.com/gyoogle/tech-interview-for-developer