|
|
| Line 6: |
Line 6: |
| | comment4, | | comment4, |
| | | | |
| − | = Providing a guarantee through limiting =
| + | comment5, |
| − | The idea of getting a guarantee is simple:
| |
| − | | |
| − | {{out|if any group <math>g_i</math> requires a <math>G_i</math> units of resource from <math>R</math> units available then limiting all the rest groups with <math>R - G_i</math> units provides a desired guarantee}}
| |
| − | | |
| − | For <math>N</math> groups in the system this implies solving a linear equation set to get limits <math>L_i</math> like this:
| |
| − | | |
| − | <center><math>
| |
| − | \begin{cases}
| |
| − | L_2 + L_3 + \ldots + L_N = R - G_1 \\
| |
| − | L_1 + L_3 + \ldots + L_N = R - G_2 \\
| |
| − | \ldots \\
| |
| − | L_1 + L_2 + \ldots + L_{N-1} = R - G_N \\
| |
| − | \end{cases}
| |
| − | </math></center>
| |
| − | | |
| − | In a matrix form this looks like
| |
| − | | |
| − | <center><math>
| |
| − | A L = G\;
| |
| − | </math></center>
| |
| − | | |
| − | where
| |
| − | | |
| − | <center><math>
| |
| − | A = \begin{bmatrix}
| |
| − | 0 & 1 & 1 & \cdots & 1 & 1 \\
| |
| − | 1 & 0 & 1 & \cdots & 1 & 1 \\
| |
| − | & & \cdots \\
| |
| − | 1 & 1 & 1 & \cdots & 1 & 0 \\
| |
| − | \end{bmatrix}
| |
| − | , | |
| − | L = \begin{bmatrix} L_1 \\ L_2 \\ \vdots \\ L_N \end{bmatrix}
| |
| − | ,
| |
| − | G = \begin{bmatrix} R - G_1 \\ R - G_2 \\ \vdots \\ R - G_N \end{bmatrix}
| |
| − | </math></center>
| |
| − | | |
| − | | |
| − | and thus the solution is
| |
| − | | |
| − | <center><math>
| |
| − | L = A^{-1}G\;
| |
| − | </math></center>
| |
| − | | |
| − | | |
| − | Skipping boring calculations, the reverse matrix <math>A^{-1}\;</math> is
| |
| − | | |
| − | <center><math>
| |
| − | A^{-1} = \frac {1} {N - 1} \left( A - (N - 2) E \right)
| |
| − | </math></center>
| |
| − | | |
| − | This solutions looks huge, but the <math>L</math> vector is calculated in <math>O(N)</math> time:
| |
| − |
| |
| − | <pre>
| |
| − | void calculate_limits(int N, int *g, int *l)
| |
| − | {
| |
| − | int sum;
| |
| − | int i;
| |
| − | | |
| − | if (N == 1) {
| |
| − | l[0] = R;
| |
| − | return;
| |
| − | }
| |
| − | | |
| − | sum = 0;
| |
| − | for (i = 0; i < N; i++)
| |
| − | sum += R - g[i];
| |
| − | for (i = 0; i < N; i++)
| |
| − | l[i] = (sum - (R - g[i]) - (N - 2) * (R - g[i]))/(N - 1);
| |
| − | }
| |
| − | </pre>
| |
| − | | |
| − | == Disadvantages of this approach ==
| |
| − | | |
| − | This approach has only one disadvantage: O(n) time needed to start a new container.
| |