3 minute read

‘혼자 공부하는 컴퓨터구조+운영체제 - 강민철’ 책을 참고하여 작성한 포스트입니다.


동기화

프로세스 동기화란 프로세스들 사이의 수행 시기를 맞추는 것을 의미한다.

  • 다음 두 목표를 위한 동기화가 각각 있다.
    • 실행 순서 제어
      • 프로세스를 올바른 순서대로 실행
    • 상호 배제
      • 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기

실행의 흐름을 갖는 모든 것은 동기화의 대상이다. 프로세스 뿐 아니라 스레드도 해당된다. 여기선 프로세스 동기화로 칭한다.



공유 자원과 임계 구역

  • 동시에 실행되는 프로세스들이 공동의 자원을 두고 작업할 때 이 자원을 공유 자원(shared resource) 라고 한다.
  • 공유 자원은 전역 변수가 될수도 있고, 파일, 입출력장치, 보조기억장치가 될 수도 있다.
  • 동시에 실행하면 문제가 발생하는 공유 자원에 접근하는 코드 영역을 임계 구역(critical section) 이라고 한다.
  • 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우를 레이스 컨디션(race condition) 이라고 한다.
  • 운영체제는 임계 구역 문제를 아래 세 가지 원칙 하에 해결한다.
    • 상호 배제(mutual exclusion)
      • 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 진입할 수 없다.
    • 진행(progress)
      • 임계 구역에 어떤 프로세스도 진입하지 않은 상태면 해당 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
    • 유한 대기(bounded waiting)
      • 한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 그 구역에 들어갈 수 있어야 한다.



동기화 기법

대표적인 도구로 뮤텍스 락, 세마포, 모니터가 있다.

뮤텍스 락

  • 뮤텍스 락(Mutex lock; MUTual EXclusion lock) 은 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구이다. 상호 배제를 위한 동기화 도구이다.
  • 임계 구역에 진입한 프로세스는 뮤텍스 락을 이용해 임계 구역을 잠그고, 작업이 끝나면 임계 구역을 열고 나온다.
  • 단순하게 하나의 전역 변수와 두 개의 함수로 구현 가능하다
    • 자물쇠 역할
      • 프로세스들이 공유하는 lock 전역 변수(bool 값)
    • 임계 구역을 잠그는 역할
      • acquire 함수
        • 프로세스가 임계 구역 진입 전 호출하는 함수이다.
        • 잠겨 있다(lock == true)면 열릴 때까지 임계 구역을 반복적으로 확인하며,
        • 열려 있다(lock == false)면 임계 구역을 잠그는 함수(lock = true)이다.
    • 임계 구역의 잠금을 해제하는 역할
      • release 함수
        • 잠긴 임계 구역을 열어주는 함수(lock = false)
  • aquire 함수는 임계 구역이 열려 있는 지 계속해서 반복하며 확인해 보는데, 이런 대기 방식을 바쁜 대기(busy wait) 라고 한다.

세마포(semaphore)

  • 뮤텍스 락과 비슷하지만 좀 더 일반화된 방식의 동기화 도구이다.
  • 여러 개의 공유 자원이 있는 상황에서도 적용이 가능하다.

세마포에 이진 세마포(binary semaphore)와 카운팅 세마포(counting semaphore)가 있는데, 이진 세마포는 뮤텍스 락과 비슷한 개념이다.

  • 단순하게 하나의 변수와 두 개의 함수로 구현 가능하다
    • 전역 변수 S
      • 임계 구역에 진입 가능한 프로세스의 개수
      • 사용 가능한 공유 자원의 개수와 같다
    • 임계 구역에 들어갈 수 있는 지 알려주는 wait 함수
    • 임계 구역 앞에서 기다리는 프로세스에 진입 가능하다고 신호를 주는 signal 함수
  • 예를 들어 S가 3이라면, 프로세스 하나가 진입할 때마다 S를 1 감소시킨다. S가 0이 되면 임계 구역에 더이상 프로세스가 진입이 불가능하다. 이미 진입한 프로세스가 작업 을 종료하고 signal 함수를 호출하면 S를 1증가 시키며, 대기하던 프로세스가 진입 가능해진다.
  • 실제로 세마포는 바쁜 대기 현상을 해결하기 위해 wait 함수가 임계 구역에 프로세스가 진입이 불가능한 상태라면 프로세스를 대기 상태로 만들고 PCB를 세마포를 위한 대기 큐에 집어 넣는다. signal 함수가 호출되면 대기 큐에서 프로세스를 꺼내 준비 상태로 변경하고 준비 큐로 옮긴다.
  • wait, signal 함수로 동시에 실행되는 프로세스의 실행 순서도 제어할 수 있다.

모니터(moniter)

  • 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리하며, 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다.
  • 인터페이스에 접근하고자 하는 프로세스를 큐(모니터에 진입하기 위한 큐)에 삽입하고, 순서대로 하나씩 공유 자원을 이용하도록 한다.
  • 모니터에 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공한다.
  • 또한 실행 순서 제어를 위한 동기화 제공을 위해 조건 변수(condition variable) 사용한다.
  • 모니터에 진입한 프로세스는 wait이 호출되면 조건 변수에 대한 큐(모니터에 진입하기 위한 큐-상호배제를 위한 큐와는 다르다)에 삽입되어 일시적으로 대기 상태로 전환된다. 모니터는 다시 비게 된다. 다른 프로세스의 signal 연산을 통해 조건 변수에 대한 큐에 대기상태로 있는 프로세스의 실행이 재개될 수 있다.

c++로 구현한 synchroninzation 예시 - 혼공컴운 깃헙

동기화는 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나 프로세스를 올바른 순서대로 실행하게 하는 것.

공유자원은 공동으로 사용하는 자원

임계 구역은 공유 자원에 접근하는 코드 중 동시에 실행하면 문제가 발생하는 코드 영역

상호 배제는 한 프로세스가 임계 구역에서 작업 중이면 다른 프로세스가 해당 임계 구역에 들어갈 수 없도록 제어하는 것

뮤텍스 락은 임계 구역을 잠금으로써 프로세스 간의 상호 배제를 이룬다

세마포는 공유 자원이 여러 개 있는 임계 구역 문제도 해결할 수 있는 동기화 도구

모니터는 세마포에 비해 사용자가 사용하기 편리한 동기화 도구로 조건 변수를 사용함

Leave a comment