Skip to main content

프로세스 동기화

개요

프로세스 동기화는 다중 프로세스 환경에서 여러 프로세스가 공유 자원에 접근할 때 발생할 수 있는 충돌과 비일관성을 방지하기 위한 기법이다. 동기화는 프로세스들이 특정 순서로 자원에 접근하도록 조정함으로써 데이터의 무결성과 시스템의 안정성을 유지할 수 있다.

  • 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
  • 상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

공유 자원과 임계 구역

공유 자원

공유 자원은 동시에 실행되는 프로세스들이 공유하는 자원이다. 예를 들어, 파일, 데이터베이스, 프린터, 메모리 등이 공유 자원의 예이다. 공유 자원에 대한 동시 접근은 데이터 불일치, 손상, 예기치 않은 동작을 초래할 수 있다.

임계 구역

임계 구역은 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역이다. 한 번에 하나의 프로세스만 접근할 수 있도록 해야 한다. 임계 구역을 보호하지 않으면 동시 접근으로 인한 문제가 발생할 수 있다.

컴퓨터는 고급 언어가 아닌 저급 언어를 실행하기 때문에 여러 줄의 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정에서 컨텍스트 스위칭이 일어날 수 있다.

여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행할 때 레이스 컨디션(Race Condition)이 발생할 수 있다.

운영체제는 이러한 임계 구역 문제를 아래 세 가지 원칙 하에 해결한다.

  • 상호 배제(Mutual Exclusion) : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
  • 진행 (Progress) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
  • 유한 대기(Bounded Wating) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다. (임계 구역에 들어오기 위해 무한정 대기해서는 안 된다.)

동기화 기법

뮤텍스 락 (Mutex Lock, MUTual EXclusion Lock)

뮤텍스 락(Mutex Lock, MUTual EXclusion Lock)은 임계 구역에 대한 접근을 제어하기 위해 사용되는 동기화 기법이다. 뮤텍스는 상호 배제를 보장하며, 하나의 프로세스만이 임계 구역에 진입할 수 있도록 한다.

동작 원리

  • 락 획득(Lock Acquisition) : 프로세스가 임계 구역에 진입하려면 먼저 락을 획득해야 한다. 이미 다른 프로세스가 락을 소유하고 있다면, 현재 프로세스는 락을 사용할 수 있을 때까지 대기한다.
  • 락 해제(Lock Release) : 임계 구역을 벗어나면 프로세스는 락을 해제하여 다른 프로세스가 임계 구역에 진입할 수 있도록 한다.
acquire() {
while (lock == true)
;
lock = true;
}

release() {
lock = false;
}

acquire와 release 함수를 임계 구역 전후로 호출함으로써 하나의 프로세스만 임계 구역에 진입할 수 있다.

acquire();

// 임계 구역

release();

뮤텍스 락처럼, 임계 구역이 잠겨 있을 경우 프로세스가 계속해서 임계 구역에 접근 가능할 때까지 반복적으로 접근 가능 여부를 확인하는 대기 방식을 바쁜 대기(Busy Wait)라고 한다.

세마포어 (Semaphore)

세마포어(Semaphore)는 동기화를 위한 변수로, 프로세스 간의 접근을 제어하는 데 사용된다. 세마포어는 뮤텍스보다 더 일반적인 개념으로, 여러 프로세스가 공유 자원에 접근할 수 있는 경우에 사용된다.

종류

  1. 이진 세마포어(Binary Semaphore) : 값이 0 또는 1만 가질 수 있는 세마포어로, 뮤텍스와 유사하게 동작한다.
  2. 카운팅 세마포어(Counting Semaphore) : 0 이상의 정수 값을 가질 수 있으며, 동시에 접근할 수 있는 프로세스의 수를 제한할 때 사용된다.

동작 원리

  • wait 함수 : 세마포어 값을 감소시키며, 값이 음수가 되면 프로세스는 블록된다.
  • signal 함수 : 세마포어 값을 증가시키며, 블록된 프로세스를 깨운다.

wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다. 그리고 다른 프로세스가 임계 구역에서의 작업이 끝나고 signal 함수를 호출하면 signal 함수는 대기 중인 프로세스를 대기 큐에서 제거하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮겨준다.

wait() {
S--;
if (S < 0) {
add this process to Queue;
sleep();
}
}

signal() {
S++;
if (S <= 0) {
remove a process p from Queue;
wakeup(p)
}
}

모니터 (Monitor)

모니터(Monitor)는 프로그래밍 언어 수준에서 제공되는 동기화 기법으로, 상호 배제와 조건 변수를 통해 동기화를 구현한다. 모니터는 공유 자원에 대한 접근을 자동으로 제어하여, 개발자가 직접 락을 관리할 필요를 줄여준다.

동작 원리

  • 상호 배제 : 모니터 내의 메서드는 자동으로 상호 배제가 보장된다. 한 번에 하나의 프로세스만 모니터의 메서드를 실행할 수 있다.
  • 조건 변수 : 프로세스가 특정 조건이 만족될 때까지 기다릴 수 있도록 한다. 조건이 만족되면 다른 프로세스가 해당 조건을 신호(signal)하여 대기 중인 프로세스를 깨운다.

모니터는 공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다. 그리고 프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근하도록 한다. 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐(모니터에 진입하기 위한 큐)를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공한다.

교착 상태

교착 상태(Deadlock)는 두 개 이상의 프로세스가 서로 상대방이 점유하고 있는 자원을 기다리면서 무한히 대기하는 상태를 말한다.

교착 상태 발생 조건

교착 상태는 아래 네 가지 조건이 모두 만족할 때 발생한다.

  1. 상호 배제 : 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때, 즉 상호 배제 상황에서 교착 상태가 발생할 수 있다.
  2. 점유와 대기 : 어떠한 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다린다면 교착 상태가 발생할 수 있다.
  3. 비선점 : 어떤 프로세스도 다른 프로세스의 자원을 강제로 빼앗지 못할 때 교착 상태가 발생한다.
  4. 원형 대기 : 프로세스 간에 순환적인 자원 대기 관계가 존재할 때 교착 상태가 발생한다.

교착 상태 해결 방법

예방

교착 상태의 발생 조건을 원천적으로 제거하여 교착 상태를 사전에 방지하는 예방 방식은 여러 부작용이 따를 수 있다.

  1. 점유와 대기 제거 : 점유와 대기를 제거하면 운영체제는 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분한다. 하지만 자원의 활용률이 낮아진다.
  2. 비선점 조건 제거 : 모든 자원이 선점 가능한 것은 아니기 때문에 범용성이 떨어진다.
  3. 원형 대기 조건 제거 : 자원에 고유한 순서를 부여하고, 프로세스가 자원을 순서대로 요청하도록 한다. 수많은 자원에 번호를 붙여야하는 비용이 발생한다.

회피

교착 상태 회피는 교착 상태가 발생할 가능성을 미리 예측하고, 자원의 할당을 신중하게 수행하여 교착 상태를 방지하는 기법이다. 회피 기법은 시스템이 자원을 요청받았을 때 교착 상태가 발생할지 여부를 계산하고, 교착 상태가 발생할 수 있는 상황이라면 자원 할당을 거부한다.

은행원 알고리즘 (Banker's Algorithm)

은행원 알고리즘은 자원 관리와 교착 상태 회피를 위해 가장 널리 사용되는 기법 중 하나이다. 이 알고리즘은 프로세스가 자원을 요청할 때, 시스템이 그 요청을 처리한 후에도 안정 상태(Safe State)를 유지할 수 있는지 여부를 계산한다. 안정 상태란, 시스템이 자원을 할당한 후에도 모든 프로세스가 교착 상태에 빠지지 않고 종료될 수 있는 상태로 안전 순서열이 존재하는 상태를 의미한다. 안전 순서열(Safe Sequence)은 교착 상태 없이 안전하게 프로세스들이 자원을 할당할 수 있는 순서이다.

  • 프로세스의 최대 자원 요구량현재 할당된 자원을 바탕으로 자원이 할당된 후에도 시스템이 안정 상태를 유지할 수 있는지 판단한다.
  • 안정 상태일 경우 자원을 할당하고, 그렇지 않으면 할당을 거부하여 교착 상태를 회피한다.

안전 순서열이 있는 상태

프로세스요구량현재 사용량
P1105
P242
P392

총 자원의 양 : 12

현재 가용 자원 : 3

안전 순서열 : P2 -> P1 -> P3

  • P2에 자원 2개 배분 -> P2 자원 4개 반환 -> 가용 자원 5개
  • P1에 자원 5개 배분 -> P1 자원 10개 반환 -> 가용 자원 10개
  • P3에 자원 9개 배분

안전 순서열이 없는 상태

프로세스요구량현재 사용량
P1105
P242
P393

총 자원의 양 : 12

현재 가용 자원 : 2

검출 후 회복

검출 후 회복 방식에서 운영체제는 프로세스들이 자원을 요구할 때마다 모두 할당하며, 교착 상태 발생 여부를 주기적으로 검사한다. 그리고 교착 상태가 검출되면 교착 상태에서 벗어나기 위한 조치를 취한다.

  1. 프로세스 종료 : 교착 상태에 관련된 프로세스 중 일부를 강제로 종료하여 자원을 해제하는 방식이다. 교착 상태에서 빠져나오기 위한 가장 간단한 방법이지만, 종료되는 프로세스 작업이 손실될 수 있다.
  2. 자원 선점 : 교착 상태를 해소하기 위해 현재 자원을 점유하고 있는 프로세스로부터 자원을 빼앗고, 이를 다른 프로세스에 할당하는 방식이다.

참조

https://www.hanbit.co.kr/store/books/look.php?p_code=B9177037040&utm_source=hongong

https://csnote.net