티스토리 뷰

Q> 식사하는 철학자 문제란?


A> 원탁에 여러명의 철학자가 앉아 있고 철학자의 수만큼의 포크가 철학자들 양옆에 놓여 있다. 만약에 4명의 철학자가 있다면 포크가 4개밖에 없기 때문에 최대 2명의 철학자가 동시에 식사를 할 수 있다. 여기서 철학자를 쓰레드로보고 포크를 공유 자원으로 보자. 각 쓰레드들은 포크(공유자원)를 얻기 위해서 계속 노력할것이다. 


그런데 만약 모든 쓰레드들이 왼쪽에 있는 포크를 얻으면 어떻게 될까? 남아 있는 포크가 없는 상태에서 오른쪽 포크를 얻기 위해서 계속 오른쪽 철학자의 포크가 사용 가능해질때까지 기다릴것이다. 즉, 모든 철학자가 밥을 먹지 못하게 된다. 이것이 바로 데드락이다. 한 쓰레드가 얻고자 하는 공유 자원을 왼쪽 쓰레드가 갖고 있고 왼쪽 쓰레드는 또 왼쪽왼쪽쓰레드가 갖고 있는 자원을 애타게 기다린다. 이런식으로, 모든 쓰레드가 꼬리에 꼬리를 물고 자원을 기다리는 상태가 되면 데드락이 발생한다. 이것을 환형 대기라고 한다.


데드락이 일단 발생하면 쓰레드를 강제 종료 시키는 방법을 행해야 하기 때문에, 좋지 않다. 따라서, 데드락은 발생하지 않게 예방하는것이 제일 좋다. 식사하는 철학자 문제에서 데드락을 예방하기 위해서는 일단 각 쓰레드가 자신의 왼쪽 오른쪽 공유자원을 동시에 가질수 있게 끔 이진 세마포어로 크리티컬 섹션을 감싸야 한다. 하지만 이렇게만 하면 4명의 철학자 중에 1명의 철학자만 식사를 할 수 있기 때문에 효율적이지 못하다. 따라서, 이진 세마포어로 크리티컬 섹션을 감싸야 하는것은 당연하고, 추가적으로 각 쓰레드 별로 세마포어를 두어야 한다. 내 쓰레드의 세마포어가 -1인 상태는 내가 양 쪽 포크를 모두 얻어서 식사중이라는것을 의미한다. 이때 내 양옆에 있는 스레드가 내 포크에 접근하려고 하면 내 세마포어가 -1인 상태이기 때문에 잠들것이다. 내가 식사를 마치고 나서 나의 세마포어를 업 시키면 옆에서 잠들고 있던 쓰레드들이 깨어날수 있다. 그럼 양옆 쓰레드는 그때 다시 식사를 할 수 있는 기회를 얻을 수 있을 것이다.


이런식으로 하면 데드락이 발생하지도 않고 한번에 최대 여러명이 동시에 식사를 할 수 있다.

'컴퓨터 공학과 졸업 > 운영체제' 카테고리의 다른 글

동기화를 제공하는 세가지 방식  (1) 2018.10.18
스케쥴링 알고리즘  (0) 2018.10.17
busy waiting  (0) 2018.08.10
메모리  (0) 2017.12.06
쓰레드 사용 예 및 구현 방법  (0) 2017.10.17
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함