[Philosophers] Philosophers 과제 요구 사항

bolee·2022년 9월 8일
0

42seoul

목록 보기
19/27
post-thumbnail

42Seoul 과제 중 하나인 Philosophers 과제 요구 사항을 정리한 포스트이다.

Overview

과제를 성공적으로 수행하기 위해 알아야할 사항

  • 1 명 이상의 철학자가 원탁에 앉으며, 테이블 중앙에는 커다란 스파게티 그릇이 있다.
  • 철학자들은 교대로 먹거나 생각하거나 잠을 잔다.
    • 철학자들은 먹는 동안 생각하지도 자지도 않는다.
    • 생각하는 동안 철학자들은 먹지도 자지도 않는다.
    • 철할자들은 잠자는 동안에는 먹지도 생각하지도 않는다.
  • 테이블에 포크가 있으며, 철학자 수만큼 포크가 있다.
  • 철학자는 오른손과 왼손 포크를 양손에 하나씩 들고 먹는다. 즉, 스파게티를 먹는데 2개의 포크를 사용한다.
  • 철학자는 식사를 마치면 포크를 다시 탁자 위에 놓고 자기 시작하며, 깨어나면 생각하기 시작한다.
  • 만약 철학자는 굶어 죽는다면 시뮬레이션이 중지된다.
  • 모든 철학자는 먹어야 하며 절대 굶어서는 안 된다.
  • 철학자들은 서로 이야기하지 않는다.
  • 철학자들은 다른 철학자가 곧 죽을지 모른다.
  • 철학자는 죽음을 피해야 한다고 말할 필요가 없다.

Global Rules

mandatory part에 대한 프로그램을 작성하고 bonus part를 수행하기로 결정한 경우 bonus part에 대해 다른 프로그램을 작성해야 한다.
또한 둘 다 다음 규칙을 준수해야 한다.

  • 전역 변수는 금지된다.
  • 프로그램은 다음 인수를 취해야 한다.
    number_of_philosophers, time_to_die, time_to_eat, time_to_sleep,
    [number_of_times_each_philosopher_must_eat]
    • number_of_philosophers: 철학자의 수와 포크의 수
    • time_to_die(in miliseconds): 마지막 식사가 시작된 이후 또는 시뮬레이션이 시작된 이후 철학자가 time_to_die ms 이내에 먹기 시작하지 않는다면 죽는다.
    • time_to_eat(in miliseconds): 철학자가 식사하는 데 걸리는 시간이며, 그 시간 동안 두 개의 포크를 잡아야 한다.
    • time_to_sleep(in miliseconds): 철학자가 잠을 자는 시간
    • number_of_times_each_philosopher_must_eat(optional argument): 모든 철학자가 최소 number_of_times_each_philosopher_must_eat 시간 이상을 먹었다면(이 시간 내에 모두 살아있다면) 시뮬레이션이 중지됩니다. 지정하지 않으면 철학자는 죽을 때 시뮬레이션이 중지된다.
  • 각 철학자는 1에서 number_of_philosophers까지의 숫자를 갖는다.
  • 철학자 번호 1은 철학자 번호 number_of_philosophers 옆에 있습니다.
  • 철학자 번호 N은 철학자 번호 N - 1과 철학자 번호 N + 1 사이에 있다.

프로그램 로그 정보:

  • 철학자의 상태 변경은 다음과 같이 형식화되어야 한다.

    • timestamp_in_ms X has taken a fork
    • timestamp_in_ms X is eating
    • timestamp_in_ms X is sleeping
    • timestamp_in_ms X is thinking
    • timestamp_in_ms X died

      timestamp_in_ms: 현재 타임스탬프(milisecond)
      X: 철학자 번호

  • 표시된 상태 메시지는 다른 메시지와 섞여서는 안된다.

  • 철학자가 죽고나서, 철학자가 사망했음을 알리는 메시지는 10ms 이내에 표시되어야 한다.

  • 철학자는 죽음을 피해야 한다!

프로그램에 데이터 레이스(data race)가 없어야 한다.
즉, 2개 이상의 쓰레드(Thread)에서 동시에 같은 데이터의 값을 수정하면 안된다.

Mandatory part

항목요구사항
Program namephilo
Turn in filesMakefile, *.h, *.c, in directory philo/
MakefileNAME, all, clean, fclean, re
Argumentsnumber_of_philosophers, time_to_die, time_to_eat, time_to_sleep, [number_of_times_each_philosopher_must_eat]
External functs.memset, printf, malloc, free, write, usleep, gettimeofday, pthread_create, pthread_detach, pthread_join, pthread_mutex_init, pthread_mutex_destroy, pthread_mutex_lock, pthread_mutex_unlock
Libft authorizedNo
DescriptionPhilosophers with threads and mutexes

mandatory part 대한 구체적인 규칙:

  • 각 철학자는 쓰레드(thread)가 되어야 한다.
  • 각 철학자 사이에는 하나의 포크가 있다. 따라서 여러 철학자가 있는 경우, 각 철학자는 양쪽에 포크가 있다.
  • 철학자가 1 명이라면 식탁에는 포크가 하나만 있어야 한다.
  • 철학자가 포크를 복제하는 것을 방지하려면 각각에 대한 뮤텍스로 포크 상태를 보호해야 한다.

Bonus part

항목요구사항
Program namephilo_bonus
Turn in filesMakefile, *.h, *.c, in directory philo_bonus/
MakefileNAME, all, clean, fclean, re
Argumentsnumber_of_philosophers, time_to_die, time_to_eat, time_to_sleep, [number_of_times_each_philosopher_must_eat]
External functs.memset, printf, malloc, free, write, fork, kill, exit, pthread_create, pthread_detach, pthread_join, usleep, gettimeofday, waitpid, sem_open, sem_close, sem_post, sem_wait, sem_unlink
Libft authorizedNo
DescriptionPhilosophers with threads and semaphores

bonus part의 프로그램은 mandatory part 프로그램과 동일한 argument들를 사용힌다.
global rules 부분의 요구 사항을 준수해야 한다.

bonus part에 대한 구체적인 규칙:

  • 모든 포크는 테이블 중앙에 위치한다.
  • 메모리에 상태(state)가 없지만 사용 가능한 포크의 수는 세마포어로 표시된다.
  • 각 철학자는 프로세스(process)이어야 한다. 그러나 메인 프로세스(main process)는 철학자가 되어서는 안된다.

0개의 댓글