혼공단 5주차 (1) 프로세스 동기화 (책 챕터12, 유투브 33강~34강)
목차
Chapter 12. 프로세스 동기화
12-1. 동기화란
12-2. 동기화 기법
선택 미션
Ch.12(12-1) 임계 구역, 상호 배제 개념을 정리하기
동시다발적으로 실행되는 프로세스들은 서로 협력하며 영향을 주고 받는데
이 과정에서 자원의 일관성을 보장 (동기화) 해야 한다.
동기화
프로세스들의 수행 시기를 맞추는 것
실행 순서 제어
- 프로세스를 올바른 순서대로 실행
Reader Writer problem
파일에 값을 쓰는 프로세스와 읽는 프로세스는 동시에 실행되더라도 writer 가 선행되어야 함
쓴 값이 있어야 읽을 값이 있음
상호 배제
- 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기
Bank Account problem
계좌의 잔액은 하나의 프로세스만 접근해야 함
e.g. 잔액이 10원인데 여러 프로세스가 동시에 10원을 출금하는 것을 막아야 함
동기화 예제: Producer & Consumer problem
Producer : 생산자. 물건을 계속해서 생산
Consumer : 소비자. 물건을 계속해서 소비
'총합' 이라는 변수를 공유 (공유 자원)
문제. 100,000번 (혹은 그 이상) 실행하면 어떻게 될까? 총합은 0 ?
공유 자원 : 여러 프로세스 혹은 스레드가 공유하는 자원 (전역 변수, 파일, 입출력 장치, 보조기억 장치)
임계 구역 : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역
임계 구역에 동시에 접근하면 자원의 일관성이 깨짐 → Race Condition
임계 구역 문제를 해결하는 3가지 원칙
(1) 상호 배제 Mutual Exclusion
한 프로세스가 임계 구역에 진입했다면 다른 프로세스들은 들어올 수 없다.
(2) 진행 Progress
임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세스는 들어갈 수 있어야 한다.
(3) 유한 대기 Bounded Waiting
한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다. 임계 구역에 들어오기 위해 무한정 대기해서는 안된다.
Mutex Lock
상호 배제를 위한 동기화 도구 (자물쇠 역할)
공유 자원이 하나만 있다는 가정 하에 사용하기 좋음
단순한 형태 : 전역 변수 lock, 임계 구역을 잠그는 acquire 함수, 임계 구역 잠금을 해제하는 release 함수
acquire 의 구현 중 while (lock==true); 은 바쁜 대기 (busy waiting) 상태에 빠져서 좋은 방법은 아님
대부분의 언어는 이미 구현되어 있는 mutext 함수가 있음
acquire();
// Critical Section
release();
Semaphore, 세마포
좀 더 일반화된 방식의 동기화 도구
공유 자원이 여러 개 있는 경우에도 적용 가능
이진 세마포, 카운팅 세마포 등이 있음