[Computer Science] Synchronize(동기화)와 Deadlock - 동기화 (2)

AMUD·2022년 8월 24일
0

My Computer Science

목록 보기
5/11

🥭 교착 상태 (Deadlock)와 기아

  • 교착 상태 (deadlock)
    • 두 개 이상의 프로세스들이, 오로지 대기중인 프로세스들 중 하나에 의해서만 야기될 수 있는 사건(signal())을 무한정 기다리는 상황
    • 두 개의 프로세스 P0과 P1에서 1로 초기화된 세마포 S와 Q를 접근하는 시스템 예
  • 기아 (starvation)
    • 교착 상태와 연관된 무한 봉쇄(indefinite blocking)
    • 프로세스들이 세마포에서 무한정 대기하는 것으로, 프로세스가 중지된 세마포 큐에서 제거되지 않음

🥞 임계 구역 문제 발생

운영체제에서 임계 구역 문제가 언제 발생?

  • 커널에서 인터럽트 루틴 처리
  • 프로세스가 커널에서 선점 : 시스템 호출 중에 선점
  • 다중 처리기 : 공유 메모리에서 커널 데이터


커널에서 인터럽트 루틴 처리


프로세스가 커널에서 선점


다중 처리기

세마포의 문제점

세마포를 이용하여 임계 구역 문제를 해결할 때 프로그래머가 세마포를 잘못 사용하면 다양한 유형의 오류가 너무나도 쉽게 발생

  • 상호 배제 요구 조건을 위반하거나, 교착 상태가 발생
  • 프로세스에서 wait()나 signal() 또는 둘 다 생략된 경우

🐬 모니터

모니터는 쉽고 효율적인 프로세스 동기화 수단을 제공하는 고급 언어수준의 동기화 구조물 (high-level language synchronization construct)

  • 추상화된 데이터 형을 안전하게 공유 : ex) 자바의 객체
  • 데이터와 데이터를 조장하는 함수들을 하나의 단위로 묶어서 보호

모니터 구조

모니터 구조물은 모니터 안에 항상 하나의 프로세스만이 활성화되도록 보장 : 프로그래머가 모니터 내부에 상호 배제가 보장되는 연산자들의 집합을 정의

condition 형의 변수

  • 모니터 내의 프로세스(연산자)들의 동기화를 위해 condition 변수 선언 : condition x,y;
  • condition 형 변수에 호출될 수 있는 연산은 오직 wait()와 signal()
    • x.wait() : 연산을 호출한 프로세스는 다른 프로세스가 x.signal()을 호출할 때까지 일시 중단
    • x.signal() : 연산은 정확히 하나의 일시 중단 프로세스를 재개. 만약 일시 중단된 프로세스가 없다면, signal() 연산은 아무런 효과가 없음


조건 변수를 갖는 모니터

자바 모니터 - 스레드 동기화

자바의 기본 스레드 동기화 모델은 모니터와 같은 병행성 기법 제공 : 모든 객체들은 하나의 락(lock)과 연관

  • 메서드 또는 객체의 블록에 synchronized 선언
    • 공유 데이터에 락을 설정
    • synchronized 메서드(블록)가 종료하면 락이 해제되어 다른 스레드가 접근 가능
public synchronized void method() {
	...
}


synchronized(참조하는 객체 변수) {
	...
}

자바 스레드 동기화 모델

하나의 데이터(객체)마다 하나의 모니터를 결합

  • 결합된 데이터(객체)가 동시에 두 개 이상의 스레드에 의해 접근할 수 없도록 락(lock) 기능 제공
  • synchronized 메서드를 호출한 스레드는 봉쇄되어 객체의 락에 설정된 진입 집합(Entry Set)에 추가
  • 락이 가용한 경우 호출 스레드는 객체 락의 소유자가 되어 메서드로 진입
  • 스레드가 메서드를 종료하면 락이 해제
    • 락이 해제될 때 진입 집합이 비어있지 않으면 JVM은 집합에서 스레드를 임의로 선택하여 락을 부여

자바 조건 변수

  • 언어 수준에서 자바는 기명 조건 변수를 지원하지 않음
  • 자바의 모니터는 무명 조건 변수 하나에만 연결
    - wait()와 notify() 연산이 하나의 조건 변수에만 적용
    - 스레드가 wait() 메서드 호출 시 동작
    - 스레드가 객체의 락을 해제
    - 스레드 상태가 봉쇄(blocking)로 설정
    - 스레드가 대기 집합(wait set)에 삽입되어 대기
    - 스레드가 notify() 메서드 호출 시 동작
    - 대기 집합에서 임의의 스레드 T 선택
    - 스레드 T를 진입 집합으로 이동
    - T의 상태를 봉쇄→실행가능 으로 변경

    🦴참고

    Operating System Concepts, 10th Ed.
profile
210's Velog :: Ambition Makes Us Diligent

0개의 댓글