[운영체제] 프로세스 동기화

Updated: Categories:

프로세스의 동기화 문제에 대해 알아보자

IPC

  • Inter Process Communication
  • 프로세스는 독립된 메모리 공간을 가지기에 서로 통신이 어려움
  • 따라서 프로세스의 내부 통신 방법을 IPC라 함
  • IPC는 크게 두가지로 나뉜다

메시지 전달

  • 커널을 통해 메시지를 전달하여 데이터를 주고받는 방식
    • 장점 : 커널을 사용하여 구현이 쉬움
    • 단점 : 시스템 호출로 인한 오버헤드 발생
  • Pipe : 단방향 파이프를 통해 통신
  • Signal : 프로세스 ID를 통해 메시지를 전달
  • Message Queue : 메시지 큐를 통해 통신
  • Socket : 네트워크 간 프로세스 통신 방식

공유 메모리

  • 공유 메모리 영역을 통해 데이터를 주고받는 방식
    • 장점 : 커널 의존도가 낮아 속도가 빠름
    • 단점 : 동기화 이슈 발생
  • Semaphore


동시성 문제

  • 동시성 문제 : 여러 프로세스가 ‘공유자원’을 두고 ‘경쟁상태’에 빠지는 것
  • 공유자원 : 여러 프로세스가 공동으로 사용하는 메모리, 파일 등
  • 경쟁상태 : 두 개 이상의 프로세스가 공유 데이터에 접근하는 상황
  • 동기화 : 공유자원의 일관성을 유지하기 위해 프로세스의 접근 순서를 제어하는 것

임계구역

  • 공유자원 접근 순서에 따라 실행결과가 달라지는 프로그램의 영역, 코드블럭
    • 생산자-소비자 문제가 대표적인 임계구역 문제
  • 해결조건
    • 상호배제 : 한 프로세스가 임계구역에 진입하면 다른 프로세스는 진입할 수 없음
    • 유연한 진행 : 한 프로세스가 다른 프로세스의 진입을 방해하면 안됨
    • 한정된 대기 : 어떤 프로세스도 무한 대기하지 말아야함 (기아현상이 없어야함)

Mutex

  • 상호 배제(Mutual Exclusion)를 뜻함
  • 1개의 공유자원에 1개의 프로세스만 접근할 수 있음
    • Lock 기법 : 프로세스가 임계구역 진입시 Lock을 걸어버림
    • 바쁜대기 : 대기 프로세스는 계속 실행중이면서 임계구역을 지속적으로 확인함
  • 피터슨 알고리즘이 이에 해당함

Semaphore

  • N개의 공유자원에 N개의 프로세스만 접근할 수 있음
    • 남은 공유자원의 수 카운터를 사용함
      1. 프로세스는 임계구역 진입하며 카운터 -1
      2. 카운터가 0일때 다른 프로세스는 진입 불가
      3. 프로세스는 임계구역에서 나오면서 카운터 +1, Wake Up 신호 보냄
    • 대기 프로세스는 Sleep 상태가 된다

Monitor

image

  • 세마포어보다 고수준 언어에서 사용되는 상호배제 기법
    • 자바에서 동기화에 사용됨
  • 상호배제 큐(Mutual Exclusion Queue)와 조건동기 큐(Conditional Synchronization Queue)가 사용된다
    • 상호배제 큐 : 공유자원을 얻기위해 프로세스가 대기하는 큐
    • 조건동기 큐 : 공유자원을 점유하고 있던 프로세스가 block되면서 대기하는 큐 (다른 프로세스에게 자원을 뺏긴것)
  • synchronized : 코드블록을 동기화시키는 제어자
  • wait() : 자원을 점유하던 프로세스를 block시키는 메소드
  • notify() : 조건동기 큐의 block 상태 프로세스를 깨우는 메소드
  • notifyAll() : 조건동기 큐의 모든 block 상태 프로세스를 깨우는 메소드


교착상태

  • 여러 프로세스가 자원을 점유한 상태에서 서로 다른 프로세스가 점유하고 있는 자원을 요구하며 무한 대기하는 현상
  • 기아현상과 차이점
    • 기아현상 : 특정 프로세스가 계속 지연 ~ 무한대기
    • 교착상태 : 모든 프로세스가 무한대기

발생조건

  • 상호배제 : 한번에 하나의 프로세스만 공유 자원 사용
  • 점유대기 : 하나의 자원을 점유하면서 다른 프로세스의 자원을 요구하며 대기
  • 비선점 : 점유중인 자원은 다른 프로세스가 빼앗을 수 없음
  • 순환대기 : 점유와 대기를 하는 프로세스가 원형을 이뤄야 함

교착상태 예방

  • 교착상태 발생조건 네가지 중 하나를 미리 무력화하는 방법
  • 실효성이 적어 사용되지 않음

교착상태 회피

  • 교착상태가 발생하지 않는 수준으로 자원 할당
  • 은행원 알고리즘이 이에 해당함
  • 자원의 낭비가 심하다

교착상태 발견 & 회복

  • 교착상태를 발견하고 회복시키는 방법
  • 발견
    • 타임아웃 : 특정 프로세스가 일정시간동안 작업이 진행되지 않으면 교착상태가 발생했다고 판단
    • 자원할당 그래프 : 그래프를 보고 단일자원일때 사이클이 생기면 교착상태로 판단
  • 회복
    • 모든 프로세스 강제종료 : 재시작시 동시에 실행하면 교착상태가 재발생할 수 있으므로 순차적으로 실행
    • 교착상태 원인 프로세스를 하나씩 종료 : 우선순위가 낮은 프로세스부터 종료시킴
  • 현실적으로 가장 적합한 방법


식사하는 철학자 문제

  1. 일정 시간 생각을 한다.
  2. 왼쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다.
  3. 오른쪽 포크가 사용 가능해질 때까지 대기한다. 만약 사용 가능하다면 집어든다.
  4. 양쪽의 포크를 잡으면 일정 시간만큼 식사를 한다.
  5. 오른쪽 포크를 내려놓는다.
  6. 왼쪽 포크를 내려놓는다.
  7. 다시 1번으로 돌아간다.

교착상태 조건

  • 상호배제 : 철학자들은 서로 포크를 공유할 수 없다
  • 점유대기 : 철학자들은 왼쪽 포크를 잡은 채 오른쪽 포크를 기다린다
  • 비선점 : 철학자들은 다른 철학자의 포크를 빼앗을 수 없다
  • 순환대기 : 철학자들은 원형 테이블에 앉아있다

해결방법

  • 교착상태 예방
  • 상호배제 : 철학자들의 포크를 서로 공유할 수 있도록한다.
  • 점유대기 : 두 포크를 모두 잡지 못한 철학자는 포크를 놓도록 한다
  • 비선점 : 철학자들이 다른 철학자의 포크를 빼앗을 수 있도록한다
  • 순환대기 : 한 철학자는 왼쪽이 아닌 오른쪽 포크를 먼저 잡도록 한다