Computer Science/OS

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

seoyeonnn 2024. 6. 15. 17:14

12-1. 동기화란

(1) 동기화의 의미

프로세스 동기화: 프로세스들 사이의 수행 시기를 맞추는 것

- 실행 순서 제어: 프로세스를 올바른 순서대로 실행하기

- 상호 배제: 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기

 

ex. 계좌 잔액 문제

프로세스 A: 현재 저축된 금액에 2만원을 넣는 프로세스

프로세스 B: 현재 저축된 금액에 5만원을 넣는 프로세스

프로세스 A와 B를 동시에 실행할 때, 17만원이 계좌에 남을 것으로 기대되지만 동기화가 제대로 이루어지지 않은 경우 아래와 같이 엉뚱한 결과가 나올 수 있다.

 

A와 B를 올바르게 실행하기 위해서는 한 프로세스가 잔액에 접근했을 때 다른 프로세스는 기다려야 한다.

 

(2) 공유 자원과 임계 구역

공유 자원: 여러 프로세스가 공동으로 이용하는 변수, 파일, 장치 등의 자원

임계 구역(critical section): 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역

두 개 이상의 프로세스가 임계 구역에 진입하고자 하면 둘 중 하나는 대기하고, 임계 구역에 먼저 진입한 프로세스의 작업이 마무리되면 기다렸던 프로세스가 임계 구역에 진입한다.

 

레이스 컨디션(race condition): 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하여 문제가 발생하는 경우

레이스 컨디션이 발생하면 계좌 잔액 문제처럼 데이터의 일관성이 깨지는 문제가 발생한다.

 

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

1. 상호 배제(mutual exclusion): 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.

2. 진행(progress): 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.

3. 유한 대기(bounded waiting): 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.

 

 

12-2. 동기화 기법

(1) 뮤텍스 락

뮤텍스 락(MUTual EXclusionlock): 동시에 접근해서는 안 되는 자원에 동시에 접근하지 않도록 만드는 도구

임게 구역에 진입하는 프로세스는 '내가 지금 임계 구역에 있음'을 알리기 위해 뮤텍스 락을 이용해 임계 구역에 자물쇠를 걸어둘 수 있고, 다른 프로세스는 임게 구역에 잠겨 있다면 기다리고, 잠겨 있지 않다면 임계 구역에 진입할 수 있다.

 

뮤텍스 락의 매우 단순한 형태는 하나의 전역 변수와 두 개의 함수로 구현할 수 있다.

- 프로세스들이 공유하는 전역 변수 lock: 자물쇠 역할

 

- acquire 함수: 임계 구역을 잠그는 역할

프로세스가 임계 구역에 진입하기 전에 호출하는 함수로, 만일 임계 구역이 잠겨 있다면 임계 구역이 열릴 때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인하고, 임계 구역이 열려 있다면 잠그는(lock을 true로 바꾸는) 함수이다.

바쁜 대기(busy wait): 반복적으로 확인하며 대기하는 방식

 

- release 함수: 임계 구역의 잠금을 해제하는 역할

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

 

(2) 세마포

세마포(semaphore): 공유 자원이 여러 개 있는 상황에서도 적용이 가능한 동기화 도구

세마포는 철도 신호기에서 유래한 단어로, '멈춤' 신호와 '가도 좋다'는 신호로서 임계 구역을 관리한다.

 

- 전역 변수 S: 임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)

- wait 함수: 임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 역할

- signal 함수: 임계 구역 앞에서 기다리는 프로세스에게 '이제 가도 좋다'고 신호를 주는 역할

 

바쁜 대기를 반복하는 것은 CPU 주기를 낭비하게 되기 때문에, 실제로 세마포에서 wait 함수는 만일 사용할 수 있는 자원이 없을 경우 해당 프로세스 상태를 대기 상태로 만들고, 그 프로세스의 PCB를 세마포를 위한 대기 큐에 집어넣는다.

그리고 다른 프로세스가 임게 구역에서의 작업이 끝나고 signal 함수를 호출하면 대기 중인 프로세스를 대기 큐에서 제고하고, 프로세스 상태를 준비 상태로 변경한 뒤 준비 큐로 옮긴다.

 

실행 순서 제어를 위해, 세마포의 변수 S를 0으로 두고 먼저 실행할 프로세스 뒤에 signal 함수, 다음에 실행할 프로세스 앞에 wait 함수를 붙인다.

 

(3) 모니터

모니터(monitor): 공유 자원과 공유 자원에 접근하기 위한 인터페이스(통로)를 묶어 관리하는 동기화 도구로, 세마포에 비해 사용자가 사용하기에 훨씬 편리하다.

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

 

모니터는 세마포와 마찬가지로 실행 순서 제어를 위한 동기화도 제공한다.

조건 변수(condition variable): 프로세스나 스레드의 실행 순서를 제어하기 위해 사용되는 특별한 변수

- wait 연산: 호출한 프로세스의 상태를 대기 상태로 전환하고 일시적으로 조건 변수에 대한 대기 큐에 삽입하는 연산

※ 상호 배제를 위한 큐와는 다른 큐

- signal 연산: 대기 상태에 있던 프로세스(wait를 호출하여 큐에 삽입된 프로세스)가 깨어나 실행을 재개하는 연산

 

모니터 안에는 하나의 프로세스만 있기 때문에, wait를 호출했던 프로세스는 signal을 호출한 프로세스가 모니터를 떠난 뒤에 실행되거나, 실행을 일시 중단하고 자신이 실행된 되 다시 signal을 호출한 프로세스의 수행을 재개한다.