Chapter12 프로세스 동기화

1 동기화란


동시다발적으로 실행되는 프로세스들은 공동의 목적을 올바르게 수행하기 위해 서로 협력하며 영향을 주고 받는다.
이렇게 협력하여 실행되는 프로세스들은 실행 순서와 자원의 일관성을 보장해야 하기에 반드시 동기화 되어야 한다


동기화의 의미

여러 프로세스가 동시에 실행되며 공유 자원에 접근할 경우, 경쟁 상태, 일관성 꺠짐 등의 문제가 발생할 수 있다.
이러한 문제를 해결하기 위해 프로세스 간의 실행 순서를 조정하고, 자원에 대한 접근을 제어하는 과정을 동기화라고 한다.
목적에 따라 두 가지로 나눌 수 있다.

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


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

실행순서제어

두 프로세스는 무작정 아무 순서대로 실행되어서는 안된다.
프로세스 A가 프로세스 B의 결과를 필요로 하는 경우, B가 먼저 실행되어야 한다.
이렇게 프로세스 간의 실행 순서를 조정하는 것을 실행 순서 제어라고 한다.


상호 배제를 위한 동기화

상호 배제는 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘이다.

동기화전
동기화후


생산자와 소비자 문제

상호 배제를 위한 동기화 대표적 예제
생산자는 데이터를 버퍼에 넣고, 소비자는 데이터를 버퍼에서 빼는 역할

생산자소비자
생산자소비자
생산자소비자

생산자와 소비자가 동시에 버퍼 접근 시…
데이터 충돌 : 동시에 같은 공간에 접근해 값이 꼬인다.
데이터 유실 : 데이터가 덮어써지거나 중복 사용된다.
동시에 접근해서는 안되는 자원에 동시에 접근했기에 발생한 문제… 이때 버퍼가 가득 찼을때 생산자는 대기하고, 버퍼가 비었을 때 소비자는 대기해야 한다.


공유 자원과 임계 구역

공유 자원

여러 프로세스가 동시에 접근할 수 있는 자원

임계 구역

동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

생산자소비자

레이스 컨디션

잘못된 실행으로 인해 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우
레이스 컨디션의 근본적인 이유는 “고급 언어는 실행 과정에서 저급 언어로 변환되어 실행되기 때문”이다.

생산자소비자 생산자소비자

상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 두 개 이상의 프로세스가 임계 구역에 동시에 접근하지 못하도록 관리하는 것을 의미한다.
운영체제는 이러한 임계 구역 문제를 세 가지 원칙 하에 해결한다.
상호 배제 : 두 개 이상의 프로세스가 동시에 임계 구역에 접근하지 못하도록 한다.
진행 : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
유한 대기 : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 진입할 수 있어야 한다.(무한 대기 방지)


2 동기화 기법

프로세스의 동기화는 어떻게 이루어 지는가?
동기화를 위한 대표적인 도구를 알아보자!


뮤텍스 락

뮤텍스락

뮤텍스 락은 상호 배제를 위한 동기화 도구이다.
임계 구역에 접근하기 전에 락을 걸고, 임계 구역을 벗어나면 락을 해제한다.

accqire() 함수

accqire

프로세스가 임계 구역에 진입하기 전에 호출하는 함수이다.
임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지 반복적으로 확인한다.(lock이 false가 될 때까지…)
이런 대기 방식을 바쁜 대기라고 한다. 임계 구역이 열려 있다면 잠그는 함수이다.(lock을 ture로 바꾼다)

release() 함수

release

임계 구역에서의 작업이 끝나고 호출하는 함수이다.
현재 잠긴 임계 구역을 열어주는 함수라고 보면 된다.(lock을 false로 바꾼다)


세마포

뮤텍스 락과 비슷하지만, 조금 더 일반화된 방식의 동기화 도구이다.
뮤텍스 락은 오직 하나의 프로세스만 임계 구역에 접근할 수 있도록 하는 반면, 세마포는 여러 프로세스가 동시에 접근할 수 있도록 한다.
세마포

전역 변수 S : 임계 구역에 진입할 수 있는 프로세스의 개수
wait 함수 : 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 함수
signal 함수 : 임계 구역 앞에서 기다리는 프로세스에 ‘이제 가도 좋다’고 알려주는 함수

waitsignal

wait

  1. 임계 구역에 진입할 수 있는 프로세스 개수가 0 이하일때
  2. 사용할 수 있는 자원이 있는지 반복적으로 확인
  3. 임계 구역에 진입할 수 있는 프로세스 개수가 1 이상일 때, 전역 변수 S를 1 감소시키고 임계 구역에 진입한다.

signal

  1. 임계 구역에서 작업을 마치면, 전역 변수 S를 1 증가시킨다.

p1p2p3

  1. 프로세스 P1이 임계 구역에 진입한다. S는 1로 감소한다.
  2. 프로세스 P2가 임계 구역에 진입한다. S는 0으로 감소한다.
  3. 프로세스 P3가 임계 구역에 진입하려고 한다. S는 0이기에 대기한다.
  4. 프로세스 P1이 임계 구역에서 작업을 마치고 S를 1로 증가시킨다.
  5. 프로세스 P3가 대기에서 벗어나 임계 구역에 진입한다. S는 0으로 감소한다.

여기서 문제 발생..!
사용할 수 있는 공유 자원이 없는 경우 프로세스는 무한히 반복하며 S를 확인하게 된다.
이렇게 바쁜 대기를 하는 것은 CPU 자원을 낭비하는 행위이다.

p1p2p3

  1. 프로세스 P1이 임계 구역에 진입한다. S는 1로 감소한다.
  2. 프로세스 P2가 임계 구역에 진입한다. S는 0으로 감소한다.
  3. 프로세스 P3가 임계 구역에 진입하려고 한다. S는 -1이 되고 PCB를 대기 큐에 넣고 대기한다.
  4. 프로세스 P1이 임계 구역에서 작업을 마치고 S를 0으로 증가시킨다.
  5. 프로세스 P3가 대기 큐에서 꺼내지고 임계 구역에 진입한다.
  6. 프로세스 P2가 임계 구역에서 작업을 마치고 S를 1으로 증가시킨다.
  7. 프로세스 P3가 임계 구역에서 작업을 마치고 S를 2으로 증가시킨다.

모니터

세마포의 불편한 점을 해결하기 위해 최근에 등장한 동기화 도구이다.

p1p2p3

공유 자원과 공유 자원에 접근하기 위한 인터페이스를 묶어 관리한다.
프로세스는 반드시 인터페이스를 통해서만 공유 자원에 접근할 수 있다.

p1p2p3
p1p2p3

모니터를 통해 공유 자원에 접근하고자 하는 프로세스를 큐에 삽입한다.
큐에 삽입된 순서대로 하나씩 공유 자원을 이용하도록 한다.
즉, 모니터는 공유 자원을 다루는 인터페이스에 접근하기 위한 큐를 만들고, 모니터 안에 항상 하나의 프로세스만 들어오도록 하여 상호 배제를 위한 동기화를 제공한다.

p1p2p3 \

세마포와 마찬가지로 실행 순서 제어를 위한 동기화도 제공한다.
조건 변수를 사용하여 프로세스를 실행하고 일시 중단 한다.
조건 변수로는 wait()signal() 연산을 수행할 수 있다.

p1p2p3
p1p2p3

  1. 특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait()을 통해 실행을 중단한다.
  2. 특정 프로세스가 실행될 조건이 되었다면 signal()을 통해 실행을 재개한다.

Leave a comment