- 본 과제는 42seoul 과정의 과제입니다.
- 제한된 라이브러리를 사용하여 요구하는 조건을 충족시키는 프로그램을 구현하는 과정에서 cs지식을 학습할 수 있습니다.
- 이 과제를 통해 mutex를 이용하여 multi thread 에서 발생하는 동시성 문제에 대해 학습하였습니다.
- 원형 테이블에서 철학자의 식사 시뮬레이션을 통해 동시성 문제를 해결하는 42seoul 과제입니다.
$ cd philo
$ make
$ ./philo [number_of_philosophers] [time_to_die] [time_to_eat] [time_to_sleep] [number_of_times_each_philosopher_must_eat]
- 시뮬레이션에 사용되는 철학자와 포크의 수
- 철학자들은 원형 식탁에 앉아 있고, 포크는 철학자와 철학자 사이에 위치해있습니다.
- 식사를 위해서는 철학자가 본인의 좌측과 우측에 있는 포크를 모두 점유해야합니다.
- 다음 식사까지 생존가능한 시간 ms
- 철학자가 식사를 시작한 뒤부터 다음 식사를 하지 않은 채 이 시간이 지나면 철학자는 굶어 죽게됩니다.
- 철학자 식사에 걸리는 시간 ms
- 철학자 수면에 소요되는 시간 ms
- 철학자는 식사가 끝나면 즉시 수면을 취합니다.
- 철학자들의 식사 횟수
- 모든 철학자들이 각자 이 횟수 만큼 식사를 마치면 시뮬레이션 중지합니다.
- 옵션을 사용하지 않는 경우에는 한 철학자라도 사망하면 중지합니다.
- number_of_philosophers < 200
- time_to_die > 60
- time_to_eat > 60
- time_to_sleep > 60
- 철학자가 포크를 잡음, 식사, 취침, 사망시 출력
- [현재 시간 ms] [철학자 번호] [상태]
- 공유자원인 포크를 점유하기 전에 각 포크의 mutex를 lock
- 식사가 끝나면 각 포크의 mutex를 unlock
- 출력하기 이전에 출력 mutex를 lock
- 출력이 끝난 뒤 출력 mutex를 unlock
./philo 1 800 200 200
철학자가 한명, 포크도 1개 이기 때문에 식사를 하지 못해 800ms 뒤 사망
./philo 5 800 200 200
철학자 식사 사이의 간격이 400ms로 800ms보다 낮아 무한히 식사
./philo 5 800 200 200 7
종료 조건에 맞게 모든 철학자들이 7번 이상 식사 이후 종료
./philo 4 310 200 100
철학자 식사 시간이 200ms로 철학자 식사 이후 다른 철학자가 식사하는 200ms가 지나면 400ms로 310ms를 초과하여 사망