운영체제의 프로세스 관리 서비스 중 가장 중요한 두 가지 축은 스케줄링(Scheduling)과 동기화(Synchronization)입니다.
현대의 운영체제에서는 수많은 프로세스가 동시다발적으로 실행됩니다. 이들은 독립적으로 작동하기도 하지만, 공동의 목적을 위해 서로 협력하며 자원을 공유하기도 합니다. 이 과정에서 실행 순서의 질서를 잡고 자원의 일관성을 보장하기 위해 반드시 필요한 것이 바로 동기화입니다.
동기화의 사전적 의미는 '작업들 사이의 수행 시기를 맞추는 것'입니다. 프로세스 관리 측면에서 동기화는 크게 두 가지 목적을 가집니다.
프로세스가 올바른 순서대로 실행되도록 조정하는 것입니다. 데이터가 준비되지 않았는데 읽으려 하거나, 처리가 끝나지 않았는데 다음 작업을 수행하면 오류가 발생합니다.
예시: Reader & Writer
- Writer 프로세스:
Book.txt파일에 값을 저장합니다.- Reader 프로세스:
Book.txt파일의 내용을 읽습니다.- 동기화: 반드시 Writer가 값을 다 저장한 후에 Reader가 읽어야 올바른 정보를 얻을 수 있습니다.
공유가 불가능한 자원에 동시에 접근하는 것을 막는 것입니다.
예시: 은행 계좌 잔액 문제
- 현재 잔액: 10만 원
- 프로세스 A: 2만 원 입금 (읽기 → 더하기 → 쓰기)
- 프로세스 B: 5만 원 입금 (읽기 → 더하기 → 쓰기)
- 기대 결과: 17만 원
- 동기화 실패 시: A와 B가 잔액 '10만 원'을 동시에 읽어가서 각자 계산 후 저장하면, 최종 잔액이 12만 원이나 15만 원이 되는 오류가 발생할 수 있습니다.
동기화 문제를 이해하기 위해서는 다음의 핵심 용어들을 이해해야 합니다.
여러 프로세스가 공동으로 이용하는 변수, 메모리, 파일, 입출력 장치 등을 말합니다.
공유 자원 중에서도 두 개 이상의 프로세스가 동시에 접근하면 문제가 발생하는 자원에 접근하는 코드 영역을 말합니다.

잘못된 동기화로 인해 여러 프로세스가 동시다발적으로 임계 구역의 코드를 실행하여, 데이터의 일관성이 깨지는 문제 상황을 의미합니다.
고급 언어(C, Java, Python 등)의 한 줄 코드는 컴퓨터 내부에서 여러 줄의 저급 언어(기계어/어셈블리어)로 변환되어 실행됩니다.
총합을 1 증가시키는 코드 (count++)count 값을 레지스터로 가져옴 (LOAD)이 3단계 과정 중간에 문맥 교환(Context Switch)이 일어나 다른 프로세스가 개입하게 되면, 계산 중간의 덮어씌워지지 않은 값을 읽어가면서 데이터 정합성이 깨지게 됩니다.
운영체제는 임계 구역 문제를 해결하고 올바른 동기화를 달성하기 위해 다음 세 가지 원칙을 반드시 충족해야 합니다.
| 원칙 | 설명 |
|---|---|
| 1. 상호 배제 (Mutual Exclusion) | 한 프로세스가 임계 구역에 진입했다면, 다른 어떤 프로세스도 임계 구역에 들어올 수 없다. (자물쇠 역할) |
| 2. 진행 (Progress) | 임계 구역에 어떤 프로세스도 진입하지 않은 상태라면, 진입하고자 하는 프로세스는 즉시 들어갈 수 있어야 한다. |
| 3. 유한 대기 (Bounded Waiting) | 한 프로세스가 임계 구역에 진입하고 싶다면, 언젠가는 들어갈 수 있어야 한다. (무한정 대기 금지, 기아 현상 방지) |