반응형

목차

  1. 들어가며
  2. Race Condition
  3. 원인
  4. 비유를 통한 예시
  5. Race Condition의 결과
  6. 방지 및 완화

오늘은 강의 중 강사님께서 참고하라고 알려주신 Race Condition에 대해 추가로 알아보았다. 지금은 리눅스를 배우고 있지만 최종적으로는 클라우드를 다룰 수 있게 되는 것이다 보니 점점 알아야할 범위가 소프트웨어에서 하드웨어로까지 이동하는 것 같은 느낌이다. 클라우드 엔지니어는 슈퍼맨, 슈퍼우먼인걸까? 새삼 IT 업계 종사들이 존경스럽다. 사담은 여기까지하고 얼른 들어가보자!


Race Condition

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

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

Race Condition은 방지하기 위해 개발자는 종종 잠금, 세마포어 또는 모니터와 같은 동기화 기술을 사용하여 한 번에 하나의 프로세스만 공유 리소스에 액세스할 수 있도록 하거나 특정 실행 순서를 적용한다. 적절한 동기화를 구현함으로써 Race Condition은 방지하고 동시 또는 병렬 시스템의 올바른 기능을 보장할 수 있다.


원인
  • 불충분한 동기화
    여러 스레드 또는 프로세스가 적절한 동기화 없이 공유 리소스에 액세스하면 Race Condition이 발생할 수 있다.

  • 비원자적 작업
    여러 단계로 구성되고 단계 사이에서 중단될 수 있는 작업은 비원자적이다. 여러 스레드가 공유 리소스에서 비원자적 작업을 수행하는 경우 Race Condition이 발생할 수 있다.
    (더 이상 쪼갤 수 없는 행위를 '원자성을 가진다'라고 하며 이러한 특성을 가진 것을 '원자적이다'고 한다.)

  • 실행 순서에 대한 잘못된 가정
    프로그래머가 강제하지 않고 특정 실행 순서를 가정할 때 실제 실행 순서가 다를 경우 Race Condition이 발생할 수 있다.

비유를 통한 예시

철수와 민수이라는 두 사람이 잔액이 1,000원인 공동 은행 계좌를 공유한다고 상상해 보자. 철수는 500원를 인출하기를 원하고 동시에 민수은 300원를 인출하기를 원한다. 두 트랜잭션이 동시에 발생하여 잠재적인 Race Condition이 발생할 수 있다.

  1. 철수의 트랜잭션이 시작되고 계정 잔액을 1,000원으로 읽는다.
  2. 민수의 트랜잭션도 시작되고 계정 잔액을 1,000원으로 읽는다.
  3. 철수의 거래는 인출 후 새 잔액을 계산한다: 1,000원 - 500원 = 500원.
  4. 민수의 거래는 인출 후 새 잔액을 계산한다: 1,000원 - 300원 = 700원.
  5. 철수의 트랜잭션은 계정 잔액을 500원으로 업데이트한다.
  6. 민수의 트랜잭션은 계정 잔액을 700원으로 업데이트한다.

이 시나리오에서 두 번의 인출 후 계정 잔액은 200원이어야 한다. 그러나 경쟁 조건으로 인해 최종 잔액은 700원이며 이는 잘못된 값이다. 두 트랜잭션 모두 동기화 없이 계정 잔액을 읽고 업데이트하여 서로의 계산을 방해할 수 있기 때문에 문제가 발생했다.

이러한 경합 상태를 방지하기 위해 잠금과 같은 동기화 메커니즘을 사용할 수 있다. 잠금은 한 번에 하나의 트랜잭션만 계정 잔액에 액세스할 수 있도록 한다. 이 경우 철수 또는 민수의 거래는 진행하기 전에 상대방이 완료될 때까지 기다려야 하므로 잘못된 잔액 업데이트를 방지할 수 있다.

적절한 동기화를 구현함으로써 개발자는 경합 상태를 방지하고 공유 리소스가 동시 또는 병렬 시스템에서 올바르게 액세스되고 수정되도록 할 수 있다.


Race Condition의 결과
  1. 데이터 손상
    Race Condition으로 인해 데이터 Condition이 일관되지 않거나 잘못될 수 있다.

  2. 예측할 수 없는 동작
    Race Condition의 비결정적 특성으로 인해 시스템 동작을 예측하거나 재현하기 어려울 수 있다.

  3. 보안 취약성
    Race Condition은 때때로 공격자가 무단 액세스 또는 권한을 얻기 위해 악용할 수 있다.

방지 및 완화
  1. 뮤텍스 및 잠금
    뮤텍스("mutual exclusion"의 줄임말) 및 잠금은 공유 리소스에 대한 액세스를 동기화하는 데 사용된다. 한 번에 하나의 스레드 또는 프로세스만 잠금을 획득할 수 있으므로 제어된 방식으로 공유 리소스에 액세스할 수 있다.

  2. 세마포어
    세마포어는 공유 리소스에 대한 액세스를 제어하는 ​​데 사용되는 또 다른 동기화 프리미티브다. 특히 여러 스레드나 프로세스가 제한된 수의 인스턴스로 동시에 리소스에 액세스할 수 있는 경우에 그렇다.

  3. 원자적 작업
    중요한 작업이 원자적(즉, 중단되거나 인터리브될 수 없음)인지 확인하면 Race Condition을 방지하는 데 도움이 될 수 있다.

  4. 적절한 동시 시스템 설계
    동시 시스템의 요구 사항을 철저히 이해하고 스레드 또는 프로세스 간의 상호 작용을 신중하게 설계함으로써 Race Condition을 최소화하거나 피할 수 있다.

반응형