λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
ComputerScience πŸ“š/운영체제

[OS] μ‹μ‚¬ν•˜λŠ” μ² ν•™μžλ“€ 문제(The Dining-Philosophers Problem)

by dkswnkk 2022. 3. 2.

 

 

μ‹μ‚¬ν•˜λŠ” μ² ν•™μžλ“€ 문제(_The Dining-Philosophers Problem)

μƒκ°ν•˜κ³  λ¨ΉμœΌλ©΄μ„œ κ·Έλ“€μ˜ 생애λ₯Ό λ³΄λ‚΄λŠ” 5λͺ…μ˜ μ² ν•™μžλ₯Ό κ³ λ €ν•΄ λ΄…μ‹œλ‹€. μ² ν•™μžλ“€μ€ μ›ν˜• ν…Œμ΄λΈ”μ„ κ³΅μœ ν•˜λ©°, 이 ν…Œμ΄λΈ”μ€ 각각 ν•œ μ² ν•™μžμ— μ†ν•˜λŠ” 5개의 의자둜 λ‘˜λŸ¬μ‹Έμ—¬ μžˆμŠ΅λ‹ˆλ‹€. ν…Œμ΄λΈ” μ€‘μ•™μ—λŠ” ν•œ μ‚¬λ°œμ˜ λ°₯이 있고, μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 ν…Œμ΄λΈ”μ—λŠ” λ‹€μ„― 개의 젓가락이 놓여 μžˆμŠ΅λ‹ˆλ‹€.

μ‹μ‚¬ν•˜λŠ” μ² ν•™μžμ˜ 상황

μ² ν•™μžκ°€ 생각을 ν•  λ•ŒλŠ” λ‹€λ₯Έ λ™λ£Œλ“€κ³Ό μƒν˜Έ μž‘μš©μ„ ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ•Œλ•Œλ‘œ μ² ν•™μžλ“€μ€ λ°°κ°€ κ³ νŒŒμ§€λŠ”λ° 그럴 λ•Œμ—λŠ” μžμ‹ μ—κ²Œ κ°€μž₯ κ°€κΉŒμ΄ μžˆλŠ” 두 개의 젓가락(μ™Όμͺ½ 젓가락을 λ¨Όμ € μ§‘μŠ΅λ‹ˆλ‹€)을 μ§‘μœΌλ €κ³  μ‹œλ„ν•©λ‹ˆλ‹€. μ² ν•™μžλŠ” ν•œ λ²ˆμ— ν•œ 개의 μ “κ°€λ½λ§Œ 집을 μˆ˜λ„ 있으며, 이미 μ˜† μ‚¬λžŒμ˜ 손에 λ“€μ–΄κ°„ 젓가락을 집을 μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. λ°°κ³ ν”ˆ μ² ν•™μžκ°€ λ™μ‹œμ— 젓가락을 두 개λ₯Ό μ§‘μœΌλ©΄, 젓가락을 놓지 μ•Šκ³  손에 λ“€κ³  μžˆλŠ” μ±„λ‘œ 식사λ₯Ό ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‹€κ°€ 식사λ₯Ό 마치면, 젓가락 두 개λ₯Ό λͺ¨λ‘ 놓고 λ‹€μ‹œ 생각에 λΉ μ§‘λ‹ˆλ‹€.

 μ‹μ‚¬ν•˜λŠ” μ² ν•™μžλ“€ λ¬Έμ œλŠ” 고전적인 동기화 문제둜 κ°„μ£Όν•˜λŠ”λ°, κ·Έ μ΄μœ λŠ” μ‹€μš©μ μœΌλ‘œ μ€‘μš”ν•˜κ±°λ‚˜ ν˜Ήμ€ 컴퓨터 κ³Όν•™μžλ“€μ΄ μ² ν•™μžλ₯Ό μ‹«μ–΄ν•΄μ„œκ°€ μ•„λ‹ˆλΌ λ§Žμ€ λΆ€λ₯˜μ˜ 병행 μ œμ–΄ 문제의 ν•œ 예이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.  λ§Œμ•½ λͺ¨λ“  μ² ν•™μžκ°€ λ™μ‹œμ— λ°°κ°€ κ³ ν”„κ³  각 μ² ν•™μžκ°€ μ™Όμͺ½μ— μžˆλŠ” 젓가락을 작으면 더 μ‚¬μš© κ°€λŠ₯ν•œ 젓가락이 없기에 λͺ¨λ“  μ² ν•™μžλ“€μ€ μ˜μ›νžˆ λˆ„κ΅°κ°€ ν¬κΈ°ν•˜μ§€ μ•ŠλŠ” 이상 μ˜μ›νžˆ 였λ₯Έμͺ½ 젓가락을 μ‚¬μš©ν•  수 μžˆμ„ λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦½λ‹ˆλ‹€.

 μš°λ¦¬λŠ” 이런 상황을 ꡐ착 μƒνƒœ(Deadlocks)라고 λΆ€λ¦…λ‹ˆλ‹€. 또 λ‹€λ₯Έ 쒋은 μ˜ˆλ„ μžˆμŠ΅λ‹ˆλ‹€. "두 κΈ°μ°¨κ°€ κ΅μ°¨λ‘œμ—μ„œ μ„œλ‘œ μ ‘κ·Όν•  λ•ŒλŠ”, λ‘˜ λ‹€ μ™„μ „νžˆ 정지해야 ν•˜λ©° μƒλŒ€λ°©μ΄ 없어지지 μ•ŠλŠ” ν•œ λˆ„κ΅¬λ„ λ‹€μ‹œ μΆœλ°œν•  수 μ—†λ‹€."μž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ΅μ°©μƒνƒœμ™€ ν•΄κ²°λ°©μ•ˆμ— λŒ€ν•΄μ„œλŠ” λ‹€μŒ κ²Œμ‹œκΈ€μ—μ„œ 더 μžμ„Έν•˜κ²Œ 정리해 보도둝 ν•˜κ³  이번 κ²Œμ‹œκΈ€ μ—μ„œλŠ” μ‹μ‚¬ν•˜λŠ” μ² ν•™μžλ“€ 문제의 상황을 ν•΄κ²°ν•˜λŠ” 두 가지 방법에 λŒ€ν•΄ μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

(1) μ„Έλ§ˆν¬ ν•΄κ²°μ•ˆ(_Semaphore Solution)

ν•œ 가지 κ°„λ‹¨ν•œ 해결책은 각 젓가락을 ν•˜λ‚˜μ˜ μ„Έλ§ˆν¬λ‘œ ν‘œν˜„ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ² ν•™μžλŠ” κ·Έ μ„Έλ§ˆν¬μ— wait() 연산을 μ‹€ν–‰ν•˜μ—¬ 젓가락을 μ§‘μœΌλ €κ³  μ‹œλ„ν•©λ‹ˆλ‹€. κ·ΈλŠ” λ˜ν•œ ν•΄λ‹Ή μ„Έλ§ˆν¬μ— signal() 연산을 μ‹€ν–‰ν•¨μœΌλ‘œμ¨ μžμ‹ μ˜ 젓가락을 λ†“μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ―€λ‘œ 곡유 μžλ£ŒλŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

semaphore chopstick[5];

μ—¬κΈ°μ„œ chopstick의 μ›μ†Œλ“€μ€ λͺ¨λ‘ 1둜 μ΄ˆκΈ°ν™”λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. μ² ν•™μž i의 κ΅¬μ‘°λŠ” μ•„λž˜ μ†ŒμŠ€μ— λ‚˜νƒ€λ‚˜ μžˆμŠ΅λ‹ˆλ‹€.

μ² ν•™μž i의 ꡬ쑰

 μ΄ ν•΄κ²°μ•ˆμ€ μΈμ ‘ν•œ 두 μ² ν•™μžκ°€ λ™μ‹œμ— μ‹μ‚¬ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 보μž₯ν•˜μ§€λ§Œ, κ΅μ°©μƒνƒœλ₯Ό μ•ΌκΈ°ν•  κ°€λŠ₯성이 있기 λ•Œλ¬Έμ— 채택할 수 μ—†μŠ΅λ‹ˆλ‹€. 5λͺ…μ˜ μ² ν•™μž λͺ¨λ‘κ°€ λ™μ‹œμ— λ°°κ°€ κ³ ν”„κ²Œ λ˜μ–΄, 각각 μžμ‹ μ˜ μ™Όμͺ½ 젓가락을 μž‘λŠ”λ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€. chopstick의 λͺ¨λ“  μ›μ†Œλ“€μ€ 이제 0이 될 κ²ƒμž…λ‹ˆλ‹€. 각 μ² ν•™μžκ°€ 그의 였λ₯Έμͺ½ 젓가락을 μ§‘μœΌλ €κ³  ν•˜λ©΄ μ˜μ›νžˆ κΈ°λ‹€λ €μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€.

 μ‹μ‚¬ν•˜λŠ” μ² ν•™μžμ˜ κ΅μ°©μƒνƒœ λ¬Έμ œμ— λŒ€ν•œ μ—¬λŸ¬ 가지 해결책듀은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • μ΅œλŒ€ 4λͺ…μ˜ μ² ν•™μžλ§Œμ΄ ν…Œμ΄λΈ”μ— λ™μ‹œμ— 앉을 수 μžˆλ„λ‘ ν•œλ‹€.
  • ν•œ μ² ν•™μžκ°€ 젓가락 두 개λ₯Ό λͺ¨λ‘ 집을 수 μžˆμ„ λ•Œλ§Œ 젓가락을 집도둝 ν—ˆμš©ν•œλ‹€(μ΄λ ‡κ²Œ ν•˜λ €λ©΄ μ² ν•™μžλŠ” μž„κ³„ ꡬ역 μ•ˆμ—μ„œλ§Œ 젓가락을 집어야 ν•œλ‹€).
  • λΉ„λŒ€μΉ­ ν•΄κ²°μ•ˆμ„ μ‚¬μš©ν•œλ‹€. 즉, ν™€μˆ˜ 번호의 μ² ν•™μžλŠ” λ¨Όμ € μ™Όμͺ½ 젓가락을 집고 λ‹€μŒμ— 였λ₯Έμͺ½ 젓가락을 μ§‘λŠ”λ‹€. λ°˜λ©΄μ— 짝수 번호의 μ² ν•™μžλŠ” 였λ₯Έμͺ½ 젓가락을 집고 λ‹€μŒμ— μ™Όμͺ½ 젓가락을 μ§‘λŠ”λ‹€.

κ·ΈλŸ¬λ‚˜ μ‹μ‚¬ν•˜λŠ” μ² ν•™μžλ“œμ˜ λ¬Έμ œμ— λŒ€ν•œ λ§Œμ‘±ν• λ§Œν•œ ν•΄κ²°μ•ˆλ“€μ€ λ°˜λ“œμ‹œ μ² ν•™μž 쀑 μ–΄λŠ ν•˜λ‚˜κ°€ κ΅Άμ–΄ 죽을 κ°€λŠ₯성이 생기지 μ•Šλ„λ‘ 방지해야 ν•œλ‹€λŠ” 것을 μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. κ΅μ°©μƒνƒœκ°€ μ—†λŠ” ν•΄κ²°μ•ˆμ΄ λ°˜λ“œμ‹œ κΈ°μ•„μ˜ κ°€λŠ₯성도 μ œκ±°ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€.

(2) λͺ¨λ‹ˆν„° ν•΄κ²°μ•ˆ(_Monitor Solution)

λ‹€μŒμœΌλ‘œ μ‹μ‚¬ν•˜λŠ” μ² ν•™μž λ¬Έμ œμ— λŒ€ν•œ ꡐ착 μƒνƒœκ°€ μ—†λŠ” ν•΄κ²°μ•ˆμ„ μ œμ‹œν•¨μœΌλ‘œμ¨ λͺ¨λ‹ˆν„° κ°œλ…μ„ μ„€λͺ…ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€. 이 ν•΄κ²°μ•ˆμ€ μ² ν•™μžλŠ” μ–‘μͺ½ 젓가락 λͺ¨λ‘ 얻을 수 μžˆμ„ λ•Œλ§Œ 젓가락을 집을 수 μžˆλ‹€λŠ” μ œν•œμ„ κ°•μ œν•©λ‹ˆλ‹€. 이 ν•΄κ²°μ•ˆμ„ κ΅¬ν˜„ν•˜λ €λ©΄, μ² ν•™μžκ°€ μ²˜ν•  수 μžˆλŠ” μ„Έ 가지 μƒνƒœλ“€μ„ ꡬ뢄할 ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ λͺ©μ μœΌλ‘œ λ‹€μŒμ˜ 자료ꡬ쑰λ₯Ό λ„μž…ν•©λ‹ˆλ‹€.

enum {THINKING, HUNGRY, EATING} state[5];

μ² ν•™μž iλŠ” 그의 μ–‘μͺ½ 두 이웃이 μ‹μ‚¬ν•˜μ§€ μ•Šμ„ λ•Œλ§Œ λ³€μˆ˜ state[i] = EATING으둜 μ„€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€(쑰건 (state[(i+4)%5] != EATIHG) 그리고 (state[(i+1)%5] != EATING)이 성립할 λ•Œλ§Œ).

 λ˜ν•œ λ‹€μŒμ„ μ„ μ–Έν•  ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

condition self[5];

selfλŠ” μ² ν•™μž iκ°€ λ°°κ³ ν”„μ§€λ§Œ μžμ‹ μ΄ μ›ν•˜λŠ” 젓가락을 집을 수 없을 λ•Œ 젓가락 집기λ₯Ό λ―Έλ£° 수 있게 ν•©λ‹ˆλ‹€.

 μš°λ¦¬λŠ” 이제 μ‹μ‚¬ν•˜λŠ” μ² ν•™μž λ¬Έμ œμ— λŒ€ν•œ 우리의 ν•΄κ²°μ•ˆμ„ κΈ°μˆ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ “κ°€λ½μ˜ λΆ„λ°°λŠ” λͺ¨λ‹ˆν„° DiningPhilosophers에 의 ν•΄ μ œμ–΄λ©λ‹ˆλ‹€. 이 λͺ¨λ‹ˆν„°κ°€ μ •μ˜κ°€ μ•„λž˜ μ†ŒμŠ€μ— λ‚˜μ™€ μžˆμŠ΅λ‹ˆλ‹€.

μ‹μ‚¬ν•˜λŠ” μ² ν•™μž λ¬Έμ œμ— λŒ€ν•œ λͺ¨λ‹ˆν„° ν•΄κ²°μ•ˆ

각 μ² ν•™μžλŠ” μ‹μ‚¬ν•˜κΈ° 전에 pickup() 연산을 λ°˜λ“œμ‹œ ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 행동은 μ² ν•™μž ν”„λ‘œμ„ΈμŠ€μ˜ μΌμ‹œ 쀑지λ₯Ό 낳을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 연산이 μ„±κ³΅μ μœΌλ‘œ λλ‚˜λ©΄, μ² ν•™μžλŠ” 식사할 수 μžˆμŠ΅λ‹ˆλ‹€. 식사λ₯Ό 마친 ν›„, μ² ν•™μžλŠ” putdown() 연산을 ν˜ΈμΆœν•©λ‹ˆλ‹€. λ”°λΌμ„œ μ² ν•™μž iλŠ” λ°˜λ“œμ‹œ λ‹€μŒκ³Ό 같은 μˆœμ„œλ‘œ pickup()κ³Ό putdown() 연산을 ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€.

DiningPhilosophers.pickup(i);
... eat ...
DiningPhilosophers.putdown(i);

 μ΄ ν•΄κ²°μ•ˆμ΄ μ΄μ›ƒν•œ 두 μ² ν•™μžκ°€ λ™μ‹œμ— μ‹μ‚¬ν•˜μ§€ μ•ŠλŠ” 것과 ꡐ착 μƒνƒœκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 것을 보μž₯ν•œλ‹€λŠ” 것을 λ³΄μ΄κΈ°λŠ” μ‰½μŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μš°λ¦¬λŠ” μ² ν•™μžκ°€ κ΅Άμ–΄μ£½λŠ” 것이 κ°€λŠ₯ν•˜λ‹€λŠ” 것에 μœ μ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€(κΈ°μ•„μƒνƒœμ— λΉ μ§€λŠ” μ² ν•™μžκ°€ μžˆμ„ 수 있음)

λŒ“κΈ€