스택·큐로 문제 해결
본문교무실 프린터에 문서가 평소 한 시간에 40개쯤 들어온다. 프린터는 한 시간에 50개를 출력할 수 있다. 이때 대기열에는 평균 4개쯤의 문서가 쌓여 있다. 그런데 시험 기간에 문서가 한 시간에 45개로, 고작 12% 늘었는데 대기열은 9개로 두 배 넘게 길어졌다. 왜 조금 바빠졌을 뿐인데 줄이 이렇게 크게 늘어날까? 그리고 큐와 스택 같은 자료 구조로 이런 문제를 어떻게 다룰까?
2.2.1큐로 대기열 흉내 내기
인쇄 대기열은 먼저 들어온 문서를 먼저 출력하는 큐이다. 프로그램으로 흉내 내려면 시간을 조금씩 흘려 보내며, 문서가 도착하면 큐에 넣고, 프린터가 비면 큐 앞에서 문서를 꺼내 출력한다. 도착 간격과 출력 시간을 무작위로 정하면 실제 대기열과 비슷한 모습이 나온다. 이런 시뮬레이션으로 줄이 얼마나 길어지는지, 문서 하나가 얼마나 기다리는지 잴 수 있다. 중요한 문서를 먼저 출력해야 한다면, 우선순위가 높은 것부터 꺼내는 우선순위 큐를 쓴다.
문서가 평균 도착률 \(\lambda\)로 무작위로 오고, 프린터가 평균 처리율 \(\mu\)로 무작위 시간에 출력하면, 이용률 \(\rho = \lambda/\mu\)에서 시스템 안의 평균 문서 수는 \[L = \frac{\rho}{1 - \rho}\]이다. 문서 하나가 시스템에 머무는 평균 시간은 출력 시간의 \(\dfrac{1}{1 - \rho}\)배이다.
그림 1에서 이용률을 바꾸어 보자. 이용률 0.8이면 평균 4개, 0.9이면 9개, 0.95이면 19개가 쌓인다. 0.8에서 0.9로 12% 바빠졌을 뿐인데 줄은 두 배 넘게 길어진다. 도착과 출력이 무작위라서, 잠깐 문서가 몰리면 프린터가 따라잡을 여유가 거의 없기 때문이다. 그래서 대기열을 설계할 때는 처리 능력을 도착률보다 넉넉하게, 이용률이 0.7~0.8을 넘지 않게 잡는다.1
2.2.2스택으로 괄호 검사하기
스택은 짝을 맞추는 문제에 알맞다. 수식이나 코드의 괄호가 바르게 닫혔는지 검사하려면 문자를 왼쪽부터 읽으며, 여는 괄호를 만나면 스택에 넣고, 닫는 괄호를 만나면 스택 맨 위의 여는 괄호를 꺼내 짝이 맞는지 확인한다. 짝이 다르거나 스택이 비어 있으면 틀린 식이고, 끝까지 읽은 뒤 스택이 비어야 바른 식이다. 가장 나중에 연 괄호가 가장 먼저 닫혀야 한다는 규칙이 바로 스택의 후입 선출이다. 웹 브라우저의 뒤로 가기, 편집기의 실행 취소도 같은 원리이다.
2.2.3예제 풀이
프린터가 한 시간에 문서 50개를 출력한다. 문서가 한 시간에 40개 올 때와 45개 올 때, 대기열 속 평균 문서 수와 문서 하나가 시스템에 머무는 평균 시간을 구하여라. 문서 하나의 평균 출력 시간은 1.2분이다.
40개이면 \(\rho = 0.8\)이므로 평균 \(0.8 \div 0.2 = 4\)개가 있고, 문서 하나는 출력 시간의 \(1 \div 0.2 = 5\)배인 6분을 머문다.
45개이면 \(\rho = 0.9\)이므로 평균 \(0.9 \div 0.1 = 9\)개가 있고, 문서 하나는 출력 시간의 10배인 12분을 머문다. 문서가 12.5% 늘었는데 기다리는 시간은 두 배가 되었다. 프린터를 한 대 더 두어 처리율을 두 배로 하면 이용률이 0.45가 되어, 문서가 평균 0.8개만 쌓인다. 즉 대기열은 이용률이 1에 가까울수록 아주 민감해진다. 그래서 시뮬레이션과 계산으로 이용률을 어림하면, 프린터를 언제 늘려야 할지 미리 판단할 수 있다.
아래 탐구 카드에서 괄호 검사기와 우선순위가 있는 인쇄 대기열을 스택과 큐로 직접 만들어 보자.
- 이 공식은 1909년 덴마크의 엔지니어 얼랑이 전화 교환기에 걸려 오는 통화를 분석하며 시작한 대기 이론에서 나왔다. 지금은 서버, 은행 창구, 고속도로 요금소의 설계에 두루 쓰인다.
큐는 먼저 온 것을 먼저 처리하는 대기열을, 스택은 나중에 연 것을 먼저 닫는 짝 맞추기를 자연스럽게 나타내며, 큐로 대기열을 시뮬레이션하면 줄의 길이와 기다리는 시간을 잴 수 있다. 무작위로 도착하고 처리되는 대기열의 평균 길이는 \(\rho/(1-\rho)\)로, 이용률이 1에 가까워질수록 폭발적으로 늘어난다. 그래서 처음 질문의 프린터는 이용률이 0.8에서 0.9로 올라가 여유가 거의 사라지면서, 대기 줄이 두 배 넘게 길어졌다.