식사하는 철학자 문제

  • 식탁에 5명의 철학자가 각각의 의자에 앉아있고, 가운데에는 스파게티가 있음
  • 각 철학자가 스파게티를 각각 자신의 접시에 가져다 놓고 식사
  • 스파게티 공유자원
  • 근데 철학자라서 우아하니까 동시에 집어가지 않고 한 번에 한 사람씩만 상호배제를 통해서 접근
  • 스파게티를 집을 때는 왼쪽과 오른쪽 포크을 이용해서 스파게티를 떠 가야 함
    • 한 사람이 스파게티를 가져갈 때 양쪽 사람들의 사람들의 포크를 써서 그 동안은 사용 불가
    • 포크도 공유자원, 상호배제되는 자원
- 각 철학자 프로세스가 동시에 실행 - fork 2개를 집어 eat 한 후에 fork를 다시 돌려놓음 - 한 사람이 포크를 잡았을 때 포크로 스파게티를 먹으려는 옆 철학자는 기다려야 함 -> 포크를 집고 있을 때는 옆 사람이 포크를 놓는 신호를 줄 때까지 대기 -> 교착상태가 발생할 가능성 - 모두가 기다리게 되면 모두 굶어 기아상태 발생

해결방법

세마포어를 이용한 해결

  • 포크를 집고 음식을 먹는 행위가 원자적으로 이루어지게끔 구성
  • 테이블의 이용 권한을 흭득하고 운영권한을 넘겼다가 룸을 반납
  • 교착상태가 발생하지 않음

모니터를 이용한 해결

  • 5개의 프로세스 실행
  • 각각의 프로세스는 get_forksrelease_forks 수행
  • 두 개의 자원을 요청하는 코드를 모니터를 통해 얻음
  • 모니터는 자원 두 개를 흭득(get)하고 반환(release)하는 코드를 모니터 프로그램을 통해서 자원 관리 및 행위 개선