Post

[혼자 공부하는 컴퓨터구조+운영체제]12장 프로세스 동기화

12-1 동기화란

동기화의 의미

  • 프로세스 동기화: 프로세스 간의 수행 시기를 맞추는 것
    • 실행 순서 제어: 동시에 실행되는 프로세스를 올바른 순서대로 실행
    • 상호 배제: 동시에 접근 불가한 자원에 하나의 프로세스만 접근을 허용
      • 생산자와 소비자 문제: 고전적인 상호 배제를 위한 동기화 문제
  • 스레드 또한 동기화의 대상이다.

공유 자원과 임계 구역

  • 공유 자원: 공동으로 이용하는 변수, 파일, 장치 등의 자원
  • 임계 구역: 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
  • 레이스 컨디션(race condition): 여러 프로세스가 동시에 임계 구역의 코드를 실행하여 발생하는 문제
    • 컴퓨터는 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정 중간에 문맥 교환 가능
      ⇒ 데이터의 일관성이 깨지는 경우 발생
  • 상호 배제를 위한 동기화 원칙
    • 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입하면 다른 프로세스는 임계 구역 진입 불가
    • 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 진입 가능
    • 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 진입 가능
      • 임계 구역에 진입하기 위해 무한정 대기하면 안 된다.

12-2 동기화 기법

뮤텍스 락

  • MUTual EXclusion lock, Mutex
  • 동시에 접근해서는 안 되는 자원에 동시에 접근하지 못하게 하는, 상호 배제를 위한 동기화 도구
  • 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어두어 다른 프로세스의 진입을 막는 방법
  • 단순한 뮤텍스 락의 구성
    • 자물쇠 역할 ⇒ 프로세스가 공유하는 전역 변수 lock
      • 임계 구역이 열려있는 경우 false, 잠겨 있는 경우 true
    • 임계 구역을 잠그는 역할 ⇒ acquire 함수
      • 프로세스가 임계 구역에 진입하기 전 호출
      • 임계 구역이 잠겨 있다면 열릴 때까지 반복적으로 확인 ⇒ 바쁜 대기(busy wait)
      • 임계 구역이 열려 있다면 임계 구역을 잠그는 동작 수행
    • 임계 구역의 잠금을 해체하는 역할 ⇒ release 함수
      • 임계 구역에서의 작업이 끝나고 호출
      • 잠긴 임계 구역을 여는 동작 수행
  • 하나의 공유 자원에 접근하는 프로세스를 상정한 방식

세마포

  • semaphore
  • 뮤텍스 락과 비슷하지만 더 일반화된 방식
  • 공유 자원이 여러 개 있는 상황에서 적용 가능한 동기화 도구
  • 임계 구역 앞뒤로 wait과 signal 함수를 매번 올바르게 명시해야 한다는 단점 존재

상호 배제를 위한 동기화

  • 카운팅 세마포를 이용한 단순한 구성
    • 임계 구역에 진입할 수 있는 프로세스의 개수 ⇒ 전역 변수 S
      • 사용할 수 있는 공유 자원의 개수를 나타냄
    • 임계 구역 진입 가능 여부를 알리는 신호 ⇒ wait 함수
      • 만일 S가 0 이하라면 반복적으로 자원을 확인 ⇒ 바쁜 대기
      • S가 1 이상인 경우 1만큼 감소시키고 임계 구역 진입
    • 임계 구역을 기다리는 프로세스에 주는 허락 신호 ⇒ signal 함수
      • 임계 구역에서의 작업을 마치고 S를 1만큼 증가
  • 바쁜 대기는 CPU 주기를 낭비하므로 더 효율적인 방법 활용
    1. wait 함수는 사용할 수 있는 자원이 없는 경우 해당 프로세스를 대기 상태로 전환하고, 프로세스의 PCB를 세마포를 위한 대기 큐에 추가
    2. 다른 프로세스가 임계 구역에서 작업을 끝내고 signal 함수를 호출
    3. signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스를 준비 상태로 전환한 뒤 준비 큐로 옮김

실행 순서 제어를 위한 동기화

  • 카운팅 세마포를 이용한 방법
    1. 세마포의 변수 S를 0으로 설정
    2. 먼저 실행할 프로세스(P1) 뒤에 signal 함수를, 다음에 실행할 프로세스(P2) 앞에 wait 함수를 붙임

P2를 P1보다 먼저 실행해도 반드시 P1이 먼저 실행된다.

모니터

  • 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리
    • 프로세스는 반드시 인터페이스를 통해 공유 자원에 접근
  • 모니터의 역할
    • 모니터에 진입하기 위한 큐 생성
      • 이 큐에서 공유 자원을 다루는 인터페이스로 접근 가능
    • 모니터는 공유 자원에 접근하려는 프로세스를 큐에 삽입
      • 큐에 삽입된 순서대로 공유 자원을 이동
      • 모니터 안에 하나의 프로세스만 접근할 수 있도록 제어(상호 배제를 위한 동기화)

실행 순서 제어를 위한 동기화

  • 조건 변수를 이용하면 모니터가 특정 프로세스를 일시 중단 가능
    • 조건 변수: 프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수
  • 조건 변수를 통해 wait, signal 연산 실행 가능(조건변수.wait(), 조건변수.signal())
    • wait 연산
      • 조건변수.wait()을 호출한 프로세스를 대기 상태로 전환하고, 일시적으로 조건 변수에 대한 대기 큐에 삽입
      • 모니터의 상호 배제를 위한 큐가 비게 되므로 다른 프로세스가 모니터로 접근 가능
      • 특정 프로세스가 아직 실행될 조건을 충족하지 않았을 때 wait을 통해 실행 중단
    • signal 연산
      • 조건변수.signal()를 호출하면 해당 조건 변수에 대해 대기 상태에 있던 프로세스를 다시 모니터로 들여옴
      • 특정 프로세스가 실행될 조건을 충족했을 때 signal을 통해 실행 재개
This post is licensed under CC BY 4.0 by the author.