티스토리 뷰

Process Synchronization

Process Synchronization 문제
  • 데이터를 읽고 씀에 있어서 특정 주소 공간에서 값을 가져와서 연산 후 다시 저장을 하는 과정에서 프로세스끼리 충돌이 발생할 수 있다.
  • 공유 데이터의 동시 접근은 데이터의 불일치를 발생할 수 있다.
  • 일관성 유지를 위해 협력 프로세스 간의 실행 순서를 정해주는 메커니즘이 필요하다
Race Condition이란?

A. 두개 이상의 Thread or Process가 공유자원을 병행적으로 읽거나 쓰는 상황을 말한다.

 

Storage(Memory Address Space)를 공유하는 Execution(CPU Process)이 여러개가 있는 경우 Race Condition의 가능성이 있다.

  • Multi-Processor System의 경우
  • 여러 프로세스에서 동시에 공유 메모리(Shared Memory)의 데이터를 사용하는 경우
  • 커널 내부 데이터를 접근하는 루틴들 간
    • 프로세스에서 시스템 콜(인터럽트)이 발생하여 커널의 코드가 수행되면서 커널의 데이터를 접근하는 도중에 프로세스가 바뀌는 경우
    • 커널의 코드가 수행되는 중 인터럽트가 발생되어 해당 인터럽트를 처리하기 위한 커널의 코드가 수행되는 경우

 

OS에서의 Race Condition

  1. 커널 코드 수행 중에 인터럽트가 발생한 경우
  2. Process가 System Call(trap)을 요청하여 커널 모드로 수행 중에 Context Switch가 발생한 경우
  3. Multi-Processor 환경에서 Shared-Memory로 커널 접근 시

1) Kernel code 수행 중에 인터럽트가 발생 한 경우

  1. 커널의 코드가 수행중인 상황에서 count++을 위해 [1. load]를 진행하여 레지스터에 변수를 저장
  2. Interrupt가 발생하여 인터럽트 핸들러를 통해 처리, count-- 를 수행
  3. 1 감소된 count값이 다시 1 증가되길 원했으나, 인터럽트 이전에 레지스터에 저장한 값을 load하여 [2. Inc]이 이어서 실행된다.

→ 결과적으로 1증가된 값이 [3.store] 를 수행하여 저장된다.

 

해결방법

→ 커널 코드 수행중에는 인터럽트 처리 루틴을 수행하지 않고 작업이 끝난 후에 처리하도록 한다.

 

2) Process의 시스템 콜로 인해 커널 모드로 수행 중에 Context Switch 발생 시

  1. P(a)가 User모드로 수행중에 시스템콜을 요청 → Kernel 모드 진입, 커널 코드 상에서 count++ 수행 중
  2. 커널 모드 수행 중에 Time Quantum 만료로 인해 Context Switch 발생 → P(b)로 Context Switch
  3. P(b)에서도 시스템 콜을 통해 커널모드 진입 후 동일한 커널 데이터에 대해 count++ 수행
  4. (b)P의 quantum time 만료 후 P(a) 이전 작업 이어 수행 -> P(b)에서 증가시킨 count값을 또 증가시킨다.

→ 결과적으로 Kernel의 Count++가 중복으로 발생하게 된다

 

해결방법

→ 커널 모드 수행 중에는 프로세스에게서 CPU를 preemptive하게 빼앗지 않도록 한다. 커널 모드 종료 후 해당 프로세스가 유저 모드로 돌아갔을 때 빼앗고 진행.

 

3) Multi Processor 환경 내 공유 메모리 동시 접근 시

멀티 프로세서 환경에서는 공유되는 메모리에 다른 커널들이 동시에 특정 값에 접근할 수 있다

 

해결방법

방법 1) 커널 내부에 있는 각 공유 데이터(다른 커널도 접근할 수 있는)에 접근할 때마다 그 데이터를 lock / unlock 함으로서 다른 커널의 해당 데이터로의 접근을 막는다.

방법 2) 커널에 접근하는 CPU를 매순간 하나만 접근할 수 있도록 한다.
사실상 커널을 CPU가 점유할 때마다 커널을 lock, unlock을 하는 방법이므로, CPU가 여러개이더라도 동시에 커널을 사용할 수 없으므로 비효율적이다.

반응형
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday