Synchronization (동기화)
- 동시다발적으로 실행되는 프로세스, 스레드
- 이 과정에서 자원의 일관성을 보장해야 함
<aside>
💡
동기화란?: 프로세스들의 수행 시기를 맞추는 것
- 실행 순서 제어
- 프로세스를 올바른 순서대로 실행하기
- reader writer problem → 일단 정보가 적혀있어야 읽지..
- 상호 배제
-
동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
-
Bank account problem → 잔액에 동시에 접근해서 생기는 문제
- 프로세스 A: 잔액을 읽고, 2만원을 더하고 저장
- 프로세스 B: 잔액을 읽고, 5만원을 더하고 저장
→ 7만원이 더해져야 하는데 5만원만 더해진다?
-
Producer & Consumer problem → 총합에 동시에 접근해서 생기는 문제
→ 0이 아닌 전혀 다른 값이 나온다?
</aside>
공유 자원과 임계 구역
- Sahred Resource (공유 자원)
- 여러 프로세스, 스레드가 공유하는 자원
- 전역 변수, 파일, 입출력장치, 보조기억장치, …
- Critical section (임계 구역)
- 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
- “잔액” 변수, “총합” 변수, …
- 임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 함
<aside>
💡
레이스 컨디션
임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있다
</aside>
OS가 크리티컬 섹션 문제를 해결하는 세 가지 원칙
- Mutual exclusion (상호 배제)
- 한 프로세스가 임계구역에 진입했다면
- 다른 프로세스는 들어올 수 없다.
- Progress (진행)
- 임계 구역에 어떤 프로세스도 진입하지 않았다면
- 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
- Bounded waiting (유한 대기)
- 한 프로세스가 임계 구역에 진입하고 싶다면
- 언젠가는 임계 구역에 들어올 수 있어야 한다. (무한 대기 X)
동기화 기법
- 뮤텍스 락
상호 배제
- 세마포
상호 배제 실행 순서 제어
- 모니터
상호 배제 실행 순서 제어
뮤텍스 락
- 크리티컬 섹션으로 들어가는 문의 자물쇠 역할
- 과정
- 전역 변수
lock
- 크리티컬 섹션 잠그기
acquire() → 프로세스가 크리티컬 섹션에 진입하기 전에 호출 (들어갈게요)
- 크리티컬 섹션 잠금 해제
release() → 프로세스가 크리티컬 섹션에서의 작업을 끝내고 호출 (나갈게요)
- busy waiting → 잠겨있는지 계속해서 확인