Home Philosophers ① Subject
Post
Cancel

Philosophers ① Subject

thumbnail

Summary
이 프로젝트에서 당신은 프로세스 스레딩에 대해 배울 것이다. 또한 쓰레드를 생성하는 방법과 뮤텍스에 대해 공부하게 될 것이다.

개요

다음은 과제를 성공하기 위해 알아야 할 사항이다.

  • 한 명 이상의 철학자가 원형 테이블에 앉아있다. 가운데에는 커다란 스파게티가 담긴 그릇이 있다.
  • 철학자는 삼자택일로 먹거나, 생각하거나, 잔다.
    • 먹는 동안은 생각하거나 자지 않는다.
    • 생각하는 동안은 먹거나 자지 않는다.
    • 자는 동안은 먹거나 생각하지 않는다.
  • 테이블엔 포크가 철학자의 수만큼 있다.
  • 포크 한개로 스파게티를 먹는 건 불편하므로 한명의 철학자는 자신의 오른쪽과 왼쪽 포크를 가지고 양손에 들고 스파게티를 먹는다.
  • 철학자가 먹는 것을 끝냈다면, 포크를 테이블에 돌려놓고 잠을 자기 시작한다. 잠에서 깨면 다시 생각하기 시작한다. 이 과정은 철학자가 굶어죽으면 끝난다.
  • 모든 철학자는 굶지않고 먹어야 한다.
  • 철학자끼리는 서로 대화하지 않는다.
  • 철학자들은 다른 철학자가 죽으려고 하는지의 여부를 알 수 없다.
  • 철학자들이 죽으면 안되는 건 당연지사!

전체적인 규칙

당신은 필수 파트와 보너스 파트(하기로 했다면)를 위한 프로그램을 작성해야 한다. 둘 모두 아래의 규칙을 충족해야 한다.

  • 전역 변수는 금지된다.
  • 당신의 프로그램은 다음의 인자를 받아야 한다: 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(ms) : 마지막 식사(또는 과정의 시작) 이후 죽는_시간 까지 식사를 시작하지 못했다면 죽는다.
    • time_to_eat(ms) : 철학자가 먹는 데 걸리는 시간. 이 시간동안 그들은 두 개의 포크를 쥐고 있어야 한다.
    • time_to_sleep(ms) : 철학자가 자는 데 쓰는 시간.
    • 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 는 현재 타임스탬프(ms 단위)로, X는 철학자의 번호로 대체해라.

  • 출력된 상태 메시지는 다른 메시지와 섞이면 안된다.
  • 철학자의 죽음을 알려주는 메시지는 실제 죽음 시간보다 10ms 이상 늦으면 안된다.
  • 다시한번, 철학자가 죽으면 안된다!

당신의 프로그램은 data races가 발생해선 안된다.

필수 파트

프로그램명philo
제출할 파일Makefile, *.h, *.c, in directory philo/
MakefileNAME, all, clean, fclean, re
인자number_of_philosophers, time_to_die, time_to_eat, time_to_sleep,
[number_of_times_each_philosopher_must_eat]
외부 함수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 허용 여부불허
설명쓰레드와 뮤텍스와 함께하는 철학자들

필수 파트에 대한 세부 규칙은 다음과 같다.

  • 각 철학자는 하나의 쓰레드여야 한다.
  • 각 철학자 쌍마다 가운데에 한 개의 포크가 있다. 따라서 철학자가 여러명이면 포크는 그들의 왼쪽과 오른쪽에 있게된다. 만약 오직 한 철학자만 있다면, 포크는 테이블에 딱 한 개만 있게 된다.
  • 철학자들이 포크를 복제하는 것을 방지하기 위해 당신은 각 포크의 상태를 뮤텍스를 통해 보호해야 한다.

보너스 파트

프로그램명philo_bonus
제출할 파일Makefile, *.h, *.c, in directory philo_bonus/
MakefileNAME, all, clean, fclean, re
인자number_of_philosophers, time_to_die, time_to_eat, time_to_sleep,
[number_of_times_each_philosopher_must_eat]
외부 함수memset, printf, malloc, free, write, fork, kill, exit,
pthread_create, thread_detach, pthread_join, usleep, gettimeofday, waitpid,
sem_open, sem_close, sem_post, sem_wait, sem_unlink
Libft 허용 여부불허
설명프로세스와 세마포어와 함께하는 철학자들

보너스 파트의 프로그램은 필수 파트와 같이 인자를 받는다. 이건 전체적인 규칙을 충족해야 한다.

보너스 파트에 대한 세부 규칙은 다음과 같다.

  • 모든 포크는 테이블의 가운데에 놓여져 있다.
  • 메모리에 상태가 저장되어 있지는 않지만 세마포어를 통해 사용가능한 포크의 수가 나타내져 있다.
  • 각 철학자는 하나의 프로세스여야 한다. 하지만 메인 프로세스는 철학자가 되면 안된다.
This post is licensed under CC BY 4.0 by the author.

So_long ③ 구현 과정

네트워크 - 00. 학습 계획