# Queueing Theory - 3.3 Multiserver Queues (M/M/c) contributed by <[`kaeteyaruyo`](https://github.com/kaeteyaruyo)> ###### tags: `Queueing Theory` ![](https://i.imgur.com/hVQFHS9.png) > Figure 3.6 Rate transition diagram for the M/M/c queue. * M/M/c 是一種規律的排隊模型,跟 M/M/1 很相似,差別只在 M/M/1 只有一個 server,但是 M/M/c 有 c 個 server * Fig. 3.6 是 M/M/c 的 Rate transition diagram,跟 M/M/1 的圖長的很像,但值得注意的是, M/M/c 的**服務率會跟系統中的人數有關**,並不是一個定值 * 顧客的到達率是定值, $\lambda_n = \lambda$ * 單一一個 server 的服務率依然是 $\mu$,但整個系統的服務率會跟系統中的人數有關 $$ \mu_n = \begin{cases} n \mu, & \; (1 \leq n < c) \\ c \mu, & \; (n \geq c) \\ \end{cases} $$ * M/M/c 模型的 global balance equation 跟 M/M/1 的列法是一樣的,因此我們不需要再重新解一次 global balance equation,只要用 M/M/1 解出來的結果,並且把 $\mu$ 的部份用適當的 $\mu_n$ 替換掉,就可以直接得知 M/M/c 的 steady-state distribution $$ p_n = \begin{cases} \frac{\lambda^n}{n!\mu^n}p_0, (1 \leq n < c) \\ \frac{\lambda^n}{c^{n-c}c!\mu^n}p_0, (n \geq c) \end{cases} $$ * 上式中還有 $p_0$ 這個未知數,可以利用 $\sum p_n = 1$ 的 boundary condition 求得 $$ p_0 = \Big(\sum_{n=0}^{c-1}\frac{r^n}{n!} + \sum_{n=c}^{\infty}\frac{r^n}{c^{n-c}c!}\Big)^{-1}, \text{ where } r = \frac{\lambda}{\mu}, \rho = \frac{r}{c} $$ * 上式中的 $\sum_{n=c}^{\infty}\frac{r^n}{c^{n-c}c!}$ 可以再進一步化簡 $$ \begin{align} \sum_{n=c}^{\infty}\frac{r^n}{c^{n-c}c!} &= \frac{r^c}{c!} \sum_{n=c}^{\infty}\Big(\frac{r}{c}\Big)^{n-c} \\ &= \frac{r^c}{c!} \sum_{m=0}^{\infty}\Big(\frac{r}{c}\Big)^{m} \\ &= \frac{r^c}{c!}\frac{1}{1 - \rho} \end{align} $$ 因此 $p_0$ 可以再簡寫成 $$ p_0 = \Big(\frac{r^c}{c!(1 - \rho)} + \sum_{n=0}^{c-1}\frac{r^n}{n!}\Big)^{-1} $$ * M/M/c 的效能指標 * Mean queue size: 在 M/M/c 系統當中,只有 c 個 server 都滿載了的情況下,才會有開始有人排隊的現象。所以計算 M/M/c 系統的 mean queue size 時,不需要考慮系統人數 $n < c$ 時的狀況,計算起來會算 mean system size 還要容易。 M/M/c 的 mean queue size 為 $$ \begin{align} L_q &= \sum_{n=c+1}^{\infty} (n-c)p_n \\ &= \sum_{n=c+1}^{\infty} (n-c) \frac{r^n}{c^{n-c}c!} p_0 \\ &= \frac{r^c p_0}{c!} \sum_{n=c+1}^{\infty} (n-c) \rho^{n-c} \\ &= \frac{r^c p_0}{c!} \sum_{m=1}^{\infty} m \rho^m = \frac{r^c \rho p_0}{c!(1-\rho)^2} \end{align} $$ 記得要將 $p_0$ 代入才算是 closed form * 知道 $L_q$ 之後,就可以利用 Little's Law 來求取 $L$, $W_q$ 和 $W$ $$ \begin{align} & L_q = \frac{r^c \rho p_0}{c!(1-\rho)^2} \\ & \Rightarrow W_q = \frac{L_q}{\lambda} = \Big(\frac{r^c}{c!(c\mu)(1-\rho)^2}\Big)p_0 \\ & \Rightarrow W = \frac{1}{\mu} + W_q = \frac{1}{\mu} + \Big(\frac{r^c}{c!(c\mu)(1-\rho)^2}\Big)p_0 \\ & \Rightarrow L = r + L_q = r + \frac{r^c \rho p_0}{c!(1-\rho)^2} \end{align} $$ * 上面算的都只是效能指標的平均值,但有時候我們依然需要 M/M/c 那些跟時間有關的效能指標的分佈函數。這些分佈函數的求取方式跟在 M/M/1 時是差不多的,但是在步驟上會因為 M/M/c 有 c 個 server 的關係變得更複雜一點 * Waiting time: 求取方法跟 M/M/1 的情況差不多,分成一定不用等和一定要等的兩個情況討論。在這裡我們不重寫各變數的意義,請參考 [3.2.5](https://hackmd.io/Hc0O0v8CRFO5pEOxBuH3Fw?view#325-Waiting-time-distribution) 中的定義 * $t=0$ 的時候,系統沒半個人,一定是不用等的。事實上,當系統內的人數未達 c 個人的時候,都是不需要等待的 $$ \begin{align} W_q(0) &= Pr\{T_q = 0\} = Pr\{\leq c-1 \text{ in system}\} \\ &= \sum_{n=0}^{c-1} p_n = p_0 \sum_{n=0}^{c-1} \frac{r^n}{n!} \\ &= 1 - \frac{r^c p_0}{c!(1-\rho)} \end{align} $$ * 可以注意到,最後解出來的東西會是一個 1 減掉某個東西的長相。我們原本在計算的東西是 $Pr\{T_q = 0\}$ 的**機率**, 1 - 機率值就是該機率值所描述的事件的互斥事件發生的機率,也就是說 $$ Pr\{T_q = 0\} = 1 - Pr\{T_q > 0\} = 1 - \frac{r^c p_0}{c!(1-\rho)} \\ \Rightarrow Pr\{T_q > 0\} = \frac{r^c p_0}{c!(1-\rho)} $$ 這條式子稍後在計算 system time 的時候會用到 * $t > 0$ 的時候,要分成一定要等跟一定不用等的兩種狀況討論。不用等的部份就是上面算的,而一定要等的狀況,就只有在系統中人數達到 c 個人的時候才會發生 $$ \begin{align} W_q(t) &= Pr\{T_q \leq 0\} \\ &= \sum_{n=c}^{\infty} Pr\{n - c + 1 \text{ completions } \leq t |\text{arrival found n in system}\} \cdot p_n + W_q(0) \\ &= \sum_{n=c}^{\infty} \frac{r^n}{c^{n-c}c!}p_0 \cdot \int_0^t \frac{c \mu (c \mu x)^{n-c}}{(n-c)!}e^{-c \mu x} dx + W_q(0) \\ &= \frac{r^c p_0}{(c-1)!} \int_0^t \mu e^{-c \mu x}\sum_{n=c}^{\infty} \frac{(\mu r x)^{n-c}}{(n-c)!} dx + W_q(0) \\ &= \frac{r^c p_0}{(c-1)!} \int_0^t \mu e^{-\mu x (c-r)} dx + W_q(0) \\ &= \frac{r^c p_0}{(c-1)!(c-r)} \int_0^t \mu (c-r) e^{-\mu x (c-r)} dx + W_q(0) \\ &= \frac{r^c p_0}{c!(1-\rho)} [1-e^{-\mu(c-r)t}] + W_q(0) \\ &= \frac{r^c p_0}{c!(1-\rho)} [1-e^{-\mu(c-r)t}] + \Big(1 - \frac{r^c p_0}{c!(1-\rho)} \Big) \\ &= 1 - \frac{r^c p_0}{c!(1-\rho)}e^{-(c \mu - \lambda)t} \end{align} $$ * 在 M/M/c 系統當中,當某個顧客進入系統時看見有 $n$ 個人在裏面,他必須要等待到**系統裏面只剩下 $c - 1$ 個人**才會有 server 可以服務他,因此他必須等待前面 $n-(c-1)$ 個人被服務完才可以停止等待 * 在 M/M/c 系統當中,因為每個顧客的服務時間都呈現指數分佈,所以「前 $n-c+1$ 個人的服務時間加總」,就是在加總 $n-c+1$ 個指數分佈的隨機變數,也就是 Erlang-type **n-c** 的分佈 * 在把該消的消掉,把跟 $n$ 無關的項提出級數和後,為了得到 $e^{\mu r x}$ 的泰勒展開式 $\sum_{n=c}^{\infty}\frac{(\mu r x)^{n-c}}{(n-c)!}$,我們必須要把 $r^n$ 分出 $n-c$ 個乘入級數和內,所以外面剩下 $r^c$ * 為了把積分式喬成指數分佈的 PDF 的形式(這樣積分就可以不用算,直接用指數分佈的 CDF),我們必須在積分裏面多乘一個 $(c-r)$,而在外面要把他除掉 * 算完積分之後發現前面剩下的項跟 $W_q(0)$ 裏面 1 扣掉的那個東西長的一樣,所以可以把 $W_q(0)$ 代入,該消的對消掉後就得到答案 * 算出答案後發現他也是一個 1 減掉什麼東西,就如同我們剛剛在算 $W_q(0)$ 的時候一樣,我們也可以得到他的互斥事件的機率 $$ Pr\{T_q \leq t\} = 1 - Pr\{T_q > t\} = 1 - \frac{r^c p_0}{c!(1-\rho)}e^{-(c \mu - \lambda)t} \\ \Rightarrow Pr\{T_q > t\} = \frac{r^c p_0}{c!(1-\rho)}e^{-(c \mu - \lambda)t} $$ * 現在我們把剛剛算 $W_q(0)$ 和 $W_q(t)$ 時算出來的副產物給湊起來,變成一個「在一定要等的前提下,等待時間會超過 $t$ 的機率」的條件機率,會得知 $$ Pr\{T_q > t | T_q > 0\} = \frac{Pr\{T_q > t, T_q > 0\}}{Pr\{T_q > 0\}} \\ = \frac{Pr\{T_q > t\}}{Pr\{T_q > 0\}} = \frac{\frac{r^c p_0}{c!(1-\rho)}e^{-(c \mu - \lambda)t}}{\frac{r^c p_0}{c!(1-\rho)}} = e^{-(c \mu - \lambda)t} $$ * 利用這個條件機率,我們可以反過來求「在一定要等的前提下,等待時間不超過 $t$ 的機率」,也就是 $$ Pr\{T_q \leq t | T_q > 0\} = 1 - e^{-(c \mu - \lambda)t} $$ 會發現這是一個指數分佈的 CDF,因此我們可以知道,在一定要等待的前提下,等待時間不超過 $t$ 的機率是呈指數分佈的。這個特性在求取 system time 的時候會用到 * System time(待補充)