본문 바로가기
42seoul/circle-3

[Philosophers] 0. 과제 이해하기

by saniii 2022. 4. 27.

목표는 4월 안에 끝내기..! ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ아오 진짜 so_long을 빨리 했어야지 이 사람아......에휴

 

[Philosophers] : I never thought philosophy would be so deadly

 

# Description
In this project, you will learn the basics of threading a process. You will see how to create threads and you will discover mutexes.
이번 프로젝트에서 프로세스 스레딩의 기본을 배울 수 있다. 어떻게 스레드를 만드는지, 뮤텍스가 무엇인지도 알 수 있다.  
# Keywords
- Unix logic
#Skills
- Imperative programming
- Rigor
- Unix

 

# Common Instructions

더보기
  • 프로젝트는 C로 작성된다.
  • norm을 따라야한다. 보너스 역시 norm을 따라야 한다. 
  • 예기치 않게 프로그램이 중단되어서는 안됩니다. 
    • (segmentation fault, bus error, double free 등등등등ㄷ)
  • 메모리 누수 당연히 안됨
    • 할당한 메모리는 모두 해제하세영
  • -Wall -Wextra -Werror 플래그를 통해 컴파일 수행하기, 리링트는 당연히 안됩니다.
  • Makefile은 $(NAME), all, clean, fclean, re 규칙을 포함해야해요.
  • 보너스를 만들고자 할 때는 Makefile에 보너스 규칙을 포함해야합니다. 
    • 보너스 과제는 별도의 파일에 만드세요

 

 

# Introduction

Philosophical methods include questioning, critical discussion, rational argument, and systematic presentation.

철학적 방법에는 질문, 비판적 토론, 합리적인 주장, 체계적인 제시가 포함된다.

Classic philosophical questions include: Is it possible to know anything and to prove it? What is most real?

고전적인 철학적 질문은 다음과 같다. 무엇을 알고 그것을 증명하는 것이 가능한가? 무엇이 가장 진짜인가?

Philosophers also pose more practical and concrete questions

철학자들은 또한 다음과 같은 더 실질적이고 구체적인 질문을 던진다

 

 

# Overview

  • 한 명 이상의 철학자가 둥근 테이블에 앉아있다.
    • 테이블의 가운데에는 큰 스파게티 그릇이 놓여있다. 
  • 철학자들은 eat(먹거나), think(생각하거나), sleep(잠을 자거나)의 세가지 중 하나의 행동을 할 수 있다. 
    • 먹는(eat)동안에는 생각하거나, 잘 수 없다.
    • 생각하는(think)동안에는 먹거나, 잘 수 없다.
    • 당연하게도 자는(sleep)동안에도 먹거나, 생각할 수 없다. 
  • 테이블에는 철학자들만큼 포크가 있다. 
  • 스파게티를 덜어 먹으려면 오른쪽과 왼쪽에 있는(2개의) 포크를 모두 사용해야 한다. 
  • 철학자가 다 먹으면 그들은 포크를 테이블에 다시 내려놓고 잠을 잔다. 일어나면 그들은 다시 생각하기 시작한다.
  • 이 상황은 철학자가 한명이라도 굶어죽으면 멈춘다. 
  • 모든 철학자들은 먹어야하고, 굶어서는 안된다.
  • 철학자는 서로 말하지 않는다. 
  • 철학자는 다른 철학자가 언제 죽는지 모른다. 
  • 철학자들은 죽어서는 안된다!!!!!!!!

 

# Global rules

  • 전역 변수는 사용할 수 없다. 
  • 각 프로그램은 다음과 같은 옵션을 가진다. 
    • number_of_philosophers
      • 철학자와 포크의 수
    • time_to_die 
      • 밀리초 단위
      • 철학자가 지금부터 먹지 않을 때 마지막 식사부터 죽을 때까지 걸리는 시간 
      • 철학자가 마지막으로 밥을 먹은지 'time_to_die' 시간만큼 지나거나, 프로그램 시작후 t_t_d시간만큼 지나면 해당 철학자는 사망한다.  
    • time_to_eat
      • 밀리초 단위
      • 철학자가 밥 먹는데 걸리는 시간
      • 이 시간동안 철학자는 포크를 두개 들고 있는다.  
    • time_to_sleep
      • 밀리초 단위
      • 철학자가 자는데 쓰는 시간
    • number_of_times_each_philosopher_must_eat (선택사항)
      • 모든 철학자가 최소한 number_of_times_each_philosopher_must_eat번 먹는 다면 시물레이션이 멈춘다.
      • 해당 값이 없으면, 죽는 철학자가 나올 때 시뮬레이션은 멈춘다. 
  • 각 철학자들은 1번부터 num_of_philo번까지 숫자를 가진다. 
  • 1번 철학자는 num_of_philo번 철학자 옆에 앉는다. 즉, 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
  • 출력되는 메세지는 다른 메세지와 섞이면 안된다. 
  • 철학자가 죽었다는 메세지는 철학자의 실제 죽음보다 10ms이상 늦게 표시되면 안된다. 
  • 직접 만든 libft는 사용할 수 없다. 

 

 

# mandatory

  • 사용 가능한 함수
    • 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
  • 각 철학자들은 스레드로 구현되어있다.
  • 한쌍의 철학자 사이에는 하나의 포크가 있다. 즉, 여러명의 철학자들이 있을 때, 각 철학자들은 왼족과 오른쪽에 있는 포크를 가진다. 만일 한명의 철학자만 있다면 테이블에는 하나의 포크만 있다. 
  • 철학자가 포크를 복제하는 것을 방지하기 위해서 포크 현재 상태를 뮤텍스를 이용하여 보호해주어야 한다. 

 

 

 

 

# Bonus 

# mandatory

  • 사용 가능한 함수
    • memset
    • printf
    • malloc, free
    • write, 
    • fork
    • kill
    • exit
    • usleep
    • gettimeofday
    • waitpid
    • sem_open
    • sem_close
    • sem_post
    • sem_wait
    • sem_unlink
    • pthread_create
    • pthread_detach
    • pthread_join

프로세스와 세마포어를 이용한 철학자 구현

 

  • 모든 포크는 테이블 가운데 있다.
  • 메모리의 상태는 알 수 없지만 사용 가능한 포크의 수가 세마포어로 표현
  • 각 철학자는 프로세스로 이루어져있어야하고, 메인 프로세스가 철학자가 되어서는 안된다. 

 

 

# Submission and peer-evaluation

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'42seoul > circle-3' 카테고리의 다른 글

[ minishell ] 1. 사전지식  (0) 2022.05.15
[minishell] 0. 과제 이해하기  (0) 2022.05.13
[Philosophers] 1. 과제 해결하기  (0) 2022.05.08

댓글