레이스 컨디션

이상민·2024년 11월 8일

CS공부

목록 보기
17/18

레이스 컨디션이란?

Race Condition이란 컴퓨터 시스템, 특히 동시 또는 병렬 컴퓨팅에서 프로그램 또는 시스템의 동작이 스레드 또는 프로세스가 실행되는 순서와 같은 이벤트의 상대적 타이밍에 따라 달라지는 상황을 의미한다. 만약 프로세스 Race Condition에서 둘 이상의 프로세스는 공유 리소스를 놓고 경합(RACE)하면 실행 순서는 예측할 수 없고 바람직하지 않은 결과를 초래할 수 있다.

이러한 레이스 컨디션이 왜 생기는걸까 ?

여러가지 요인이 있는데 Race Condition은 여러 프로세스가 공유 데이터 또는 리소스에 액세스하고 시스템이 해당 리소스에 대한 액세스를 적절하게 제어하거나 동기화하지 않을 때 종종 발생한다. 이로 인해 데이터 손상, 충돌 또는 시스템의 의도하지 않은 동작과 같은 다양한 문제가 발생할 수 있다.

  • 예를 들어 두 개의 스레드를 이용하여 a라는 변수에 11이라는 값을 저장하는 것이 목적이라고 하자.
1. 값이 0이 저장된 변수 a
2. 스레드 A, B
3. 스레드 A는 변수 a를 읽어옴
4. 스레드 B는 변수 a를 읽어옴
5. 스레드 A는 변수 a에 값을 10 더한 값을 저장
6. 스레드 B는 변수 a에 값을 1을 더한 값을 저장

이 과정의 결과는 11이 아닌 1이 들어가게 된다. 이처럼 동시에 공유 자원에 접근함으로서 자원의 일관성을 해치는 결과가 발생하는 것을 레이스 컨디션이라고 한다. 상호 배제 조건을 만들어 동시에 공유 자원에 접근할 수 없도록 할 수도 있으나, 이 조건으로 인해 다른 문제가 발생할 수 있다.

레이스 컨디션 방지방법

뮤택스(Mutex)

뮤택스란 상호 배제를 보장하여, 한 번에 하나의 스레드만 공유 자원에 접근할 수 있도록 하는 방법이다. 뮤택스는 크리티컬 섹션에 잠금을 설정하고, 이 잠금은 해당 스레드가 자원을 사용하는 동안 다른 스레드의 접근을 차단하게 된다.

세마포어(Semaphore)

다른 레이스 컨디션 방지 방법으르논 세마포어가 있다. 세마포어 방법은 여러 스레드가 자원에 접근할 수 있는 최대 개수를 제한할 수 있는데, 예를 들면, 특정 자원을 동시에 최대 3개의 스레드만 사용할 수 있도록 제어할 수 있다.

뮤택스와 세마포어는 모두 공유 자원에 대한 동시 접근을 제어함으로써 동기화 문제를 해결하고 레이스 컨디션을 예방한다.

교착 상태(DeadLock)

하지만 이러한 동기화 문제로 뮤택스나 세마포어를 잘못 사용하면 데드락(Deadlock)이 발생할 수 있다. 데드락은 두 개 이상의 스레드가 서로가 점유하고 있는 자원을 기다리며 영원히 대기하는 상태를 의미하는데 예를 들면,

  • 스레드 A가 자원 X를 잠그고 자원 Y를 기다리고 있으며,
  • 스레드 B가 자원 Y를 잠그고 자원 X를 기다리고 있다면, 두 스레드는 서로의 자원이 해제될 때까지 무한히 대기하는 상황에 빠지게 된다.

데드락 방지 및 해결

이러한 데드락 문제를 해결하기 위한 방법으로는 먼저 자원을 순서화하여 스레드들이 자원에 접근할 때 동일한 순서로 자원을 잠그도록 규칙을 정하면, 순환 대기 조건을 방지할 수 있다.
또한 타임아웃 기법을 통해 스레드가 자원을 특정 시간 안에 획득하지 못하면 포기하도록 하여 데드락 상태를 회피할 수도 있다.
마지막으로 시스템이 데드락 상태를 감지하고 이를 해결하기 위해 하나 이상의 스레드를 강제로 종료하거나 자원을 해제하도록 할 수 있다.

0개의 댓글