Monitors, Condition Variable가 필요한 상황

By | 2010/01/07

  저번 학기 운영체제론 수업을 들었습니다. 그 때 공부하면서 한 가지 이해가 잘 가지 않는 것이 있었는데 그것은 바로 Condition Variable이 필요한 상황이었습니다.

  그것이 있는 것을 알고 동작 원리를 알고 있었지만, 이것의 필요성에 대해 명확하게 이해가 되지 않아 한참을 고민하였습니다. 정확하게는 예를 들어 설명하는 것이 가장 좋았으나 그 예가 아무리 생각해도 나타나지 않아 결국 개념과 방법 등을 시험 대비용으로 무식하게 외웠습니다.

  그러다 이번에 Multiprocessor Programming에 대한 책을 읽다가 그 예를 발견하였고 그것을 읽고서야 그것의 필요성에 대해 설명할 수 있게 되었습니다. 그러자 그 동작 원리와 사용법 등을 확실히 알 수 있었습니다.

  책에서 소개한 예는 고객센터입니다. 수많은 고객들이 고객센터에 전화를 겁니다. 상담원에 비해 걸려오는 전화가 많기에 기다리는 사람이 많습니다. 그럴 때 효율적인 일 처리를 위해 걸려오는 전화를 한 줄로 세웁니다. 그리고 각 상담원의 통화가 종료하면 줄에서 기다리는 사람과 통화 연결을 하도록 만들었습니다.

  하지만 문제가 있습니다. 만약 두 상담원이 동시에 통화가 끝나게 되어 줄에서 다음 고객과 전화를 하려고 할 때 충돌이 발생합니다. 또한 두 고객이 동시에 전화를 걸게 되어 줄을 세울 때 충돌이 발생합니다.

  이 문제를 해결하기 위해 줄에 고객을 넣거나 뺄 때 mutual exclusion algorithm을 사용합니다. 여기서는 줄에 lock을 사용하여 이를 해결합니다.

  그렇지만 다음과 같은 문제가 발생할 수 있습니다. 만약 한 상담원이 통화가 끝나 줄에 기다리고 있는 고객과 통화를 하기 위해 줄에서 고객을 빼는 일을 하려고 합니다. 하지만 줄은 비어있어 빼는 일을 제대로 수행할 수 없습니다. 그럼 상담원은 줄에 고객이 들어올 때까지 기다려야 합니다.

  하지만 이 때 lock을 잡고 있는 상황에서 계속해서 기다리고 있으면 이것은 deadlock이 되어버립니다. 왜냐하면 줄에 고객이 들어오기 위해서는 먼저 lock을 잡은 후 줄에 고객을 넣고 lock을 풀기 때문입니다. 그렇지만 상담원이 기다리면서 lock을 계속 잡고 있으면 고객은 lock을 잡을 수 없어 줄에 들어갈 수 없습니다.

  이를 해결하기 위해 상담원은 자신이 잡은 lock을 풀고 기다리는 상태가 되어야 합니다. 그리고 줄에 고객이 들어오는 조건이 만족되면 그렇게 기다리는 상태에 있는 상담원을 깨워야 합니다.

  이것이 바로 condition variable이 필요한 상황이라 이해하였습니다.

  어떻게 보면 간단한 예이지만, 저 예를 찾지 못해 condition variable에 대한 이해를 제대로 하지 못했습니다. 그래서 한참을 고민하고 생각했습니다. 이제 그 의문이 풀리니 정말 다행입니다.^^

  지금까지 경험으로 봤을 때 한 번 어려워하다가 뒤에 해결책을 찾은 것의 경우 초반에 이해한 것보다 더 잘 기억 못합니다. 즉, 한 번 어려워한 것은 다음에 기억을 되살릴 때도 어려워합니다. 따라서 훗날을 위해 간단하게나마 이 글을 적습니다.

참조

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.