Pojęcie ,,krzywa usługi'' (ang. ,,service curve'') wprowadził Rene Cruz [1]. Mówi się, że połączenie (klasa) $i$ ma zagwarantowaną krzywą usługi $S_i(t)$, jeśli dla każdej chwili $t_2$ istnieje taka chwila $t_1 < t_2$, w której miał miejsce początek zaległości tego połączenia (klasy) oraz zachodzi: $$ S_i(t_2-t_1) \le W_i(t_1,t_2) $$ gdzie $W_i(t_1,t_2)$ to ilość usługi otrzymana przez połączenie (klasę) $i$ w czasie $(t_1, t_2]$. Obrazowo mówiąc, krzywa usługi ogranicza przepływność danych do wiadra żetonów z tą różnicą, że ograniczenie nakłada się ,,od dołu''. To znaczy, że jeśli tylko połączenie ma wystarczająco danych do przesłania, to dane te nie będą przesyłane wolniej niż określa to krzywa (patrz rys.).
Algorytm ważonego sprawiedliwego kolejkowania (WFQ) da się opisać liniowymi krzywymi usług (a więc można powiedzieć ,,prostymi usług'') przecinającymi środek układu współrzędnych (ilości usługi do czasu). Dla każdego połączenia spełniony jest warunek: $$W_i(t_1,t_2) \ge \phi_i W(t_1,t_2)$$ gdzie $W(t_1,t_2)$ to ilość usługi dostarczana przez całość łącza, a $\phi_i$ to udział przydzielony połączeniu.
Jednym z pierwszych algorytmów używających koncepcji krzywych usług jest SCED (Service Curve Earliest Deadline first). Dla każdego połączenia $i$ obliczany jest oddzielnie nieprzekraczalny (ostateczny, ang. deadline) czas wysłania kolejnego pakietu. W wyidealizowanym modelu, połączenie $i$ w każdej chwili $t$ będzie miało zagwarantowane, że otrzymało przynajmniej $D_i(t)$ usługi. Krzywa $D_i(t)$ obliczana jest w następujący sposób. Kiedy na połączeniu pojawiają się pierwsze zaległości (jakiekolwiek pakiety do wysłania), $D_i(t)$ jest inicjowana według przydzielonej połączeniu krzywej usługi $S_i(t)$. Następnie, kiedy na połączeniu tworzą się kolejne zaległości (oznaczmy tą chwilę jako $t_1$), krzywa $D_i(t)$ jest aktualizowana: $$ D_i(t) = min(D_i(t), S_i(t-t_1) + W_i(t_1)) ~~~ \textrm{dla każdego} ~~~ t > D_i^{-1} (W_i(t_1)) $$ gdzie $W_i(t_1)$ jest całkowitą ilością usługi otrzymaną przez połączenie $i$ do chwili $t_1$, a $D_i^{-1}(y) = min(t: D_i(t) = y)$ i $D_i(t)$ jest zdefiniowane tylko dla $t > D_i^{-1}(W_i(t)+L_i^k)$ ($L_i^k$ jest długością pakietu $k$ – następnego do wysłania z połączenia $i$). Krzywa $D(t)$ reprezentuje ilość usługi nie uwzględniając tego, że pakiety muszą być wysyłane w całości. Dlatego czas nieokreślony dla pakietu $k$ obliczany jest według wzoru: $$ d_i^k = D_i^{-1}(W_i(t) + L_i^k) $$ SCED wysyła zawsze ten pakiet, który ma najbliższy czas nieprzekraczalny.
Aby zobrazować jak pomocny może być mechanizm krzywych usług ropatrzmy przykład podany przez twórców H-FSC [2]. Dwa połączenia korzystające z tego samego łącza rozpoczynają transmisje w tym samym momencie (Oczywiście nie zupełnie równocześnie – wystarczy, że oba połączenia dostarczą do urządzenia swój pierwszy pakiet zanim którykolwiek z nich zostanie wysłany). Jedno połączenie nazwijmy Video i niech wymaga niewielkiej przepustowości lecz opóźnienia maksymalnie 10 ms. Drugie połączenie to sesja FTP wymagająca dużej przepustowości lecz nie dbająca praktycznie o opóźnienia.
SCED podatny jest na nieprzyjemną sytuację, kiedy połączenie wysłało więcej niż gwarantuje jej krzywa usługi (z powodu dostępności pasma), a drugie połączenie nagle dostaje dużo zaległości, które jego krzywa usługi powinna pozwolić mu wysłać (rys. poniżej). Można rzec, że pierwsze połączenie jest wtedy ,,karane'' za zbyt szybkie wysyłanie, albowiem musi czekać tak długo, aż czas nieprzekraczalny drugiego połączenia przerośnie aktualny jego czas nieprzekraczalny. To pierwszy problem z którym H-FSC musiało sobie poradzić.
Kolejny kłopot pojawia się w zastosowaniu krzywych usług w hierarchii klas. Określenie krzywych dla każdej klasy pociąga za sobą wymóg, by każda krzywa na ścieżce począwszy od liścia do korzenia była zagwarantowana. Istnieją jednak sytuacje, kiedy nie może on być spełniony (rys. poniżej).
Content by Michał Pokrywka
is licensed under a Creative Commons BY-SA 3.0 Ostatnia znacząca zmiana: 2010-04-28 |