Od momentu narodzin sieci komputerowych pojawiła się potrzeba tworzenia bibliotek komunikacyjnych, które by pozwalały aplikacjom komunikować się przez sieć.
Z początku głównym celem bibliotek komunikacyjnych było zapewnienie jednolitego sposobu komunikacji. Umożliwiało to swobodną wymianę informacji pomiędzy różnymi rodzajami systemów komputerowych. W miarę rozwoju sieci komputerowych pojawiały się jednak dla nich nowe zastosowania i zmieniały się wymagania względem bibliotek komunikacyjnych.
W obecnych czasach głównym celem wyznaczanym bibliotekom komunikacyjnym jest umożliwienie szybkiej i wydajnej komunikacji. Umożliwia to tworzenie wydajnych aplikacji sieciowych przesyłających duże ilości danych, jak na przykład rozproszonych systemów pamięci masowej.
Najważniejszym krokiem w osiągnięciu tego celu jest określenie semantyki biblioteki tak, by umożliwić osiągnięcie wysokiej wydajności. Biblioteki, które nie zostały zaprojektowane od początku z myślą o zapewnieniu wysokiej wydajności, trudno potem uczynić bardziej wydajnymi z powodu założeń semantycznych poczynionych przez aplikacje korzystające z tej biblioteki. Zmiana semantyki pociąga za sobą konieczność przeprojektowania wszystkich aplikacji, dlatego ważne jest, by semantyka biblioteki była przygotowana od razu z uwzględnieniem rozwiązań umożliwiających osiągnięcie wysokiej wydajności.
Jak pokazuje praktyka, zasadnicze znaczenie dla wydajności komunikacji ma uniknięcie kopiowania danych na różnych etapach wysyłania i odbierania danych. Osiągnięcie najwyższej wydajności jest możliwe dopiero wtedy, gdy takie kopiowanie zostanie wyeliminowane całkowicie. Dlatego warunkiem koniecznym dla wydajnej biblioteki komunikacyjnej jest wsparcie dla tego sposobu działania.
Potrzeba zapewnienia maksymalnej wydajności powoduje również, że i aplikacje, i co za tym idzie biblioteki komunikacyjne, umieszczane są jak najbliżej sprzętu, w jądrze systemu operacyjnego. Powoduje to konieczność takiego zaprojektowania biblioteki, by mogła jak najlepiej wykorzystać warunki pracy w jądrze. Z drugiej strony testowanie aplikacji i szukanie błędów jest dużo łatwiejsze, kiedy aplikacja działa w trybie użytkownika. Najlepszym rozwiązaniem jest więc stworzenie biblioteki udostępniającej jednakowy interfejs w trybie użytkownika i w trybie jądra tak, by można było testować aplikację w trybie użytkownika, a następnie łatwo przenieść je do trybu jądra w celu osiągnięcia maksymalnej wydajności.
Dostosowanie do działania w trybie jądra jest łatwiejsze, gdy przyjmie się model pracy panujący w jądrze -- asynchroniczny, oparty na reakcji na zdarzenia. Wymaga to odejścia od standardowego, znanego z aplikacji działających w trybie użytkownika, modelu synchronicznego i całkowitej zmiany filozofii tworzenia aplikacji. Efektem jest lepsza integracja z jądrem systemu operacyjnego i tworzenie aplikacji, których działanie można opisać automatem skończonym, co sprzyja lepszemu projektowaniu aplikacji.
Celem tej pracy jest stworzenie biblioteki, której semantyka umożliwia spełnienie powyższych postulatów -- pozwalającej na wydajną komunikację bez kopiowania przesyłanych danych, działającej w trybie jądra i użytkownika oraz opartej na asynchronicznym modelu pracy. Biblioteka ta została nazwana ZCCL (od ang. Zero-Copy Communication Library).
Struktura niniejszej pracy jest następująca:
W rozdziale 2 przedstawiono problematykę związaną z projektowaniem bibliotek komunikacyjnych.
Rozdział 3 zawiera opis wybranych bibliotek komunikacyjnych, w tym biblioteki ACL stanowiącej podstawę biblioteki stworzonej w ramach tej pracy.
W rozdziale 4 opisano bibliotekę komunikacyjną ZCCL, będącą przedmiotem niniejszej pracy.
Rozdział 5 zawiera opis przykładowego podsystemu komunikacyjnego opracowanego dla biblioteki ZCCL.
W rozdziale 6 znajduje się opis przykładowych aplikacji używających ZCCL.
W rozdziale 7 przedstawiono wyniki testów zaimplementowanego podsystemu komunikacyjnego, przeprowadzonych z użyciem przykładowych aplikacji.
Rozdział 8 zawiera podsumowanie pracy oraz opis możliwości dalszego rozwijania ZCCL.
W tym miejscu chciałbym podziękować doktor Janinie Mincer-Daszkiewicz za trud wniesiony w powstanie tej pracy i cierpliwość, z jaką udzielała wskazówek co do jej kształtu. Dziękuję również doktorowi Cezaremu Dubnickiemu za umożliwienie mi wyjazdu do NEC Research Institute, bez którego nie miałbym możliwości zapoznać się z wieloma z poruszonych tu zagadnień.
Krzysztof Lichota 2002-06-24