Jiwon-Woo / Philosophers

식사하는 철학자 문제

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Philosophers

철학이 이렇게 치명적인 줄은 생각치도 못했지.

요약: 이번 프로젝트에서, 여러분은 프로세스 스레딩의 기본과 스레드를 만드는 방법을 익힐 것입니다. 또한 뮤텍스가 무엇인지도 알아낼 수 있겠지요.


Contents

Chapter Contents Page
I Introduction 2
II Mandatory Part 3
III Bonus 6

Chapter 1

Introduction

철학 (Philosophy - 그리스어로 "지혜의 사랑" 이라는 뜻의 Philosophia에서 유래) 은 존재, 지식, 가치, 이성, 감성과 언어에 관한 일반적이고 근본적인 의문점을 다루는 학문이다. 몇몇 의문점들은 종종 연구되거나 해결되어야 할 문제로 취급되기도 한다. 이 용어는 피타고라스 (기원전 570년 - 495년) 에 의해 처음으로 만들어졌다고 추측된다. 철학적 방법에는 질문하기, 비판적인 토론, 이성적인 논쟁, 체계적인 표현이 포함된다. 고전적인 철학적 의문점에는 다음과 같은 것들이 포함된다: 세상의 모든 이치를 이해하고 증명하는 것이 가능한가? 무엇이 가장 '진짜' 라고 할 수 있는가? 철학자들은 또한 다음과 같은 실질적이고 구체적인 의문점을 제기하기도 한다: 가장 좋은 삶이란 존재하는가? 정당함과 부정함 중 어느 쪽이 더 나은가 (한 쪽만 선택하여 살 수 있다면)? 인간에게는 자유의지가 있는가?

역사적으로, "철학" 은 지식의 모든 부분을 포괄적으로 다루었다. 고대 그리스의 철학자 아리스토텔레스의 시대부터 19세기까지, "자연 철학"은 천문학, 의학, 물리학을 포함했다. 예를 들면, 뉴턴의 1687년 발간된 "자연철학의 수학적 원리" 는 나중에 와서야 물리학 책으로 분류되었다. 19세기 들어 현대 학문을 연구하는 대학들이 성장함에 따라 학문 철학과 여타 학문들을 전문화하고 세부화하였다. 현대에는 철학의 일부분이었던 연구들이 심리학, 사회학, 언어학, 경제학 등 별개의 학문으로 분리되었다.

예술, 과학, 정치 또는 다른 활동들과 밀접하게 관련된 다른 연구들은 그대로 철학의 일부로 남았다. 예를 들어, '아름다움' 은 객관적인가 주관적인가? 특정 문제에 대해서 과학적인 해결법은 단 하나만 존재하는가 또는 여러 개 존재하는가? 정치적 유토피아는 실현될 수 있는 꿈인가 아니면 가망없는 환상인가? 등이 있다. 학문 철학의 주된 하위 분야로는 형이상학 ("현실과 존재의 근본적인 존재에 대한 연구"), 인식론학 ("지식의 본질과 근거, [그리고]... 그 한계와 타당성에 대한 연구"), 윤리학, 미학, 정치 철학, 논리학, 과학 철학 등이 포함된다.


Chapter 3

Mandatory part


필수 파트에 하나, 보너스 파트에 하나의 프로그램을 만드세요. 두 프로그램은 모두 같은 기본 룰을 따릅니다:

  • 이 프로젝트는 Norm을 준수한 C 언어를 사용하여 코딩되어야 하며, 누수, 비정상적인 종료 (Crash), 정의되지 않은 동작, Norm 에러는 0점을 받게 됩니다.

  • 한 명 이상의 철학자가 둥근 테이블에 앉아 다음과 같은 세 행동 중 하나를 취합니다 : 먹기, 생각하기, 잠자기

  • 철학자가 밥을 먹는 도중에는, 생각하거나 잠을 자지 않습니다. 마찬가지로 잠자는 도중에는 밥을 먹거나 생각할 수 없으며, 생각하는 도중에는 밥을 먹거나 잠들 수 없습니다.

  • 철학자들은 둥근 테이블에 앉아있으며, 가운데에는 아주 큰 스파게티 그릇이 놓여 있습니다.

  • 탁자 위에는 몇 개의 포크가 올려져 있습니다.

  • 스파게티는 포크 하나만으론 집거나 먹기가 어렵기 때문에, 철학자들은 반드시 양 손에 포크를 쥐고 (2개의 포크를 사용하여) 먹어야 합니다.

  • 철학자는 절대로 굶고 있으면 안 됩니다.

  • 모든 철학자는 먹어야 합니다.

  • 철학자들은 서로와 대화할 수 없습니다.

  • 각 철학자는 다른 철학자가 언제 죽는지 알아챌 수 없습니다.

  • 철학자가 밥을 다 먹었으면, 포크를 내려놓고 잠자기 시작합니다.

  • 철학자가 잠을 다 잤으면, 생각하기 시작합니다.

  • 철학자가 한 명이라도 사망하면 시뮬레이션이 종료됩니다.

  • 각 프로그램은 같은 옵션을 가져야 합니다 : 철학자의 수, 철학자의 수명, 밥을 먹는데 걸리는 시간, 잠자는 시간, [각 철학자가 최소한 밥을 먹어야 하는 횟수] (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): 밀리초 단위로, 철학자가 마지막으로 밥을 먹은 지 'time_to_die' 시간만큼이 지나거나, 프로그램 시작 후 'time_to_die' 시간만큼이 지나면 해당 철학자는 사망합니다.

    • 밥을 먹는데 걸리는 시간 (time_to_eat) : 밀리초 단위로, 철학자가 밥을 먹는 데 걸리는 시간입니다. 해당 시간동안, 철학자는 두 개의 포크를 소유하고 있어야 합니다.

    • 잠자는 시간 (time_to_sleep) : 밀리초 단위로, 잠을 자는 데 소모되는 시간입니다.

    • 각 철학자가 최소한 밥을 먹어야 하는 횟수 (number_of_times_each_philosopher_must_eat) : 해당 인자값은 선택사항입니다. 모든 철학자가 'number_of_times_each_philosopher_must_eat' 횟수만큼 밥을 먹었다면, 시뮬레이션이 종료됩니다. 해당 값이 명시되어 있지 않다면, 철학자가 한 명이라도 사망할 때까지 시뮬레이션은 계속됩니다.

  • 각 철학자에게는 1부터 'number_of_philosophers' 만큼의 고유 번호가 부여됩니다.

  • 철학자 1번은 철학자 'number_of_philosophers'번 옆에 앉습니다. 그 외에, N번 철학자는 N-1번 철학자와 N+1번 철학자 사이에 앉습니다.

  • 철학자의 상태는 다음과 같은 형식으로 출력되어야 합니다. (X는 철학자의 고유 번호로 대체되어야 하며, timestamp_in_ms는 현재 타임스탬프가 밀리초 단위로 표시되어야 합니다.)

    • 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

  • 철학자의 상태는 다른 철학자들의 상태와 뒤엉키거나 섞인 상태로 출력되면 안 됩니다.

  • 철학자의 사망 시점과 이를 출력하기 까지의 틈이 10ms 이상이 되면 안 됩니다.

  • 다시 말하지만, 철학자들이 최대한 죽지 않도록 설계해야 합니다!

프로그램 이름 philo
제출할 파일 philo/
Makefile 필요함
인자 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 사용 불가
설명 스레드와 뮤텍스를 사용한 철학자의 구현

이 버전에서만 적용되는 규칙은 다음과 같습니다:

  • 두 철학자 사이에 한 개의 포크가 존재하므로, 철학자가 여러명일 경우 각 철학자의 왼쪽과 오른쪽에 포크가 하나씩 존재해야 합니다.

  • 철학자가 포크를 복제하는 것을 막기 위해서, 각 포크의 현재 상태를 뮤텍스를 이용하여 보호해주어야 합니다.

  • 각 철학자는 스레드로 구현되어 있어야 합니다.


Chapter 4

Bonus


프로그램 이름 philo_bonus
제출할 파일 philo_bonus/
Makefile 필요함
인자 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, pthread_detach, pthread_join, usleep, gettimeofday, waitpid, sem_open, sem_close, sem_post, sem_wait, sem_unlink
직접 만든 libft 사용 불가
설명 프로세스와 세마포어를 이용한 철학자 구현

이 버전에서만 적용되는 규칙은 다음과 같습니다:

  • 모든 포크는 테이블 가운데에 있습니다.

  • 메모리의 상태는 알 수 없지만, 대신 사용가능한 포크의 수가 세마포어로 표현됩니다.

  • 각 철학자는 프로세스로 이루어져 있어야 하고, 메인 프로세스가 철학자가 되어선 안 됩니다.

About

식사하는 철학자 문제


Languages

Language:C 92.8%Language:Makefile 7.2%