공유 자원 (Shared Resource)
: 프로세스 간 통신 시 공동으로 사용하는 변수나 파일
- 공유 자원은 여러 프로세스가 공유하고 있기 때문에 각 프로세스의 접근 순서에 따라 결과가 달라질 수 있음
- 운영체제는 시분할 방식으로 프로세스를 번갈아 실행하기 때문에, 프로세스의 정확한 실행 순서를 예측하기 어려움
→ 이로 인해 연산 결과도 예측하기 어려운 현상 발생
⇒ 이를 동기화 문제(Synchronization Problem) 라고 함
동기화 문제 예시
게임에서 캐릭터 총 체력은 100, 현재 체력은 20인 상황(20/100)에서 적의 공격을 받는 중이고, 동시에 물약을 마시는 중
- 공격 받는 코드 (먼저 실행)
int currentHealth = GetHealth(); // 1 → 이후 컨텍스트 스위칭 발생(물약 코드로 이동) health = currentHealth - 10; // 4 // health = 10
- 물약 먹는 코드
int currentHealth = GetHealth(); // 2 health = currentHealth + 50; // 3 → 이후 컨텍스트 스위칭 발생 (공격 코드로 이동) // health = 70
기대 결과: 20 (현재 체력) + 50(물약) - 10(공격) = 60
실제 결과: 10 (예상치 못한 실행 순서로 인해 연산 덮어쓰기 발생)
⇒ health라는 공유 자원을 여러 프로세스가 동시에 사용한 것이 원인
임계 구역 (Critical Section)
: 여러 프로세스가 동시에 사용하면 안 되는 코드 영역
- 경쟁 조건(Race Condition)
: 둘 이상의 프로세스가 동시에 공유 자원에 접근하면서 충돌이 발생하는 현상 - 임계 구역 문제를 해결하기 위해서는 상호 배제(Mutual Exclusion) 메커니즘이 필요함
상호 배제 메커니즘(mutual exclusion mechanism)
: 하나의 공유 자원에 동시에 여러 프로세스나 스레드가 접근하지 못하게 막는 방법
상호 배제의 요구사항
- 임계 구역엔 동시에 하나의 프로세스만 접근한다.
- 주어진 시간에 항상 하나의 프로세스만 임계 구역에 접근할 수 있어야 함
- 동시에 여러 개의 요청이 있더라도 하나의 프로세스의 접근만 허용한다.
- 여러 프로세스가 동시에 진입하려고 해도, 하나만 허용됨
- 임계 구역에 들어간 프로세스는 빠르게 나와야 한다.
- 그렇지 않으면 다른 프로세스들이 오래 기다려야 함
이런 원리를 기반으로 실제 프로그래밍에서는 뮤텍스(Mutex), 세마포어(Semaphore), 모니터(Monitor) 등의 동기화 도구를 사용하여 임계 구역 문제를 해결한다.