[OS] 프로세스 동기화
3줄 요약
프로세스 동기화는 실행 순서를 제어하고 상호 배제를 보장하기 위한 핵심 기술
임계 구역에서의 문제를 방지하기 위해 뮤텍스, 세마포어, 모니터 등의 기법 사용
올바른 동기화를 통해 race condition 방지 및 자원 일관성 확보
💻 컴퓨터 구조 & 운영체제 시리즈
이 시리즈는 『혼자 공부하는 컴퓨터 구조+운영체제』 (강민철 저)
+ 인프런 강의를 기반으로 개인적으로 복습 및 정리한 기록입니다.
🔄 프로세스 동기화
🔹 동기화란?
프로세스들의 수행 시기를 맞추는 기술
- 실행 순서 제어: 프로세스들이 올바른 순서대로 실행되도록 함
- 상호 배제: 동시에 접근하면 안 되는 자원에 하나의 프로세스만 접근하도록 제한
🔸 실행 순서 제어
- Reader-Writer Problem
→ 여러 프로세스가 동시에 실행될 때, 실행 순서를 제어하지 않으면 예상치 못한 결과가 발생
→ 순서를 보장하기 위한 동기화 필요
🔸 상호 배제
Bank Account Problem
→ 공유 자원을 동시에 접근하면 문제 발생
→ 한 번에 하나의 프로세스만 접근해야 하는 자원은 동기화를 통해 보호Producer & Consumer Problem
- 총합 = 10
- 생산자/소비자가 공유 자원(버퍼와 총합 변수)에 동시에 접근
1
2
3
4
5
6
7
8
9
10
11
// 생산자
생산자() {
버퍼에 데이터 삽입
"총합" 변수 1 증가
}
// 소비자
소비자() {
버퍼에서 데이터 빼내기
"총합" 변수 1 감소
}
생산자 100,000번, 소비자 100,000번 수행 시 결과가 항상 0이 되리라는 보장은 없음
→ 동기화되지 않았기 때문에 생기는 문제
🔸 핵심 개념
공유 자원: 여러 프로세스 혹은 스레드가 함께 사용하는 자원
→ 전역 변수, 파일, 입출력 장치, 보조기억장치 등임계 구역 (Critical Section)
→ 동시에 접근 시 자원 일관성이 깨질 수 있는 코드 영역
→ 예: 총합 변수 업데이트 구간Race Condition (경쟁 상태)
→ 둘 이상의 프로세스가 동시에 임계 구역에 접근하여 예기치 못한 결과 발생
✅ 상호 배제의 세 가지 조건
Mutual Exclusion (상호 배제)
→ 임계 구역에 하나의 프로세스만 진입 가능Progress (진행)
→ 임계 구역에 아무도 없을 경우, 진입을 원하는 프로세스는 즉시 진입 가능해야 함Bounded Waiting (유한 대기)
→ 어떤 프로세스도 무한정 대기해서는 안 되며, 언젠가는 진입할 수 있어야 함
🧰 동기화 기법
🔐 뮤텍스 락 (Mutex Lock)
상호 배제를 위한 대표적인 동기화 도구로, 자물쇠 역할을 한다.
- 전역 변수
lock
을 통해 자물쇠 역할 수행 acquire()
함수: 임계 구역 진입 전 자물쇠를 잠금release()
함수: 임계 구역 작업 완료 후 잠금 해제
1
2
3
4
5
6
7
8
9
10
11
12
13
static boolean lock;
static void acquire() {
// 바쁜 대기(busy waiting) 계속 잠겨 있는지 확인
while (lock == true) {
pass;
}
lock = true; // 잠겨 있지 않다면 잠그기
}
static void release() {
lock = false; // 잠금 해제
}
🚦 세마포(어) (Semaphore)
임계 구역 앞에서 진입 가능 여부를 판단하는 동기화 도구
철도 차단기처럼, 자원이 없으면 멈추고 기다림
- 전역 변수
s
: 사용 가능한 자원의 개수 wait()
함수: 자원이 있을 때만 진입 가능 (진입 시 자원 수 감소)signal()
함수: 자원 해제 후 자원 수 증가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int s = 2;
static void wait() {
while (s <= 0) {
pass; // 자원이 없으면 바쁜 대기
}
s--; // 자원 확보
}
// 임계 구역 작업...
static void signal() {
s++; // 자원 해제
}
문제점: busy waiting → CPU 낭비 발생
해결책: 자원이 없을 때 대기 상태로 전환, 자원이 생기면 준비 큐로 복귀
✅ 세마포를 활용한 실행 순서 제어
- 세마포 변수
s = 0
으로 초기화 - 먼저 실행해야 할 프로세스 뒤에
signal()
호출 - 나중에 실행될 프로세스 앞에
wait()
호출
🧵 모니터 (Monitor)
자바 등 고급 언어에서 제공하는 추상화된 동기화 도구
개발자가 사용하기 쉬우며, 상호 배제와 실행 순서 제어 모두 지원
- 상호 배제 구현
- 공유 자원 접근 요청 시 인터페이스 큐에 삽입
- 큐 순서대로 하나씩만 공유 자원에 접근 가능
- 실행 순서 제어
- 조건 변수 (
condition variable
) 사용wait()
→ 해당 조건이 충족될 때까지 대기signal()
→ 기다리는 쓰레드 하나를 깨움
- 조건 변수 (
모니터는 내부적으로 뮤텍스 + 조건 변수를 함께 관리하여
더 안전하고 편리한 동기화를 제공한
✅ 마무리 정리
프로세스 동기화는 멀티 프로세스 환경에서 자원 보호와 실행 안정성을 위해 반드시 필요한 기술
뮤텍스, 세마포, 모니터 등의 기법을 통해 상호 배제와 실행 순서 제어를 구현할 수 있으며
올바른 동기화는 시스템의 신뢰성과 효율성을 좌우함
📚 참고 자료
- 『혼자 공부하는 컴퓨터 구조+운영체제』 - 강민철 저
- 인프런 강의 - 혼자 공부하는 컴퓨터 구조+운영체제 기반 강의
읽어주셔서 감사합니다 🙌
내용이 도움이 되었거나, 틀린 부분이 있다면 댓글이나 GitHub Issue로 알려주세요 😊