środa, sierpnia 07, 2019

Proste jest lepsze

W komputerach mamy tak, że lubimy komplikować.

Przypowieść głosi, że gdy Robert Metcalfe przyniósł swoim szefom projekt sieci, którą zwiemy teraz Ethernetem to uważali ją za tak mało obiecującą, że nie chcieli nawet opatentować pomysłu.
Opatentowali.
Ale ich opór miał wynikać z tego, że Ethernet z banalnie prostym "protokołem", opartym o ALOHAnet miał być zbyt prymitywny by wygrać z Token Ring.
Token Ring obiecywał przewidywalność, brak kolizji, a Ethernet jako jedyne zabezpieczenie przed kolizjami stosował mierzenie natężenia prądu i gdy prąd był za wysoki to każda z kart, które próbowały nadawać miała sobie wylosować jakiś czas i czekać tyle na retransmisję (jeśli kanał będzie wolny).
W Token Ring wprowadzono cały mechanizm tokenów w celu eliminacji konfliktów, w Ethernet użyto prostego mechanizmu znanego z ALOHAnet.
Zamiast tworzyć mechanizm do unikania kolizji, stworzono mechanizm wykrywania kolizji i probablistyczny sposób na zmniejszenie prawdopodobieństwa kolejnej kolizji. Uznano, że kolizje się będą zdarzały i zamiast budować mechanizm, który będzie im przeciwdziałał prościej "nauczyć" karty odpowiedniego zachowania w razie kolizji.
W ALOHAnet działało to mniej więcej tak, że na każdej wyspie Hawajów była antena satelitarna, która mogła wysłać sygnał do satelity, satelita retransmitował to co dostał z powrotem w kierunku wysp.
Teraz gdy komputer chciał coś wysłać sprawdzał najpierw czy coś może jest w danym momencie nadawane, gdy nie było zaczynał nadawać i słuchał sygnału zwrotnego, jeśli dostawał to samo co wysłał to wiedział, że transmisja się udał, gdy sygnał był inny wiedział, że ma do czynienia z kolizją. Wtedy każdy z komputerów próbujących nadawać losował sobie czas oczekiwania.
W Ethernecie nawet ten prosty mechanizm uproszczono, zamiast obserwować co "lata" po sieci (bo to jednak były lata 70 i to było trudne) karta patrzy tylko na natężenie prądu, jeśli prąd jest większy niż pewien poziom to wie, że nie wolno nadawać, jeśli w trakcie jej nadawania prąd podskoczy powyżej wartości jaką powinien mieć dla 1 nadajnika to karta wie, że jest kolizja*.
Teraz gdy karta wie, że wystąpiła kolizja to próbuje jej uniknąć i losuje sobie czas ile ma czekać do ponownej próby nadawania. Prawdopodobieństwo, że dwie karty wylosują tą samą wartość jest dość niskie, a jak się nawet zdarzy takie nieszczęście to będzie kolejne losowanie.
Protokół nie próbuje walczyć z kolizjami przez uniemożliwienie ich wystąpienia, a raczej próbuje pogodzić się z ich występowaniem.
Okazało się, że to podejście działa lepiej niż Token Ring.

Ale zwykle w komputerach nie lubimy takich rozwiązań.
W jednej z firm mieliśmy już kontroler, który pilnował czegoś, nad nim superkontroler który pilnował większego kawałka i pojawiały się pomysły super superkontrolera ;-)
Zamiast próbować użyć jakiegoś prostego algorytmu, jak np. gorący kartofel (kto go ma, próbuje się go pozbyć za wszelką cenę i każdy ruch jest legalny, nie patrzymy czy to przeszkodzi temu komu damy kartofel). Ale nie, to nie wchodziło w rachubę bo nie byłoby optymalnym rozwiązaniem.
Lepiej było komplikować software i udawać, że znajdziemy optymalne rozwiązanie.

Mieliśmy kiedyś Mavena, a teraz jest Gradle**




* - przy okazji, na studiach (co prawda podyplomowych ;-), ale jednak) opowiadano jak to w kartach Ethernet jest fototranzystor, który służy do separacji galwanicznej od sieci... później się dowiedziałem, że od lat się tego nie stosuje, taniej było zastosować filtry, a teraz pewnie nawet jakiś odpowiednich "softwareowego radia" ;-)

** - nie może być tak, że jest wpis o komputerach i nie ma narzekania na Gradle'a ;-)


Podobne postybeta
Trudno hackować sprzęt....
Rant po toolach w stylu Mavane, Gradle, Bowera i całej tej hałastry
Prawdziwie przenośny komputer ;-)
Losowanie dobre
Zegar w Raspberry Pi nie jest zawsze godzien zaufania

Brak komentarzy:

Prześlij komentarz