Chapter6. 동기화 & 상호배제

Date:     Updated:

카테고리:

태그:

유튜브에 있는 김덕수 교수님의 Operating System 강의를 듣고 정리한 내용입니다.
중간에 등장하는 ppt 내용들은 모두 강의자료를 캡처한 것입니다.


🔧 동기화 (Synchronization)

6-1

Multi Programming System

  • 여러 개의 프로세스들 존재
  • 각 프로세스들은 서로 독립적으로 동작
  • 여러 개의 프로세스가 공유 데이터에 접근할 때 문제 발생 가능
  • 자원을 효율적으로 요청&배분하기 위해서는 각 프로세스들의 정보 공유가 필요함

용어 정리

  • Shared data (or Critical data)
    • 여러 프로세스들이 공유하는 데이터
  • Critical Section
    • 공유 데이터에 접근하는 코드 영역 (code segment)
  • Concurrent (병행)
    • 여러 개의 프로세스들이 동시에 시스템에 존재


  • Synchronization (동기화)
    • 프로세스들이 서로 동작을 맞춤
    • 프로세스들이 서로 정보를 공유
  • Asynchronization (비동기화)
    • 프로세스들이 서로에 대해 모름


🔧 상호배제 (Mutual Exclusion)

코드 실제 기계어 동작
6-1 6-2
  • 프러세스 pi의 기계어 명령 사이에 프로세서를 뺏기면 결과가 달라질 수 있음
  • +1 했는데 +2 결과로 나올 수도.. (add와 store 사이에서 프로세서 pj가 난입)
  • 이런 상황을 막기 위해 둘 이상의 프로세스가 동시에 critical section에 진입하는 것을 막음 → 상호 배제


Mutual exclusion methods

6-0

Mutual exclusion primitives

  • enterCS() primitive
    • Critical section 진입 전 확인
    • 다른 프로세스가 critical section 안에 있는지 확인
  • exitCS() primitive
    • Critical section 벗어날 때 후처리
    • Critical section 벗어났음을 시스템에 알림


Requirments for ME primitives

Mutual exclusion primitives가 되기 위해서는 다음 세 가지 조건을 만족해야 함 (쉽지 않다)

  • Mutual exclusion
    • Critical section(CS)에 프로세스가 있으면 다른 프로세스의 진입을 금지
  • Progress
    • CS 안에 있는 프로세스 외에는 다른 프로세스가 CS에 진입하는 것을 방해하면 안됨
    • CS 밖에서 이래라 저래라 하면 안됨
  • Bounded waiting (한정대기)
    • 프로세스의 CS 진입을 무한하게 기다리면 안됨


🔧 Mutual exclusion solutions

  • SW solution
    • Dekker’s algorithm (Peterson’s algorithm)
    • Dijkstra’s algorithm
  • HW solution
    • TestAndSet(TAS) instruction
  • OS supported SW solution
    • Spinlock
    • Semaphore
    • Eventcount/sequencer
  • Language-Level solution


SW solution

Dekker’s algorithm

6-3

  • Two process ME를 보장하는 최초의 알고리즘
  • flag만으로는 ME의 요구사항을 만족하지 못함
  • flag & turn 사용
  • Peterson’s algorithm : Dekker’s algorithm 보다 간단하게 구현


Dijkstra’s algorithm

6-4

  • flag[] 변수
    • idle: CS진입 시도하고 있지 않음
    • want-in: CS 진입 시도 1단계
      • (다른 프로세스가 쓰고있으면 끝날 때까지 계속 체크하면서 대기)
    • in-CS: CS 진입 시도 2단계 or CS 내에 있을 때
  • n개의 프로세스 상호배제 문제를 해결한 최초의 알고리즘


SW solution의 한계

  • ME primitive 실행 중 preemption 방지하기 힘듬
    • 느려지고 구현이 복잡
  • Busy waiting problem
    • 다른 프로세스가 끝날 때 까지 계속 체크
    • 비효율적


HW solution

6-6

  • Test와 set을 한번에 수행하는 기계어
  • 기계어 실행 중 inturrupt (preemption)를 하드웨어가 막아줌
  • 장점: 구현이 간단
  • 단점: Busy waiting problem


OS supported SW solution

Preemption을 OS가 막아준다!

Spinlock

6-7

  • active = 1: CS 실행중인 프로세스 없음
  • active = 0: CS 실행중인 프로세스 있음
  • P(S): 내가 쓴다 (자물쇠 잠금)
  • V(S): 잘 놀다 갑니다 (잠금 해제)
  • Busy waiting problem 여전함


Semaphor

semaphor P(), V()
6-8 6-9
  • 1965년 Dijkstra가 제안
  • Busy waiting problem 해결!
    • 대부분의 os가 사용
  • 음이 아닌 정수형 변수 S
    • 초기화, P(), V()로만 접근 가능
    • P: Probern (검사)
    • V: Verhogen (증가)
    • S 하나 당 ready queue 하나 할당


Process synchronization

6-10

  • 독립적으로 실행하는 프로세스들의 실행 순서 맞추기
  • Sync라는 semaphore변수 선언 (CS처럼 다루기)


Producer-Consumer problem

6-11

  • Producer 프로세스
    • 메시지를 생성하는 프로세스 그룹
  • Cosumer 프로세스
    • 메시지를 전달받는 프로세스 그룹
  • 메시지 생산이 끝나기 전에 소비하면 안됨
  • buffer를 CS처럼 다룸


Producer-Consumer problem with N-buffers

6-12


6-13


Reader-Writer problem

6-14

  • Reader: 데이터 읽기 연산만 수행
  • Writer: 데이터 갱신 연산을 수행
  • Reader들은 동시에 접근 가능
  • Writer끼리 or Reader와 Writer 동시 접근은 상호배제(동기화) 필요
    • reader/writer 우선권 부여
    • 위 예시는 reader preference solution


Semaphore 특징

  • No busy waiting
    • 기다려야 하는 프로세스는 block(asleep)상태가 됨
    • 계속 확인할 필요 X (대기실에서 편하게 대기)
  • Semaphore queue에 대한 wake-up 순서는 비결정적
    • Starvation problem 생길 수 있음
    • 대기 중인데 계속 새로운 프로세스 들어오면..


Eventcount / Sequencer

  • 은행의 번호표 개념
  • Sequencer (표 뽑아주는 기계)
    • 정수형 변수
    • 생성시 초기값 0, 증가만 함
    • 발생 이벤트들의 순서 유지
    • ticket() 연산으로만 접근 가능
  • ticket(S)
    • 현재까지 ticket() 연산이 호출된 횟수 반환
    • Indivisible operation (os supported)


Primitives

6-15

  • Eventcount
    • sequencer
    • read(E), advance(E), await(E) 연산으로만 접근 가능
  • read(E)
    • 현재 Eventcount 값 반환
  • advance(E)
    • E ← E + 1
    • E 기다리고 있는 프로세스 깨움(wake-up)
    • 띵동
  • await(E,v)
    • v는 정수형 변수
    • if(E< v) 이면 E에 연결괸 queue(E)에 프로세스 전달(push) 및 CPU scheduler 호출
    • queue: 대기실 & 내 번호 오면 깨워달라고 schedular에 부탁


Producer-Cunsumer problem

6-16


Eventcount / Sequencer 특징

  • No busy waiting
  • No starvation
    • FIFO scheduling for Q(E)
  • Semaphore 보다 더 low-level control 가능


Monitor

Language-level solution (사용이 쉽다)

Monitor Pseudo-code
6-17 6-18
  • Monitor: 공유 데이터와 critical section의 집합
    • 모니터 내에는 항상 하나의 프로세스만 진입 가능
    • 공유 데이터는 모니터 내의 프로세스만 접근 가능
  • Entry queue (진입 큐)
    • 대기중인 Procedures(functions)
  • Condition queue (조건 큐)
    • 모니터 내의 특정 이벤트를 기다리는 프로세스 대기
  • Signal queue (신호 큐)
    • 작업이 끝난 프로세스를 반납할 때 release에서 바로 반납할 수 없음 (모니터 내에는 하나의 프로세스만 존재하기 때문)
    • signal을 거쳐서 작업이 끝났음을 알리고 반납


맨 위로 이동하기

OS 카테고리 내 다른 글 보러가기

댓글 남기기