운영체제

철학자들의 저녁식사 문제

xodnek 2021. 8. 11. 13:59

철학자들의 저녁식사 문제가 무엇인가요??

5명의 철학자들이 젓가락이 5개밖에 없어서 한 명의 철학자가 2개의 젓가락을 이용해야 식사를 할 수 있습니다.

동시에 젓가락을 잡으려고하면 생기는 문제에 대해 파악할 수 있습니다.

원형 테이블을 공유하며, 테이블 중앙에는 밥이 있습니다. 양 옆의 젓가락을 집을 경우 식사를 할 수 있으며, 식사를 마치면 젓가락을 2개를 모두 놓고 다시 생각합니다.

 

이 상황에서는 교착(Deadlock)과 기아(Starvation)이 생기게되지 않도록 하는 방법이 무엇이일까요??

세마포어를 이용해하여 상호 배제를 막을 수 있습니다. 각 젓가락에 세마포어를 걸어주는 것입니다.젓가락을 잡을 때 wait()을 걸고 젓가락을 내려놓게 되면 signal()을 보내면 됩니다.

하지만, 이렇게 하게 될 경우 데드락과 기아의 상태가 발생합니다.

5명의 철학자가 동시에 배가 고파질 경우가 있을 것입니다. 그래서 철학자들이 동시에 자신의 왼쪽 젓가락을 잡는다면, 철학자들은 오른쪽 젓가락을 잡을 수 없게 되어 무한정 대기에 걸려 데드락이 발생합니다.

또한, 똑같은 철학자가 계속해서 밥을 먹을 수 있어서 옆에 있는 사람은 굶어 죽을 수도 있습니다.

 

그럼 데드락 문제를 어떻게 해결하실 수 있다고 생각하시나요??

위에서 한 자리를 비어두게 되면 가능합니다. 한 자리가 비어 있는 곳의 젓가락을 잡을 것이고 다른 젓가락을 잡으면 먹을 수 있습니다.

만약 다른 젓가락을 잡을 수 없다면 비어 있는 곳의 젓가락도 같이 내려놓게 되면 해결이 됩니다.

 

또는 무조건 양쪽 젓가락을 동시에 잡을 수 있다면 가능합니다.

 

비대칭의 방법을 이용할 수 있습니다. 홀수 번째 철학자는 왼쪽 젓가락을 잡고 오른쪽 젓가락을 잡을 수 있도록 합니다. 짝수 번째 철학자는 오른쪽 젓가락을 잡고 왼쪽 젓가락을 잡을 수 있도록 하면 됩니다. 위에서 세마포어를 이용하였기에 동시에 같은 것은 잡을 수가 없습니다.

 

위의 문제로 데드락은 해결할 수 있어도... 기아의 문제를 해결이 안됩니다.

 

다른 문제 해결 방법도 있을까요??

모니터를 이용할 수 있을 것 같습니다.

이 해결의 조건은 철학자는 양쪽 젓가락을 모두 얻을 수 있을 때만 젓가락을 집어야 합니다.

그렇게 되면 철학자의 상태는 THINKING, HUNGRY, EATING으로 나뉩니다.

 

위의 조건을 보게되면 양쪽 젓가락을 모두 얻을 수 있을 때만 이라서 양쪽의 철학자의 상태는 EATING이 아닌 상태입니다.

그래서 철학자들이 배고프게되면 wait()을 이용하며, 밥을 다 먹으면 notify()을 줄 수있습니다.

 

하지만 이 방법도, 데드락과 상호배제는 없앨 수 있지만, 기아의 문제는 여전히 가지고 있습니다.

 

참고

thread-safe concurrent application을 위해 Transactional Memory, OpenMP, Functional Programming Language가 존재합니다.

 

'운영체제' 카테고리의 다른 글

주메모리의 관리  (0) 2021.08.13
데드락  (0) 2021.08.11
모니터  (0) 2021.08.10
뮤텍스와 세마포어  (0) 2021.08.10
동기화 문제 해결책(2)  (0) 2021.08.09