철학자들의 저녁식사 문제가 무엇인가요??
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가 존재합니다.