<cs> Race Condition (경쟁상태)

ming·2023년 6월 2일

CS

목록 보기
10/10

공유 자원에 대해 동기화 처리 장치 없이 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태

발생하는 경우

  • 커널 코드 실행 중에 인터럽트가 발생할 경우
    커널모드에서 데이터를 로드하여 작업을 하던 도중 인터럽트가 발생하여 같은 데이터를 조작하는 경우에 발생할 수 있다.
    커널이 가진 전역변수는 모든 프로세스의 공유물이므로 경쟁상태의 가능성이 있다.

    • 해결법 : 커널모드에서 작업을 수행하는 동안 인터럽트를 disable시켜 인터럽트가 CPU제어권을 가져가지 못하도록 하여 해결할 수 있다.
  • 프로세스가 시스템 콜을 하여 커널모드로 진입해서 작업을 수행하는 도중에 문맥 교환이 발생할 경우
    프로세스1이 커널모드에서 데이터를 조작하던 도중 시간이 초과되어 CPU제어권이 프로세스2로 넘어가 같은 데이터를 조작하는 경우를 말한다.

    • 해결법 : 프로세스가 커널모드에서 작업을 하는 경우에는 시간이 초과되더라도 CPU 제어권이 다른 프로세스에게 넘어가지 않도록 한다.
  • 멀티 프로세서에서 공유 메모리 내의 커널 데이터에 접근할 경우
    멀티프로세스 환경에서 2개의 CPU가 동시에 커널 내부의 공유 데이터에 접근하여 조작하는 경우에 발생할 수 있다.

    • 해결법 : 커널 내부에 있는 각 공유 데이터에 접근할 때마다 그 데이터에 대해 lock/unlock함으로써 해결할 수 있다.

이밖에도 멀티스레드 환경에서 두 개 이상의 스레드가 공통의 전역변수에 접근할 경우 등에서 race condition이 발생할 수 있다

임계 영역 (Critical Section)

운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때 각 프로세스에서 공유 자원(임계 자원)에 접근하는 프로그램 코드 부분 을 의미한다.
프로세스간에 공유자원을 접근하는데 있어서 문제가 발생하지 않도록 공유 자원의 독점을 보장해줘야 하는 영역이다.

  • 임계 자원 : 여러 프로스세가 동시에 공유해서 사용하면 안 되는 자원

임계 영역 문제를 해결하기 위해서는 아래의 3가지 조건을 충족해야한다.

  • Mutual Exclusion (상호 배제)
    한 프로세스가 임계 영역에 들어가 있다면 다른 프로세스는 임계 영역에 들어갈 수 없어야 한다.

  • Progress (진행)
    임계 영역에 들어간 프로세스가 없는 상태에서, 들어가려 하는 프로세스가 여러개라면 어느 것이 들어갈지를 유한한 시간에 결정해주어야 한다.

  • Bounded Waiting (한정 대기)
    프로세스의 기아(Starvation)을 방지하기 위해, 한 번 임계 구역에 들어간 프로세스는 다음 번 임계 영역에 들어갈 때 제한을 두어야 한다.

임계영역 해결 방법

1. 유저모드의 동기화

커널의 힘을 빌리지 않는(커널 코드가 실행되지 않는) 동기화 기법

  • Pterson's Algorithm (피터슨 알고리즘)
    상호 배제를 위한 병렬 프로그래밍 알고리즘으로서, 공유 메모리를 활용하여 여러 개의 프로세스가 하나의 자원을 함께 사용할 때 문제가 발생하지 않도록 해준다.
bool flag[2] // 불린 배열(Boolean array)
 int turn // 정수형 변수
 flag[0]   = false // false은 임계 구역 사용을 원하지 않음을 뜻함.
 flag[1]   = true
 turn      = 0 // 0 은 0번 프로세스를 가리킴, 1은 1번 프로세스를 가리킴
 P0: flag[0] = true // 임계 구역 사용을 원함
     turn = 1 // 1번 프로세스에게 차례가 감
     while( flag[1] && turn == 1 )
     {
          // flag[1] 이 turn[1] 을 가지고 있으므로
          //현재 사용중임
          // 임계 구역이 사용 가능한지 계속 확인
     }// 임계 구역

    // 임계 구역의 끝
   flag[0] = false
P1: flag[1] = true
    turn = 0
    while( flag[0] && turn == 0 )
    {
         // 임계 구역이 사용 가능한지 계속 확인
    }// 임계 구역
    
    // 임계 구역의 끝
    flag[1] = false

이 알고리즘은 flag와 turn 변수를 사용한다. flag 값이 true이면 프로세스가 임계 구역에 들어가려고 하는 것을 나타낸다. 이 알고리즘은 임계 구역의 3가지 필수 기준(상호 배제, 진행 조건, 한계 대기)을 충족한다.

2. 커널모드의 동기화

커널에서 제공하는 동기화 기능을 활용하는 방법
커널 모드로의 변경이 필요하므로 성능 저하가 있지만 다양한 기능 활용이 가능하다.
각 프로세스들 안의 스레드들끼리의 동기화도 가능하다.
세마포어, 뮤텍스, 모니터 등의 방법이 있다.

profile
개발 성장 기록

0개의 댓글