(개인 프로젝트) 식사하는 철학자들-Semaphore를 이용한 모니터와 비대칭 해결안을 적용

소개

  • 인원 : 1인
  • 담당 : 프로그램 구현 전체
  • 개발 환경 : Visual Studio 2015
  • 문제
    • 테이블에 5명의 철학자가 있고, 그 사이에 포크가 1개씩 있다.
    • 자신에게 가장 가까이 있는 두 개의 포크만 사용할 수 있다.
    • 식사를 하기 위해서는 무조건 두 개의 포크가 필요하고, 한 개의 포크로는 식사를 할 수 없다.
    • 이미 다른 사람이 포크를 쥐고 있다면 그 포크를 테이블에 내려놓기 전까지 가져갈 수 없다.
    • 철학자는 식사, 생각, 대기라는 세 가지 상태만 존재한다.
      (대기 = 배고픈 상태이나 포크가 부족해서 기다림)
    • 철학자는 서로 대화할 수 없으며 포크를 들고 내려놓는 행동을 보는 것으로 상태를 확인해야 한다.
    • 위와 같은 조건에서 아무도 굶어죽지 않도록 하는 방법을 생각하자.
  • 소스코드 : 식사하는 철학자들-Semaphore를 이용한 모니터와 비대칭 해결안을 적용

내용

비대칭 해결안

  • 기본 원리

    • 홀수 번호의 철학자는 먼저 왼쪽 포크를 집고, 다음에 오른쪽 포크를 집는다.
    • 짝수 번호의 철학자는 먼저 오른쪽 포크를 집고, 다음에 왼쪽 포크를 집는다.
  • pseudocode

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    main() {
    while (TRUE) {
    /* Hungry Area */
    if (P % 2) { // 짝수 번호의 철학자이면 왼쪽 포크부터
    wait(Left_Fork);
    wait(Right_Fork);
    }
    else {
    wait(Right_Fork);
    wait(Left_Fork);
    }
    /* Eat Area */
    signal(Left_Fork);
    signal(Right_Fork);
    /* Think Area */
    }
    }
  • 해결 원리
    이 방법대로 철학자들이 포크를 집는다면 모든 철학자들이 한 포크만을 집는 사태는 벌어지지 않습니다. 양 옆의 철학자가 서로 같은 포크를 집으려하기 때문에 그 포크를 먼저 집는 사람이 다음 에 식사를 하게 됩니다.

  • 실행화면

어려웠던 점

가장 어려웠던 점은 windows의 환경에 맞게 프로젝트를 설정하는 일이었습니다. 인터넷 검색을 통해서 pthread와 semaphore의 사용법을 검색해보았지만 Linux의 gcc 환경에서 사용하라는 글이 대부분이었습니다. 그래서 열심히 찾아본 결과 semaphore는 windows.h에 포함된 함수로 사용이 가능해서 매크로를 이용해 함수이름을 변환하였습니다. 하지만 pthread는 방법을 찾지 못해서 어떤 사람이 Windows에 사용 가능하도록 만들어둔 pthread.h를 직접 추가하고, 이에 필요한 lib 파일과 dll 파일을 프로젝트 경로에 추가하였습니다.

배운 점

식사하는 철학자들 문제에 대한 여러 가지 해결책을 생각해보았습니다. 모두가 일정한 간격으로 식사하고 생각한다면 타이머를 이용해서 간단하게 해결이 가능하지만, 꼭 그렇지는 않다는 것이 이 문제의 중점이라 생각했습니다. 그래서 가장 보편적인 해결안인 비대칭 해결안을 사용하게 되었고, lock과 unlock을 위해서는 semaphore를 사용하였습니다. 프로그래머가 semaphore를 사용할 때 오류가 발생하지 않도록 주의하며 프로그래밍을 해야 하는 단점이 있지만, 여기서는 추상화된 데이터 형인 모니터를 이용했기 때문에 안전하게 프로그래밍을 할 수 있었습니다. 또한 미리 정의된 함수들을 이용한 덕에 소스코드도 짧게 작성할 수 있었습니다.