운영체제 - 데이터 불일치 ( Data Inconsistency )

TopOfTheHead·2026년 2월 11일

운영체제

목록 보기
15/24

스레드 / 프로세스공유 자원에 접근 시 주의사항
스레드간 통신( IPC )은 프로세스논리적 주소공간공유자원으로서 공유
Shared MemoryMessage Passing

  • 데이터 불일치( Data Inconsistency ) 문제
    。복수의 스레드 / 프로세스가 서로간의 공유중인 논리적 주소공간 또는 공용 데이터Concurrent하게 접근하는 경우 Race Condition 발생

    프로세스들이 Concurrent하게 공유되고있는 데이터 접근 시 Data Consistency를 유지하기위해 순차적으로 접근하도록 설정
    • 프로세스 / 스레드공유자원Concurrent Execution하는 경우
      ex) Execution 중인 프로세스선점( preemtive ) 등의 이유로 인터럽트되어 다른 프로세스Context Switch하는 경우에서 데이터 불일치 문제가 발생할 수 있다.

    • 프로세스 / 스레드공유자원Parallel Execution하는 경우
      ex) 2개 또는 3개 이상의 프로세스들이 CPU의 각각의 코어들에 의해 동시에 실행되고 있을때 데이터 불일치 문제가 발생할 수 있다

데이터 불일치 ( Data Inconsistency )
동일 데이터공유를 통해 생성된 여러 사본이 일관성 없이 서로 다른 값을 가지고 있는 상태

  • 데이터 불일치 문제가 발생하는 예시
    Race Condition에 의해 프로세스 / 스레드에 의한 공유메모리 접근순서에 따라 결과가 각각 변화
    • 생산자-소비자 문제 IPC
      。여러 프로세스가 공유메모리( ex. 버퍼 )에 동시에 접근 시 발생하는 동기화( Syncronization ) 문제

    • IPC-Shared Memory 예제 활용 시
      。전역변수로 공유버퍼로서 활용할 buffer외 전역변수 int count = 0;를 추가 설정하여 각 프로세스에서 참조 시 생산자 / 소비자 프로세스 코드를 다음처럼 정의

      생산자 프로세스
      while(true){
        // 버퍼가 가득찬 경우 아무 작업도 하지않기
        while(count == BUFFER_SIZE) ; 
        //
        // 버퍼가 빈 경우 item input
        buffer[in] = next_produced;
        in = (in + 1) % BUFFER_SIZE;
        count++;
      };

    소비자 프로세스

      while (true) {
        // 버퍼가 비어있는경우 아무 작업하지 않기
        while ( count == 0 ) ; 
        next_consumed = buffer[out];
        out = (out + 1) % BUFFER_SIZE;
        count--;
      }

    。두개 프로세스가 전역변수인 공유 버퍼내 동일 데이터에 Concurrent하게 접근하는 경우, 생산자 프로세스CPU 배정 후 버퍼에 작성 및 Context Switching을 통해 소비자 프로세스CPU 배정 후 버퍼에서 데이터를 읽어온다.
    Parallel이 아닌 Concurrent하게 작용하므로 이론상으로는 공유데이터의 일관성에 문제없으나 실제로는 데이터 불일치 발생

    ex ) 전역변수 count = 5 일때 위 두 프로세스Concurrent하게 접근하는 경우
    count++count--에 의해 count = 5가 되야하지만, count4 or 5 or 6이 될 수 있음

데이터 불일치 문제가 발생하는 이유
。두 프로세스Concurrent하게 공유메모리에 접근 시 CPU SchedulerContext Switching에 의한 save / restore 과정에서 데이터 불일치문제가 발생할 수 있음
▶ 각 프로세스문맥교환으로 명령어들이 임의 순서로 interleaving되면서 데이터 불일치문제가 발생
▶ 해당 상황을 Race Condition이라고 한다.

。위 생산자 - 소비자 문제의 전역변수 count의 소스코드 count++count--저급언어 단계에서 다음처럼 표현됨

  register1 = count // LOAD
  register1 = register1 + 1 // ADD
  count = register1 // STORE
  register2 = count // LOAD
  register2 = register2 - 1  // SUB
  count = register2 // STORE

count++count--Concurrent하게 실행 시 register = count , count = register가 아닌 register = register + 1단계에서 Context Switch가 발생하면 데이터 불일치 문제 발생
CPU SchedulerContext Switching에 의한 save / restore 과정에서 레지스터 값의 데이터 불일치 문제가 발생

。해당 코드를 임계영역으로 설정하여 중간에 문맥교환이 발생안하도록하여 문제해결이 가능.

Race Condition 상황에서의 데이터 불일치 발생 원리
。전역변수 int count = 5일때

  • 생산자 프로세스에서 CPU를 배정받아 count++를 실행 중 register1 = register1 + 1에서 Context Switch가 발생
    register1 = register1 + 1에서 문맥교환이 발생하여 문제가 발생하는 단계

    생산자 프로세스register1 = 5+1 = 6 정보만을 저장 후 전역변수 count에 대해 값 할당없이 소비자 프로세스Context Switch

  • 소비자 프로세스CPU 배정 후 count-- 실행 중 작업을 정상적으로 완료
    。문제가 없는 단계

    소비자 프로세스는 전역변수 count = 5를 가져온 후 Register2 = 5-1 = 4를 통해 count = 4로 할당후 Context Switch

  • 생산자 프로세스로 다시 CPU 배정 시
    。이전 작업에서 수행 못한 명령어 count = register1에서 작업을 재개 시 기존 PCB에 저장된 register1 = 6이므로 count = 6을 할당

    。해당 작업의 결과는 5가 나와야 정상이지만, count++count = 6이 수행되기 전 Context Switching이 발생하여 결과적으로 6을 할당하게됨.
    Context Switch 위치에따라 데이터 불일치가 발생

    。만약 소비자 프로세스count--에서 register2 = register2 - 1에서 문맥교환 발생 시 다음 결과 ( count = 4 )가 도출

문제1

문제2

profile
공부기록 블로그

0개의 댓글