전통적 동기화 문제의 예시
- Producer - Consumer Problem (생산자 - 소비자 문제)
- 유한버퍼 문제(Bounded Buffer Problem)
- Readers - Writers Problem
- Dining Philosopher Problem
🐾 Producer - Consumer Problem
유한 버퍼 (Bounded Buffer)
- 생산자는 생산한 데이터를 소비자에게 직통으로 보내지 않고 생산자와 소비자 사이에 놓인 버퍼(buffer)에 저장한다.
- Why?
- 생산자와 소비자의 작업 속도에 차이가 있기 때문에
- 생산자는 버퍼가 가득 차면 데이터를 더 저장할 수 없다.
- 소비자는 버퍼가 비면 데이터를 뺄 수 없다.
문제점과 해결책
- 임계 구역에 대한 동시 접근으로 잘못된 결과가 나올 수 있다.
- Solution : 세마포어를 통한 상호 배타
Busy-Wait
- busy waiting(=spinning) : 프로세스 동기화 상황에서 프로세스가 자원에 대한 접근 권한을 얻기 위해, 될 때까지 접근 조건을 반복적으로 확인하는 일을 뜻한다.
- 생산자 : 버퍼가 가득 차면 기다려야 한다.
- 소비자 : 버퍼가 비면 기다려야 한다.
세마포어를 통한 Busy-Wait 회피
- Empty : 생산자와 버퍼와의 관계를 제어할 수 있는 세마포
- Full : 소비자와 버퍼의 관계를 제어하는 세마포
출처: https://copycode.tistory.com/67 [ITstory]
🐾 Readers - Writers Problem
- 데이터를 읽기만 하는 Readers와 데이터를 수정하여 동기화 문제를 야기할 수 있는 Writers에 대해 동일하게 한 번에 한 개의 프로세스만 접근할 수 있도록 상호배타 조건을 넣으면 비효율적이다.
- Reader는 데이터 수정을 하지 않으므로 여러 Reader들이 임계 구역에 동시에 접근하여도 데이터 일관성(Data Consistency)이 유지된다.
- reader가 있을 때 writer의 접근 : 허용 X
- writer가 있을 때 reader의 접근 : 허용 X
- reader가 있을 때 reader의 접근 : 허용 O
🐾 Dining Philosopher Problem
철학자 문제의 Dead Lock 성립 조건
- 상호 배제 -> 젓가락은 한 번에 한 철학자만 사용할 수 있다.
-
점유와 대기 -> 왼쪽 젓가락을 점유하면서 오른쪽 젓가락을 대기한다.
-
비선점 -> 이미 누군가가 집어 든 젓가락을 강제로 뺏을 수 없다.
-
환형 대기 -> 모든 철학자들이 오른쪽에 앉은 철학자가 젓가락을 놓기를 기다린다.
문제
모든 사람이 왼쪽의 젓가락을 잡으면 교착상태 발생 -> 무한히 대기하다가 기아상태 발생
해결 방법
- 최대 4명의 철학자만 테이블에 동시에 앉을 수 있도록 한다.
- 한 철학자가 젓가락 두 개를 한번에 집을 수 있을 때만 집는다.
- 비대칭 해결안을 사용. 홀수 번호의 철학자는 왼쪽을 먼저 집고 오른쪽을 집는다. 짝수 번호는 오른쪽을 먼저 집고 왼쪽을 집는다.
✏️ 기아 상태(Starvation)
- 정의
여러 프로세스가 부족한 자원을 점유하기 위해 경쟁할 때, 특정 프로세스가 영원히 자원 할당이 되지 않는 경우
- 해결 방법
프로세스의 우선 순위 변경
요청을 순서대로 처리하는 요청 큐 사용
✏️ 교착상태 (Dead Lock)
- 정의
둘 이상의 프로세스나 스레드가 자원을 점유한 상태에서 서로 다른 프로세스나 스레드가 점유하고 있는 자원을 요구하며 무한정 기다리는 현상
- 발생 조건
- 상호 배제(Mutual Exclusion): 한번에 하나의 프로세스나 스레드만이 자원에 접근할 수 있음
- 비선점(No Preemption): 다른 프로세스나 스레드의 자원을 뺏을 수 없음
- 점유와 대기(Hold and Wait): 자원을 가진 상태에서 다른 자원을 기다림
- 순환 대기(Circular Wait): 순환 형태로 자원을 대기