개발자 끄적끄적

식사하는 철학자 문제 본문

운영체제

식사하는 철학자 문제

햏치 2024. 5. 1. 18:41

<교착상태와 기아상태>
- 교착상태
  - 자원을 자유롭게 할당한 결과 자원부족 상태
  
- 기아상태(Starvation)
  - 교착상태를 예방하기 위해 무한히 기다림
    - 작업이 결코 사용할 수 없고 계속 기다려야 하는 자원을 할당할 때 발생하는 결과





<식사하는 철학자 문제(Dinning-Philosophers Problem)>
- 교착상태나 기아회피 필요를 단순하게 표현하는 고전적인 동기 문제
  - 철학자 5명은 대부분의 시간을 생각하고 먹는데 소비
  - 한 철학자가 생각 중일 때에는 다른 철학자가 간섭하지 않음
  - 철학자는 한 번에 하나의 젓가락만 들 수 있음 
    - 왼쪽 먼저, 오른쪽 나중
    - 이웃 철학자가 들고 있는 것은 취할 수 없음
    - 식사를 마치면 모두 내려놓고 다시 생각함




<철학자 i의 구조>
- 공유 데이터: 
  - Bowl of rice(data set)
  - Semaphore chopstick[5] initialized to 1

do{
wait(chopStick[i]);
wait(chopStick[(i+1) % 5]);

//eat

signal(chopStick[i]);
signal(chopStick[(i+1) % 5]);

//think

} while(true);

- 상호 배제 요건은 만족
- 교착 상태 발생 가능 
  모든 철학자가 동시에 왼쪽 젓가락을 잡으면? 교착상태 발생





<철학자들의 교착상태 원인>
- 순환 요청/대기
  - 5명 모두 왼쪽 젓가락을 가지고 오른쪽 젓가락을 요청하는 순환고리
  - 순환 고리는 스스로 인식이나 해제 불가





<몇 가지 해결 방안>
- 순환 요청/대기가 생기지 않도록
  - 철학자 4명만 테이블에 동시에 앉도록 함
  - 철학자는 양쪽 젓가락을 모두 사용 가능할 때에만 집을 수 있도록 허용
    - 임계영역 내에서 수행
 
  - 비대칭 해결법 적용
    - 홀수번째 철학자는 왼쪽 젓가락을,
       짝수번째 철학자는 오른쪽 젓가락을 먼저 집게 한다






<식사하는 철학자 컴퓨터 시스템>
- 식사하는 철학자 문제는 교착 상태 문제를 비유
  - 철학자 : 프로세스(스레드)
  - 젓가락(포크) : 자원
  - 스파게티 : 처리할 작업




<식사하는 철학자 문제의 주요 이슈>
- 어떤 철학자도 굶어 죽는 일이 없어야 한다
  - 교착상태에 대한 해결책은 기아상태의 가능성을 제거할 수 없다
 
  - 해결을 위해 먼저 기다리는 작업을 발견하고 각 작업이 기다린 시간을 조사/추적해야 한다

  - 시스템은 기아상태를 발결하면 즉시 새로운 작업의 시작을 보류하도록 조취해야한다
    - 빈번한 시스템 보류로 처리량이 감소할 수 있으므로 신중한 접근이 요구된다






<Solution to Dinning Philosophers - 예시>
monitor DP{
enum{  THINKING; HUNGRY, EATING  } state[5];
condition self[5];

void pickup(int i){
state[i] = HUNGRY; 
test(i);
if(state[i] != EATING) self[i].wait;
}

void putdown(int i){
state[i] = THINKING;
//test left and right neighbors
test((i+4) % 5);
test((i+1) % 5);
}

void test(int i){
if( (state[ (i+4) % 5 ] != EATING) //내 앞의 요소(내 앞의 철학자)
  (state[i] == HUNGRY)
(state[ (i+1) % 5] != EATING) ) //내 다음의 요소(내 다음의 철학자){ 
state[i] = EATING; //내가 먹는 상태로 설정
self[i].signal(); //내 번호에 대한 값을 1로 증가, self는 세마포어로 가정
}
}

initialization_code(){
for(int i=0; i<5; i++)
state[i]  = THINKING;
}
}
----------------------------------------------------------
DiningPhilosophers.pickup(i);

//EAT

DiningPhilosophers.putdown(i);

'운영체제' 카테고리의 다른 글

메모리 관리  (0) 2024.05.10
교착상태 탐지 및 복구  (1) 2024.05.01
교착상태(Deadlock)  (1) 2024.04.28