Philosophers๊ณผ์ ๋ฐฉํฅ์ฑ
0. ์กฐ๊ฑด, ํจ์ ์ ๋ฆฌ.
๊ณผ์ ์ ๋ฆฌ
ํ์ ํํธ์ ํ๋, ๋ณด๋์ค ํํธ์ ํ๋์ ํ๋ก๊ทธ๋จ์ ๋ง๋์ธ์. ๋ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ๊ฐ์ ๊ธฐ๋ณธ ๋ฃฐ์ ๋ฐ๋ฆ ๋๋ค:
- ์ด ํ๋ก์ ํธ๋ 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 ์ด์์ด ๋๋ฉด ์ ๋ฉ๋๋ค.
๋ค์ ๋งํ์ง๋ง, ์ฒ ํ์๋ค์ด ์ต๋ํ ์ฃฝ์ง ์๋๋ก ์ค๊ณํด์ผ ํฉ๋๋ค!
์ถ์ฒ : 42seoul-translation.
์ฌ์ฉ ๊ฐ๋ฅ ํจ์๋ค.
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 ์ฌ์ฉ ๋ถ๊ฐ.
1. ๋ญํ๋ ๊ณผ์ ์ผ๊น?
์ฒ ํ์ ๊ฐ๊ฐ์ ์ค๋ ๋์ด๊ณ , ์ฒ ํ์๋ ํน์ (์์น)์ ํฌํฌ(์์) 2๊ฐ๋ฅผ ์ ์ ํด์ผ ์์ฌ๊ฐ ๊ฐ๋ฅํ๋ค. ๋ง์ฝ ์์ฌ๋ฅผ ํ์ง ๋ชปํ๊ณ ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ์ฃฝ๊ณ๋๋ฉฐ ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๋ค.
๊ต์ฐฉ์ํ๋ฅผ ํํผํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด๋ ๊ณผ์
2. ๊ณผ์ ํน์ง
-
๋ฉํฐ ์ค๋๋ ํ๊ฒฝ์์ ๊ต์ฐฉ์ํ๋ฅผ ์๋ฐฉ ํํผ ์ฒ๋ฆฌํ๋ OS์ ํน์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ๊ณผ์ . - ๊ต์ฐฉ์ํ๊ฐ ํ์์กฐ๊ฑด์ธ ์ํธ๋ฐฐ์ , ๋น์ ์ , ์ ์ /๋๊ธฐ, ์ํ๋๊ธฐ๊ฐ ๋ชจ๋ ์ถฉ์กฑ๋๋๋ค.
- ์์์ด ์ ๋์ ์ผ๋ก ์ ๊ณ , ์ผ์ ์๊ฐ ์ด์ ๊ธฐ์์ํ๊ฐ ๋๋ฉด ์๋๋ ์ ์ฝ์กฐ๊ฑด๋ ์๋ค.
- ์ด๋ฌํ ์ํ์์ ์ฒ ํ์๋ฅผ ์ฃฝ์ด์ง ์๊ณ ๊ณ์ ์ด๋ ค์ผํ๋คโฆ
๋ฌด์กฐ๊ฑด ์ฒ ํ์๊ฒ ์ฃฝ๊ฒ๋๋ ๋๋ input๊ธฐ์ค์ ๋ฌด์์ผ๊น?
3. ๋ด๊ฐ ์๊ฐํ๋ ๊ณผ์ ์ ํน์ด์ฌํญ
์๋์ ๋ด์ฉ๋ค์ ๊ณผ์ ๋ฅผ ๊ตฌํํ๊ธฐ ์ ์ ์ด๋ป๊ฒ ๊ตฌํํ๋๊ฒ ๋นก์ธ๊ณ ์ด์์ ์ผ์ง ์๊ฐ์ ํด๋ณด๋ ๋ถ๋ถ์ด๋ค.
- ๋ด(OS)๊ฐ ์ ํํ ์ ์๋๊ฑด ์ค์ง ํฌํฌ๋ฟ์ด๋ค.
- ์ฒ ํ์๋ ์ง์์ ์๋ ํฌํฌ๊ฐ ํฌ์ฐฉ๋๋ฉด ๋ฌด์กฐ๊ฑด ์ ์ ํ๊ณ ๋์ง ์๋๋ค. -> ์ค๋ฅธ์ชฝ๋ถํฐ ํ์ธํ ์ง ์ผ์ชฝ๋ถํฐ ํ์ธํ ์ง๋ ์๊ฐ์ LSB๋ฅผ ํตํด์ ๋๋ค์ผ๋ก?
- ์ฒ ํ์๊ฐ ์ง์ ํฌํฌ๋ฅผ ๋บ์์ ์๋ค.
- ๊ต์ฐฉ์ํ ํ๋ณต์ ์ํด ์ฒ ํ์๋ฅผ ์ฃฝ์๋ค๊ฐ ๋์ด๋ฆด์ ์๋ค.
- usleep์ ์ต๋ํ ์ง์ํ๋ค. ํ๋๋ผ๋ usleep์ ๋ฃ๋๊ฒ ์ด๋ค์ํฅ์ ๋ฏธ์น๋์ง ํ์ ํ๋ค.
- ํฐ๋ฏธ๋์ ์ถ๋ ฅํ๋๊ฒ ์์คํ ์ฑ๋ฅ/์์์ ์ํฅ์ ๋ฏธ์น๋ค๋ฉด, ๋ค๋ฅธ๋ฐฉ์์ ์ถ๋ ฅ(logํ์ผ์ ์ ๋ ฅ)์ ์ด๋จ์ง ์๊ฐํด๋ณธ๋ค.
- ์ฒ ํ์๊ฐ ์ฃฝ์ ์๊ฐ์ ์ฃฝ์๊ฑธ ํ์ธํ ์๊ฐ์ด ์๋๋ผ, ๋ฐฅ ๋ค๋จน์ ์๊ฐ + ์๋ช ๊ฐ์ด๋ค.
- ํฌํฌ๋ฅผ ์ ํํ ๋ ๊ทธ ์ ๋๋ฅผ ์ ์ ํด์ผํ๋ค. -> ์์์ ์ ํํ๋ฉด ์ฒ ํ์๊ฐ ๋ ์ฝ๊ฒ ๊ตถ์ด์ฃฝ๊ธฐ ๋๋ฌธ์
4. ํต์์ ์ธ ๊ต์ฐฉ์ํ ์ฒ๋ฆฌ๋ฐฉ์๊ณผ ์ ์ฉ๊ณ ์ฐฐ
๊ต์ฐฉ์ํ๋ ์์ฌํ์๊ณผ ๋ฌ๋ฆฌ ์ ์ฑ ์ ์๋ชป/์ค๋ฅ๊ฐ ์์ด๋ ์์ฐ์ ์ผ๋ก ๋ฐ์ํ๋ ์ํฉ์ด๋ค. ๋ํ ์๋ฒฝํ๊ฒ ํด๊ฒฐํ ์ ์๊ณ , ์๋ฒฝํ๊ฒ ๋ง์์ ์๋ค.
4.1 ๊ต์ฐฉ ์ํ ์๋ฐฉ
๊ต์ฐฉ์ํ ํ์์กฐ๊ฑด์ธ ์ํธ๋ฐฐ์ , ๋น์ ์ , ์ ์ /๋๊ธฐ, ์ํ๋๊ธฐ ์ค ํ๋๋ฅผ ๋ฌด๋ ฅํํ๋ ๋ฐฉ์.
์ํธ ๋ฐฐ์ ์๋ฐฉ-> ์์์ด ์ ํด์ ธ ์์ผ๋ฏ๋ก ๋ถ๊ฐ.๋น์ ์ ์๋ฐฉ-> ์ฒ ํ์์ ํฌํฌ๋ ๋บ์์ ์์ผ๋ฏ๋ก ๋ถ๊ฐ.- ์ ์ /๋๊ธฐ ์๋ฐฉ -> ์ ๋ถํ ๋นํ๊ฑฐ๋ ์ ํํ์ง ์๋ ๋ฐฉ์์ฌ์ฉํ๋ค. ๊ฐ๋ฅ์ ํ ๊ฑฐ๊ฐ์ง๋ง ์์์ ํ์ฉ์ฑ์ด ๋จ์ด์ง๋ฏ๋ก ์ฒ ํ์๊ฐ ๋ ์ฝ๊ฒ ๊ตถ์ด์ฃฝ์๊ฒ ๊ฐ๋ค.
- ์ํ ๋๊ธฐ ์๋ฐฉ -> ์ํ๋๊ธฐ ์ํ๊ฐ ๋ ์ ์๊ฒํ๋ค. ํฌํฌ์ ๋ฒํธ๋ฅผ ๋งค๊ธฐ๊ณ (0๋ถํฐ 1์ฉ ์ฆ๊ฐ), ์์ ์ซ์์ ํฌํฌ๋ฅผ ์ก๊ณ ์์๋๋ง ๊ทธ ๋ค์ํฌํฌ๋ฅผ ์ฃผ๋ ๋ฐฉ์์ ์ทจํ๋ค. ์์ ํ ๋น์ ๋ฐฉํฅ์ด ๊ฐ์ ๋์ด์ ์ ์ฐ์ฑ์ด ๋จ์ด์ง๋ค(๋ง์ฐ์ค, ํค๋ณด๋์์ ์์ฒญ์ ๋ง์ฐ์ค->ํค๋ณด๋ ์์๋ก๋ง ์๋๋๋ ์ํฉโฆ).
์ ์ /๋๊ธฐ ์๋ฐฉ ๋ฐฉ์๊ณผ ์ํ๋๊ธฐ ์๋ฐฉ ๋ฐฉ์์ด ๊ฐ์ฅ ์ ์ฉํด ๋ณด์ธ๋ค.
์ผ๋ฐ์ ์ธ OS์์ ๊ต์ฐฉ์ํ ์๋ฐฉ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ง ์๋๋ค. ์ด์ ๋ฐฉ์์ ์ ํ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. -> ๋น์ ์์ ์ธ ๋์๋ฐฉ์.
4.2 ๊ต์ฐฉ ์ํ ํํผ
์์ ํ ๋น๋์ ์กฐ์ ํ์ฌ ๊ต์ฐฉ์ํ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์. ์๋ฐฉ์ ๊ต์ฐฉ ๊ตฌ์กฐ๊ฐ ์๊ธฐ์ง ์๊ฒ ์์ ๋ถ๋ฐฐ(๋์)๋ฐฉ์์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด๊ณ , ํํผ๋ ์์์ ์์ ์กฐ์ ํ๋ ๊ฒ์ด๋ค.
- 3.2.1 ์ํ์ ์๊ณ ๋ฆฌ์ฆ
ํ์ง๋ง.. ๋ฉ๋ฐํ ๋ฆฌ ๋ถ๋ถ์ ํ ๋น๋๋ ์์ ๋ชจ์๋ผ์ ์๋๋ผ, ํน์ ์์(์ผ์ชฝ/์ค๋ฅธ์ชฝ ํฌํฌ)๋ง์ ์๊ตฌํ๋ ํ๋ก์ธ์ค๊ฐ ๊ต์ฐฉ์ํ๊ฐ ๋ฐ์์ํจ๋ค. ์์์ ์ด๋์ ์กฐ์ ํด์ ํด๊ฒฐ๋ ๋ฌธ์ ๊ฐ ์๋๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ์ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํ๊ธฐ ํ๋ค๊ฒ ๊ฐ๋ค. ๋ณด๋์ค ๋ถ๋ถ์ ์ ์ฉ ํด์ผํ ๋ฏ ๋ณด์.
4.3 ๊ต์ฐฉ์ํ ๊ฒ์ถ ๋ฐ ํ๋ณต
๊ต์ฐฉ์ํ๋ ๋ง์์ ์๊ณ , ํํผํ ์ ์์ง๋ง ๊ทธ ๊ณผ์ ์์๋ ์์์ ๋ญ๋นํ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ์ฐจ๋ผ๋ฆฌ ๊ต์ฐฉ์ํ์ ๊ฑธ๋ ค๋ฒ๋ฆฌ๊ณ ํ์์ฒ๋ฆฌ๋ฅผ ํ๋ ๋ฐฉ์์ด๋ค. ๊ต์ฐฉ์ํ๊ฐ ํ์ธ(๊ฒ์ถ)๋๋ฉด ๊ต์ฐฉ์ํ์ธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข ๋ฃ(ํ๋ณต)ํ๋ค. ๊ฐ์ฅ ํ์ค์ ์ด๊ณ ๋ณดํธ์ ์ธ ๋ฐฉ๋ฒ์ด์ง๋ง. ํด๋น๊ณผ์ ์ ์ ํฉํ ๋ฐฉ์์ด ์๋๋ค.