본문 바로가기
공부/JAVA

[Thread] 동기화와 교착상태

by 밍미 2018. 6. 11.

Thread

 

Synchronization

  • 동기화(synchronization)

    • 스레드는 자원을 공유하기 때문에 동시에 여러 스레드가 실행되면 공유 자원에 대해 동기화가 발생할 수 있다.
    • 실행 흐름은 순차적으로 진행되지만, 자원은 한정적인데 여러 스레드가 동시 접근해서 사용하려고 하면 문제가 생기게 된다.
    • 공유 메모리에 대해서 한 번에 한 스레드만 공유자원에 접근할 수 있도록 만들어 동기화 문제를 해결할 수 있다.
  • 임계영역(critical section)

    • 멀티스레드 프로그램에서 공유 자원이 참조 가능한 코드 영역을 말한다.
    • 한 스레드가 사용 중인 자원은 작업이 끝날 때까지 lock을 걸어서 다른 스레드가 사용할 수 없도록 한다.
    • 자바에서는 임계영역을 지정하기 위해 동기화 메소드와 동기화 블록을 제공한다. 스레드가 동기화 메소드나 블록에 들어가면 lock을 걸어 다른 스레드가 임계영역 내의 코드를 실행하지 못하도록 한다.
    • 다른 동기화 객체보다 빠르고 효율적이다.
  • 뮤텍스(mutex)

    • 임계영역과 마찬가지로 공유자원에 여러 스레드가 접근하려고 할 때, lock을 이용해 한 번에 하나의 스레드만 접근하도록 허용하는 것이다.
    • 임계영역은 한 프로세스 내의 스레드에만 사용 가능하지만 뮤텍스는 서로 다른 프로세스에 속한 스레드에도 적용 가능하다.
  • 세마포어(semaphore)

    • 한정된 자원을 여러 스레드가 사용하려고 할 때 접근을 제한한다.
    • 다중 스레드 간 공유 자원 접근 순서를 제어하고 공유 자원의 수와 접근 스레드 수에 따라서 보다 유연하게 공유영역으로의 접근을 제어한다.
  • 이벤트(event)

    • 특정한 이벤트가 발생했음을 다른 스레드에게 알린다.
    • 스레드의 작업이 종료되면 신호상태로 변경되고, 다른 스레드가 작업하도록 한다.
  • waitable timer

    • 특정 시간이 지나면 대기 중인 스레드에게 알린다.
    • 정해진 시간이 지나면 자동으로 신호상태로 변경된다.

 

 

Deadlock

  • 교착상태(deadlock)

    • 두 개 이상의 작업이 하나씩 자원을 소지(hold)하고 있으면서 상대방이 가진 자원을 서로 원하고(need) 있는 상태
    • 어떤 작업도 실행되지 못하고 계속 서로 상대방의 작업이 끝나기 만 바라는 무한정 대기상태
  • 교착상태 발생 조건

    • 상호배제(Mutual exclusion) : 한 번에 한 프로세스만이 자원을 사용
    • 점유대기(Hold and wait) : 하나 이상의 자원을 소지한 프로세스가 다른 프로세스가 가진 자원을 추가로 얻기 위해 대기
    • 비선점(No preemption) : 자원을 강제적으로 뺏을 수 없고, 사용중인 프로세스가 종료된 후 반환되어야 사용 가능
    • 환형대기(순환대기, Circular wait) : A는 B의 자원을 대기하고, B는 C의 자원을 대기하고, ..., N은 A의 자원을 대기
    • 이 조건을 모두 만족하면 교착상태가 발생하게 된다.
    • 각 조건은 서로 완전히 독립적이지 않고 연관되어있다. 순환대기의 경우 상호배제, 점유대기, 비선점 조건을 만족해야 만족된다.
  • 교착상태의 예방

    • 교착 상태 발생 조건 중 하나를 제거함으로써 교착상태가 일어나지 않도록 한다.

    • 자원의 낭비가 심하고 시스템 처리율이 감소될 수 있다.

    • 상호배제 조건의 제거

      • 여러 개의 프로세스가 공유 자원을 사용할 수 있도록 한다.
    • 점유 대기 조건의 제거

      • 수행 전 모든 자원을 할당시켜주고 자원을 점유하고 있지 않을 때에만 자원을 요구하도록 한다.
    • 비선점 조건의 제거

      • 선점 가능한 프로토콜을 만들어준다.
      • 자원을 점유하고 있는 프로세스가 다른 자원을 요구할 때는 점유하고 있는 자원을 반납하고난 후 요구한 자원을 기다리게 한다.
    • 환형 대기 조건의 제거

      • 자원 유형에 따라 순서를 매긴다.
  • 교착상태의 회피

    • 자원할당 상태(사용 가능한 자원 수, 할당된 자원 수 등)를 검사해 교착상태가 발생하면 피해가도록 한다.

    • 불안전상태이면 교착상태가 일어날 수 있으므로 시스템이 불안전상태가 되면 안정상태가 되도록 회피하는 알고리즘을 수행한다.

    • 자원 할당 그래프 알고리즘(Resource Allocation Graph Algorithm)

      • 교착상태 회피를 위해서 자원할당그래프에 예약간선(claim edge)을 추가
      • 시스템에서 자원이 반드시 미리 예약되어 그래프에 예약간선이 모두 표시되어야 한다.
    • 은행원 알고리즘(Banker’s algorithm)

      • 필요한 자원의 최대 개수를 미리 신고해 프로세스가 자원을 요청했을 때 요청을 수락하여도 안전상태에 머무를 수 있는지 판단 후 요청을 수락한다.
      • 안전상태가 아니게 된다면 다른 프로세스가 끝날 때 까지 요청 수락 대기
  • 교착상태의 탐지

    • 자원 할당 그래프를 통해 교착 상태를 발견한다.
  • 교착상태의 회복

    • 교착 상태가 일어난 프로세스를 종료

      • 교착 상태의 프로세스를 모두 중지
      • 교착 상태가 제거될 때까지 한 프로세스씩 중지
    • 프로세스에 할당된 자원을 선점

      • 교착 상태의 프로세스가 점유하고 있는 자원을 선점해 다른 프로세스로 할당하고, 해당 프로세스는 일시 정지시킨다.
      • 우선 순위가 낮은 프로세스 위주로 자원을 선점할당한다.

'공부 > JAVA' 카테고리의 다른 글

[디자인패턴] 템플릿 메서드 패턴(Template Method Pattern)  (0) 2019.01.04
[디자인패턴] 싱글톤(Singleton)  (0) 2018.11.19
[Thread] Thread  (0) 2018.06.11
[자료구조] 비선형구조  (0) 2018.06.08
[자료구조] 선형구조  (0) 2018.06.05

댓글