운영체제의 프로세스 관리 서비스 중 가장 중요한 두 가지를 꼽자면 스케줄링과 동기화이다. 이번에는 동기화에 대해 알아보자!
동기화의 의미
- 프로세스 사이의 수행 시기를 맞추는 것을 프로세스 동기화(synchronization)라고 한다.
- 프로세스뿐 아니라 스레드 또한 동기화의 대상이다.
- 동기화는 특정 자원에 접근할 때 한 개의 프로세스만 접근하게 하거나, 프로세스를 올바른 순서대로 실행하게 하는것을 의미한다.
- 프로세스들 사이의 수행 시기를 맞추는 것은 2가지로 정의할 수 있다.
- 실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기
- 상호 배제 : 동시에 접근해서는 안되는 자원에 하나의 프로세스만 접근하게 하기
1. 실행 순서 제어를 위한 동기화
- 동시에 실행되는 프로세스를 올바른 순서대로 실행하는 것을 말한다.
- 프로세스들에 따라서 아무 순서대로 실행되어선 안되는 프로세스가 있다. 특정 조건이 만족되어야만 실행을 이어나갈 수 있기도 하다.
2. 상호 배제(mutual exclusion)를 위한 동기화
- 동시에 접근하지 못하게 하는 것을 상호 배제를 위한 동기화이다.
- 공유가 불가능한 자원의 동시 사용을 피하기 위해 사용하는 알고리즘이다.
+) 생산자와 소비자 문제
- 상호 배제를 위한 동기화의 유명한 문제이다. 아래와 같이 알아보자.
- 생산자와 소비자,
총합 = 10;
생산자()
{
버퍼에 데이터 삽입
'총합' 변수 1 증가
}
소비자()
{
버퍼에서 데이터 빼내기
'총합' 변수 1 감소
}
- 이를 동시에 실행하면 언뜻 보기에는 코드에 아무런 문제가 없어 보이지만, 막상 실행해보면 예상치 못한 결과를 얻을 수 있다.
- 이는 두 프로세스가 제대로 동기화되지 않았기 때문에 발생한 문제이다. 동시에 접근해서는 안되는 자원에 동시에 접근했기 때문에 발생한 문제라고 볼 수 있다.
공유 자원과 임계 구역
그렇다면 동시에 접근해서는 안되는 자원이라는게 뭘까?
- 프로세스에서 공동으로 접근할 수 있는 자원을 공유 자원(shared resource)라고 한다.
- ex. 전역 변수, 파일, 입출력장치, 보조기억장치 등
- 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 임계 구역(critical section)라고 한다.
- 두 개 이상의 프로세스가 임계 구역에 진입하려 하면 둘 중 하나는 대기해야한다.
- 임계 구역에 먼저 진입한 프로세스의 작업이 마무리 되면 그제서야 다른 프로세스가 임계 구역에 진입할 수 있다.
- 여러 프로세스가 동시 다발적으로 임계 구역의 코드를 실행하는 경우를 레이스 컨디션(race condition)라고 한다.
- 레이스 컨디션이 발생하면 데이터의 일관성이 깨지는 문제가 발생한다.
- 컴퓨터는 고급 언어가 아닌 저급 언어를 실행하기 때문에 여러 줄의 저급 언어로 변환된 고급 언어 한 줄을 실행하는 과정에서 문맥 교환이 일어나며 문제가 생길 수 있다. 상호 배제를 위한 동기화는 이와 같은 일이 발생하지 않도록 관리한다.

임계 구역 문제를 해결하기 위한 세 가지 원칙
- 상호 배제(mutual exclusion) : 한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 임계 구역에 들어올 수 없다.
- 진행(progress) : 임계 구역에 어떤 프로세스도 진입하지 않았다면 임계 구역에 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- 유한 대기(bounded waiting) : 한 프로세스가 임계 구역에 진입하고 싶다면 그 프로세스는 언젠가는 임계 구역에 들어올 수 있어야 한다.