동기화(Synchronization)란 2개 이상의 프로세스(Process) 또는 쓰레드(Thread)가 공유 메모리에서 어떠한 작업을 수행할 때 각자의 작업을 시기에 맞게 수행하는 것을 동기화라 한다.
간단한 예로 A(쓰기) 프로세스와 B(읽기) 프로세스가 Shared memory에서 어떠한 작업을 수행한다 가정했을 때 A가 먼저 쓰고 그다음 B가 읽기를 수행하면서 작업을 이어 나가야 한다. (하지만 A가 쓰기를 했는지 안 했는지 알 수 없다) 이때 A 작업의 수행 여부를 알려주어 B의 작업을 수행할 것인지 수행 시기를 맞추는 것이 동기화이다.
위 예시처럼 A와 B가 서로 영향을 주고받는 방식을 Cooperating이라 부른다.
프로세스 또는 쓰레드 작업수행에 있어 동기화는 필수적인 존재이다. 이러한 동기화의 목적은 아래와 같다.
임계 구역(Critical section)이란 공유자원에 대하여 프로세스들의 동시접근에 한계가 있는 영역이다.
(여러 프로세스가 데이터를 공유하면서 작업을 수행 할 때, 각 프로세스에서 공유 데이터를 접근하는 프로그램 코드 부분)
임계 구역에서 프로세스들이 동시에 접근해서 작업을 진행한다고 가정했을 때 아래와 같은 문제가 생긴다.
각각의 프로세스가 원하는 결괏값
Shared memory에 접근하여 계산할 경우
프로세스 A가 원하는 sum 값은 270이고, 프로세스 B가 원하는 sum 값은 10이다. 하지만 두 프로세스가 공유 메모리에 동시에 접근해서 작업을 진행할 경우 sum 값은 125가 나온다. 결국 두 프로세스 모두가 원치 않는 결과가 나온다. 이러한 문제를 임계 구역 문제라고 부른다.
임계 구역 문제를 해결하기 위해서는 3가지 조건이 있다.
세마포(Semaphore)는 동기화 문제를 해결하기 위해 만들어진 소프트웨어 도구로 임계 구역에서 여러 프로세스(쓰레드)의 접근을 막아주는 역할을 한다.
간단한 예로 세마포는 화장실의 "사용 중 알리미"로 예를 들 수 있다.
화장실(Shared memory)은 혼자만 사용해야 하는 공간이기 때문에 사람(Process)이 들어가서 사용 중이라는 것을 알려야 한다. 이때 사용하는 것이 알림 문고리(Semaphore)이다.
모니터(Monitor)는 세마포 이후에 등장한 프로세스 동기화 도구로 세마포 보다 고수준의 개념을 지니고 있다.
공유 자원을 내부로 숨김으로써 외부의 접근을 차단하는 방식이다. (별도로 준비한 인터페이스를 통해 공유 자원을 갱신, 데이터를 추출)
요청받은 작업을 모니터 큐에 저장한 뒤 모니터 큐의 데이터를 하나하나 순서대로 처리한다. (결과만 해당 프로세스에 알려줌)