'식사하는 철학자'에 해당하는 글 1건


C# 쓰레드 이야기 중에 저녁식사하는 철학자 문제가 나옵니다. 교착상태(Dead Lock)가 발생하는 상황과 그 해법 중에 하나로 상호배제(Mutual Excrusive)를 설명하는데 꼭 나오는 이야기죠. 교과서에 주로 나오는 문제인데 왠지 해보고 싶어서 직접 코드를 짜보는 Back to the Basic 시간을 가져봤습니다.

식사하는 철학자 문제
5명의 철학자가 원탁에 둘러 앉아 있습니다. 테이블 중앙에는 음식이 있고 철학자의 사이사이에 젓가락이 하나씩 5개가 놓여 있습니다.(사진참조) 철학자들은 생각에 잠기거나 배가 고파지면 먹는 행위 두가지를 할 수 있는데 먹을 때는 반드시 철학자의 양쪽의 젓가락을 모두 사용해야 합니다. 식사를 마치면 젓가락을 내려 놓고 다시 생각에 잠깁니다. 일정시간이 지났을 때 식사를 하지 못하여 굶어 죽는 철학자가 없도록 하려면 어떻게 해야 할까요?


두가지 언어로 작성을 해봤습니다.

C# 코드 (Visual Studio 2010)


C# 즉 .NET Framework 는 쓰레드 동기화 관련된 모니터(lock 키워드)와 뮤텍스(Mutex), 이벤트(AutoResetEvent, ManualResetEvent)들이 잘 만들어져 있어서 쉽게 구현됩니다. Mutex 5개를 사용했습니다.

Java 코드 (JRE 5 이상)



Java 1.4.x 까지는 Sychronized 키워드를 사용하는 모니터와 wait(), notify() 같은 메서드만 제공 되었지만 Java 5부터는 java.util.concurrent 네임스페이스에 쓸만한 그러나 이해를 좀 해야하는 클래스들이 제공이 되네요. 그중에 Semaphore가 들어 있어서 구현을 했습니다.

세마포어와 뮤텍스는 큰차이는 없어 보이는데 구현할 때 명확히 차이가 보입니다. Mutex는 한개 Semaphore는 여러개의 permit을 설정할 수 있습니다.

혹시 숙제하려고 검색해서 들어오신 학생 여러분 그냥 가져가지 말고 스스로 풀어봐야 훌륭한 개발자가 됩니다. 곧 개발자가 귀해지면 훌륭한 개발자들이 많이 필요하니 열공 부탁해요.

WRITTEN BY
ONESTONE

트랙백  0 , 댓글  4개가 달렸습니다.
  1. 비밀댓글입니다
  2. 안녕하세요.
    지금 Os에 식시하는 철학자를 보고 있는 학생인데요
    철학자의 데드럭을 방지하는데 3가지 방법이 있는데 그 중 비대칭 해결방안부분이 이해가 되질 않아 질문드립니다.
    5명의 철학자가 있다는 가정에 홀수 철학자가 왼쪽 젓가락을 먼저 집고 다음 짝수 철학자가 오른쪽 젓가락을 먼저 집는다 라고 책에 나와있습니다.
    그럼 이 부분에 대해서 동시에 홀짝 철학자가
    • 루에나 2012.12.07 14:21
      젓가락을 집으려 한다면 이것 또한 충돌이 일어나지 않을까요??
      그렇담 동시 접근이 일어나지 않게 해야하는데 그럼 결국 비대칭방법의 의미가 쓸모없게 되는데.. 아니면 둘다 동시 접근하는데 우선순위를 두어 홀수 철학자가 먼저 왼쪽 젓가락을 들게하고 내려 놓으면 짝수가 오른쪽 젓가락을 들고
    • 루에나 2012.12.07 14:28
      그래야 동시접근을 제어할 수 있는데.
      이렇게 된다는 가정하에 교착상태는 방지할 수 있지만 한놈이 한 쪽 젓가락을들고 안 놔주면 기아가 발생할 수 있지 않을까요??
      철학자가 밥 먹으려면 양 쪽 젓가락을 모두 사용해야 하니 말이에요
secret