{"componentChunkName":"component---src-templates-blog-post-js","path":"/Operating-Systems/2020-05-21-운영체제-식사하는-철학자-문제/","result":{"data":{"site":{"siteMetadata":{"title":"Hun's Footsteps 🥷","author":"전여훈","siteUrl":"https://jeonyeohun.netlify.app","comment":{"disqusShortName":"","utterances":"jeonyeohun/jeonyeohun.github.io"},"sponsor":{"buyMeACoffeeId":"jeonyeohun"}}},"markdownRemark":{"id":"d0f99eb6-6ae5-51f7-b61d-ececbd0d6c42","excerpt":"참고도서: Operating System Concepts (10/E) Abraham Silberschatz, Peter B. Galvin, Greg Gagne 식사하는 철학자들 철학자들이면서 너무 단순 무식하다.. 식사하는 철학자들 문제는 이렇다. 식사를 하기 위해 모인 철학자 N 명이 있고, 각 철학자들 사이에는 젓가락이 하나씩 총…","html":"<p>참고도서: <em>Operating System Concepts (10/E) Abraham Silberschatz, Peter B. Galvin, Greg Gagne</em></p>\n<h2 id=\"식사하는-철학자들\" style=\"position:relative;\"><a href=\"#%EC%8B%9D%EC%82%AC%ED%95%98%EB%8A%94-%EC%B2%A0%ED%95%99%EC%9E%90%EB%93%A4\" aria-label=\"식사하는 철학자들 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>식사하는 철학자들</h2>\n<p>철학자들이면서 너무 단순 무식하다.. 식사하는 철학자들 문제는 이렇다. 식사를 하기 위해 모인 철학자 N 명이 있고, 각 철학자들 사이에는 젓가락이 하나씩 총 5개가 있다. 철학자들은 밥을 먹기위해서 두 개의 젓가락을 사용해야하는데, 하나의 젓가락을 바로 옆에 있는 철학자와 공유(…)하기 때문에 문제가 발생하게 된다.</p>\n<p>만약 한번에 N명의 철학자들이 모두 자신의 왼쪽에 있는 젓가락을 집으려고 하는 상황을 상상해보자. 모양새가 웃기긴 하겠지만 각 철학자들은 왼쪽에 있던 젓가락 하나씩을 확보했다. 그리고 밥을 먹기위해서 오른쪽에 있는 젓가락을 들려고 했는데, 자신의 오른편에 있던 젓가락은 자신의 이전 사람이 왼손에 들고있기 때문에 그 사람이 젓가락을 놓길 기다리게 된다. 이렇게 모든 철학자들이 자신의 오른편에 있는 사람의 작업이 끝나길 기다리게 되기 때문에 <code class=\"language-text\">교착상태(Deadlock)</code> 상황에 빠지게 된다. 모든 철학자들이 굶어죽게(Starvation) 되는 것이다..</p>\n<p>이 문제를 세마포어를 사용해서 해결해보자</p>\n<h2 id=\"data-structure\" style=\"position:relative;\"><a href=\"#data-structure\" aria-label=\"data structure permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Data Structure</h2>\n<p>일단 공유자원인 젓가락을 선언해보자 만약 다섯명의 철학자가 있다고 한다면,</p>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\">semaphore chopstick<span class=\"token punctuation\">[</span><span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>이렇게 5개의 세마포어를 만들 수 있다. 배열의 인덱스는 각 젓가락들의 번호를 의미하고 각 젓가락은 한번에 한명만 집어들 수 있기 때문에 1로 초기화 된다.</p>\n<h2 id=\"solution\" style=\"position:relative;\"><a href=\"#solution\" aria-label=\"solution permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Solution?</h2>\n<div class=\"gatsby-highlight\" data-language=\"cpp\"><pre class=\"language-cpp\"><code class=\"language-cpp\"><span class=\"token keyword\">do</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">wait</span><span class=\"token punctuation\">(</span>chopstick<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>         <span class=\"token comment\">// 왼쪽에 있는 젓가락을 들 수 있는지 확인</span>\n    <span class=\"token function\">wait</span><span class=\"token punctuation\">(</span>chopstick<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\">// 오른쪽에 있는 젓가락을 들 수 있는지 확인</span>\n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n\n    <span class=\"token comment\">/* 식사(작업) */</span>\n\n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n    <span class=\"token function\">signal</span><span class=\"token punctuation\">(</span>chopstick<span class=\"token punctuation\">[</span>i<span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>           <span class=\"token comment\">// 왼쪽 젓가락 내려놓기</span>\n    <span class=\"token function\">signal</span><span class=\"token punctuation\">(</span>chopstick<span class=\"token punctuation\">[</span><span class=\"token punctuation\">(</span>i<span class=\"token operator\">+</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token operator\">%</span> <span class=\"token number\">5</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>   <span class=\"token comment\">// 오른쪽 젓가락 내려놓기</span>\n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n\n    <span class=\"token comment\">/* 멍때리기 */</span>\n\n    <span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span><span class=\"token punctuation\">.</span>\n<span class=\"token punctuation\">}</span> <span class=\"token keyword\">while</span> <span class=\"token punctuation\">(</span><span class=\"token boolean\">true</span><span class=\"token punctuation\">)</span></code></pre></div>\n<p>위 코드를 해석해보면 흐름은 아래와 같다.</p>\n<ol>\n<li>왼쪽에 있는 젓가락을 들 수 있는지 확인한다.</li>\n<li>들 수 있다면 오른쪽 젓가락을 들기위해 계속 진행하고, 다른 철학자가 오른쪽 젓가락을 들고 있다면 내려놓을 때까지 대기한다.</li>\n<li>두 개의 젓가락을 모두 획득했다면 작업을 수행한다.</li>\n<li>작업을 마치고 두 젓가락을 모두 내려놓는다.</li>\n</ol>\n<p>세마포어를 사용해서 위와 같이 구현하게 되면 동시에 여러 철학자들이 한 젓가락에 접근하는 것은 막을 수 있다. 그렇다면 정말 동기화 문제가 해결이 된 것일까? 그렇지 않다. 초입에서 설명했던 것 처럼 만약에 모든 철학자들이 왼쪽에 있는 젓가락을 획득하게된다면, <code class=\"language-wait(chopstick[(i+1) \"> 5]);</code> 코드에 의해서 누군가 오른쪽 젓가락을 내려놓는 signal 을 실행할때까지 대기하게 된다. 이때, 모든 철학자들이 이것을 위해 대기 큐에서 대기하게되기 때문에 <code class=\"language-text\">Deadlock</code> 상태에 빠지게 된다.</p>\n<h2 id=\"possible-solutions\" style=\"position:relative;\"><a href=\"#possible-solutions\" aria-label=\"possible solutions permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Possible Solutions</h2>\n<p>결론적으로 세마포어를 사용하는 것 만으로는 식사하는 철학자 문제를 해결할 수 없다. Deadlock을 해결하기 위한 몇가지 전략을 생각해보자</p>\n<h3 id=\"숫가락-갯수---1-명의-철학자만-식사자리에-초대하기\" style=\"position:relative;\"><a href=\"#%EC%88%AB%EA%B0%80%EB%9D%BD-%EA%B0%AF%EC%88%98---1-%EB%AA%85%EC%9D%98-%EC%B2%A0%ED%95%99%EC%9E%90%EB%A7%8C-%EC%8B%9D%EC%82%AC%EC%9E%90%EB%A6%AC%EC%97%90-%EC%B4%88%EB%8C%80%ED%95%98%EA%B8%B0\" aria-label=\"숫가락 갯수   1 명의 철학자만 식사자리에 초대하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>숫가락 갯수 - 1 명의 철학자만 식사자리에 초대하기</h3>\n<p>N개의 젓가락이 있다면, N-1명의 철학자만 함께 식사를 할 수 있게 한다. 이렇게 하면, 모두 동시에 왼쪽 젓가락을 들더라도, 한개의 여유 젓가락이 생기게 되고 한명의 최악의 경우에도 한명의 철학자가 식사를 시작하고 마칠 수 있게 된다.</p>\n<h3 id=\"동시에-양옆의-젓가락을-집을-수-있을-때만-젓가락을-집기\" style=\"position:relative;\"><a href=\"#%EB%8F%99%EC%8B%9C%EC%97%90-%EC%96%91%EC%98%86%EC%9D%98-%EC%A0%93%EA%B0%80%EB%9D%BD%EC%9D%84-%EC%A7%91%EC%9D%84-%EC%88%98-%EC%9E%88%EC%9D%84-%EB%95%8C%EB%A7%8C-%EC%A0%93%EA%B0%80%EB%9D%BD%EC%9D%84-%EC%A7%91%EA%B8%B0\" aria-label=\"동시에 양옆의 젓가락을 집을 수 있을 때만 젓가락을 집기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>동시에 양옆의 젓가락을 집을 수 있을 때만 젓가락을 집기</h3>\n<p>왼쪽과 오른쪽 젓가락이 모두 사용이 가능할 때만 젓가락을 집게한다. 지금 문제가 일단 왼쪽 젓가락은 무조건 집고 오른쪽을 확인하기 때문에 교착상태가 발생하는데, 두개가 모두 사용가능할 때만 젓가락을 획득하게하면 교착상태는 일어나지 않는다.</p>\n<h3 id=\"짝수번째-철학자와-홀수번째-철학자의-젓가락-집는-방향을-반대로-하기\" style=\"position:relative;\"><a href=\"#%EC%A7%9D%EC%88%98%EB%B2%88%EC%A7%B8-%EC%B2%A0%ED%95%99%EC%9E%90%EC%99%80-%ED%99%80%EC%88%98%EB%B2%88%EC%A7%B8-%EC%B2%A0%ED%95%99%EC%9E%90%EC%9D%98-%EC%A0%93%EA%B0%80%EB%9D%BD-%EC%A7%91%EB%8A%94-%EB%B0%A9%ED%96%A5%EC%9D%84-%EB%B0%98%EB%8C%80%EB%A1%9C-%ED%95%98%EA%B8%B0\" aria-label=\"짝수번째 철학자와 홀수번째 철학자의 젓가락 집는 방향을 반대로 하기 permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>짝수번째 철학자와 홀수번째 철학자의 젓가락 집는 방향을 반대로 하기</h3>\n<p>홀수번째에 있는 철학자들은 왼쪽 젓가락을 먼저 집고, 짝수번째에 있는 철학자들은 오른쪽 젓가락을 먼저 집게한다. 이 규칙을 만들면 모든 철학자가 자신의 양옆에 있는 철학자들과 젓가락을 집는 방향이 달라지게되기 때문에 서로가 한쪽을 바라보며 서로를 기다려야하는 상황이 발생하는 않는다.</p>","frontmatter":{"title":"[운영체제] 고전적 동기화 문제-3 : 식사하는 철학자 문제(The Dining-Philosophers Problem)","date":"May 21, 2020"}}},"pageContext":{"slug":"/Operating-Systems/2020-05-21-운영체제-식사하는-철학자-문제/","previous":{"fields":{"slug":"/Operating-Systems/2020-05-20-운영체제-교착상태와기아상태/"},"frontmatter":{"title":"[운영체제] 교착상태, 기아상태 그리고 우선순위역전(Deadlocks, Starvation and Priority Inversion)","category":"Operating-Systems","draft":false}},"next":{"fields":{"slug":"/Operating-Systems/2020-05-21-운영체제-유한버퍼문제/"},"frontmatter":{"title":"[운영체제] 고전적 동기화 문제-1 : 유한 버퍼 문제(The Bounded-Buffer Problem)","category":"Operating-Systems","draft":false}}}},"staticQueryHashes":["2486386679","3128451518"]}