혼자공부하는 컴퓨터구조 + 운영체제제책으로 공부한 내용을 정리한 글입니다.
동기화란
운영체제가 프로세스를 관리하는 서비스 중 중요한 두 가지는 스케줄링과 동기화입니다.
- 앞에서는 "스케줄링"에 대해 공부했는데, 이제는 "동기화"에 대해 알아봅니다.
- 즉, 여러 프로세스가 동시에 실행될 때 서로 영향을 주지 않도록 순서나 자원 접근을 조절하는 것이 동기화입니다.
동기화의 의미
현대의 컴퓨터 시스템은 여러 프로세스를 동시에 실행하는 구조입니다. 예를 들어:
- 두 개 이상의 프로세스가 같은 데이터를 읽거나 쓸 수 있습니다.
- 또는 한 프로세스가 수행하는 작업이 다른 프로세스에게 영향을 줄 수도 있습니다.
이때 발생할 수 있는 문제를 방지하기 위해 프로세스 간의 실행을 조율하는 방법, 즉 "동기화"가 필요합니다.
예를 들어:
- 어떤 파일을 읽고 쓰는 프로세스가 있을 때, 먼저 쓰고 나중에 읽어야 하는데
- 동시에 실행되면 읽는 프로세스가 잘못된 데이터를 읽을 수도 있습니다.
이처럼 두 프로세스가 어떤 순서로 실행되어야 하거나,
서로 동시에 같은 자원을 사용해서는 안 되는 상황에서, 운영체제는 동기화 기법을 제공합니다.
동기화가 필요한 경우
- 실행 순서 제어
- 어떤 프로세스들이 순차적으로 실행되어야 할 때 순서를 조절하는 것
- 예: 파일에 먼저 쓰고 그 다음 읽는 순서를 지켜야 할 때
- 상호 배제(Mutual Exclusion)
- 둘 이상의 프로세스가 동시에 같은 자원을 사용하지 못하도록 제한하는 것
- 예: 같은 변수나 파일을 동시에 접근하면 데이터가 꼬일 수 있으므로, 한 프로세스만 접근하게 해야 함
동기화는 단지 프로세스 간 순서를 조정하는 것뿐 아니라, 스레드(thread) 간의 실행 조정에도 매우 중요합니다.
특히 자바 같은 언어에서 멀티스레드 프로그래밍을 할 때 필수 개념입니다.
- A, B, C, D 프로세스가 따로따로 있을 때, 서로 조율 없이 실행되면 경쟁 상태(race condition)가 발생할 수 있음
- 동기화를 하지 않으면 각자 다른 순서로 실행되고, 결과가 달라질 수 있음
실행 순서 제어와 상호 배제 예시
🔸예제: Reader와 Writer 프로세스
- Writer 프로세스는 Book.txt라는 파일에 데이터를 씁니다.
- Reader 프로세스는 같은 Book.txt 파일에서 데이터를 읽습니다.
- 이 두 프로세스가 무작위로 실행되면 어떤 일이 일어날 수 있을까요?
문제 상황
만약 Reader가 먼저 실행되어 쓰기 이전의 파일을 읽게 된다면, Writer가 쓴 정보가 반영되지 않은 잘못된 파일 상태를 읽게 됩니다.
- 위쪽: Book.txt라는 공유 자원이 있고
- 아래쪽 화살표: 좌측에서 Reader, 우측에서 Writer가 각자 이 파일을 접근
이처럼 두 프로세스가 같은 자원을 사용할 때, 동기화가 없으면 데이터의 일관성이 깨질 수 있습니다.
실제 실행 순서 비교
❌ 동기화가 이루어지지 않은 경우

동기화가 이루어진 경우

생산자와 소비자 문제
생산자와 소비자 문제란?
- 운영체제에서 동기화가 필요한 대표적인 문제 상황 중 하나입니다.
- 두 개의 프로세스가 존재합니다:
- 생산자(producer): 데이터를 생성하여 버퍼에 넣습니다.
- 소비자(consumer): 버퍼에서 데이터를 꺼내 소비합니다.
문제 발생 가능성
두 프로세스가 공유 자원인 버퍼(buffer)를 동시에 사용할 때 다음과 같은 문제가 발생할 수 있습니다:
- 생산자가 데이터를 삽입하려고 하는데 버퍼가 가득 찬 경우
- 소비자가 데이터를 꺼내려고 하는데 버퍼가 비어 있는 경우
- 둘이 동시에 접근하여 데이터 손상이나 충돌이 생기는 경우
- 이 문제는 공유 자원에 여러 프로세스가 접근할 때 발생하는 전형적인 동기화 문제입니다.
- 따라서 동기화 기법을 통해 두 프로세스가 순차적으로 또는 서로 기다리며 자원에 접근하게 만들어야 합니다.
코드
생산자
생산자() {
버퍼에 데이터 삽입
"총합" 변수 1 증가
}
소비자
소비자() {
버퍼에서 데이터 꺼내기
"총합" 변수 1 감소
}
설명
- 여기서 총합 변수는 버퍼에 현재 들어 있는 아이템의 수를 나타냅니다.
- 생산자는 생산 후 총합을 증가시키고, 소비자는 소비 후 총합을 감소시킵니다.
- 하지만 동기화가 없다면, 총합이 잘못 계산되거나 충돌이 발생할 수 있습니다.
공유 자원과 임계 구역
공유 자원 (Shared Resource)
- 동시에 여러 프로세스가 접근하는 공동으로 사용하는 자원입니다.
- 예시: 버퍼, 파일, 전역 변수 등
임계 구역 (Critical Section)
- 공유 자원에 접근하는 코드 영역을 의미합니다.
- 임계 구역 안에서는 한 번에 하나의 프로세스만 실행되어야 합니다.
임계 구역 문제 해결의 핵심
- 두 개 이상의 프로세스가 동시에 임계 구역에 들어오면 데이터 일관성이 깨짐
- 그래서 운영체제는 임계 구역 문제를 해결하는 기법을 갖고 있습니다.
레이스 컨디션 (Race Condition)
- 두 개의 프로세스가 임계 구역을 서로 경합하듯 동시에 실행하려고 할 때 발생
- 실행 순서에 따라 결과가 달라지는 비결정적 상황
- 이 문제를 해결하려면 서로 번갈아 가며 임계 구역을 실행하게 해야 합니다.
총합 변수 증가/감소 예시 코드 분석
총합 1 증가 코드
r1 = 총합; // 총합을 레지스터 r1에 복사
r1 = r1 + 1; // r1 값을 증가
총합 = r1; // 다시 메모리에 저장
총합 1 감소 코드
r2 = 총합; // 총합을 레지스터 r2에 복사
r2 = r2 - 1; // r2 값을 감소
총합 = r2; // 다시 메모리에 저장
❗ 문제 상황 (동시에 실행될 때)
프로세스 A와 B가 동시에 총합을 수정하면?

→ 실제로는 한 번 증가, 한 번 감소해서 총합은 10이어야 하는데,
서로 엉켜버려서 총합이 9로 잘못 계산됨
동기화의 세 가지 조건 (상호 배제 해결 조건)
운영체제가 임계 구역 문제를 해결하기 위해 지켜야 할 세 가지 원칙이 있습니다:
상호 배제 (Mutual Exclusion)
- 한 프로세스가 임계 구역에 진입했으면
- 다른 프로세스는 절대 들어올 수 없다
진행 (Progress)
- 어느 누구도 임계 구역에 들어가지 않은 상태일 때
- 진입하고자 하는 프로세스가 있다면, 진입할 수 있어야 한다
유한 대기 (Bounded Waiting)
- 한 프로세스가 임계 구역에 들어가고 싶어 할 때
- 언젠가는 반드시 들어갈 수 있어야 한다
- 즉, 무한정 기다리는 일이 생기면 안 된다
이 세 가지 조건을 만족해야만 진정한 의미의 동기화가 이루어졌다고 할 수 있습니다.
'OS' 카테고리의 다른 글
교착 상태 (0) | 2025.06.26 |
---|---|
동기화 기법 (0) | 2025.06.25 |
CPU 스케줄링 알고리즘 (0) | 2025.06.24 |
CPU 스케줄링 개요 (0) | 2025.06.24 |
스레드 (0) | 2025.06.24 |