Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Poprzednia wersja Nowa wersja | Poprzednia wersja | ||
sk2:good_practices [2022/11/21 15:51] jkonczak [Typowe podejścia do odbierania wiadomości] |
sk2:good_practices [2022/11/21 21:52] (aktualna) jkonczak |
||
---|---|---|---|
Linia 50: | Linia 50: | ||
- wyślij nieblokująco wszystko co się da (pamiętaj o zwalnianiu pamięci) | - wyślij nieblokująco wszystko co się da (pamiętaj o zwalnianiu pamięci) | ||
- jeśli wysłano wszystko – przestań czekać na zdarzenie zapisu | - jeśli wysłano wszystko – przestań czekać na zdarzenie zapisu | ||
- | * jeśli progam potrzebuje pisać z wielu wątków, potrzeba jest synchronizacja (zamek) na obgługę zapisów | + | * jeśli program potrzebuje pisać z wielu wątków, potrzeba jest synchronizacja (zamek) na obsługę zapisów |
Metoda 2: | Metoda 2: | ||
* dla każdego połączenia trzymany jest wątek do wysyłania, lista wiadomości, zamek i zmienna warunkowa | * dla każdego połączenia trzymany jest wątek do wysyłania, lista wiadomości, zamek i zmienna warunkowa | ||
Linia 82: | Linia 82: | ||
==== Podejście niskopoziomowe / wysokopoziomowe ==== | ==== Podejście niskopoziomowe / wysokopoziomowe ==== | ||
- | Przy programach nie wymagających wysokiej wydajności zwykle szuka się rozwiązań wymagających jak najmniej czasu od programisty - czyli szuka się bibliotek które robią większosć rzeczy za programistę. | + | Przy programach nie wymagających wysokiej wydajności zwykle szuka się rozwiązań wymagających jak najmniej czasu od programisty - czyli szuka się bibliotek które robią większość rzeczy za programistę. |
- | Dla osiągniecia wysokiej wydajności zaleca się korzystanie z wydajnych, zwykle niskopoziomowych mechanizmów - albo bezpośrednio, albo za pomocą bibliotek nastawionych na wydajność (a nie wygodę użytkownika). Takie biblioteki są dostępne na różnym poziome abstrackji, porównaj np. [[https://www.boost.org/doc/libs/release/libs/asio/|boost asio]] i [[https://en.wikipedia.org/wiki/Libevent|libevent]]). | + | Dla osiągnięcia wysokiej wydajności zaleca się korzystanie z wydajnych, zwykle niskopoziomowych mechanizmów - albo bezpośrednio, albo za pomocą bibliotek nastawionych na wydajność (a nie wygodę użytkownika). Takie biblioteki są dostępne na różnym poziome abstrakcji, porównaj np. [[https://www.boost.org/doc/libs/release/libs/asio/|boost asio]] i [[https://en.wikipedia.org/wiki/Libevent|libevent]]). |
Wysokowydajne mechanizmy niskopoziomowe to: | Wysokowydajne mechanizmy niskopoziomowe to: | ||
* Linux: epoll (omawiany na zajęciach) | * Linux: epoll (omawiany na zajęciach) | ||
Linia 96: | Linia 96: | ||
==== Middleware ==== | ==== Middleware ==== | ||
- | Dostępnych też jest wiele //middleware// (warstw pośredniczących) które pozwalają programiście używać sieci bez pisania kodu obsługjącego sieć, np: | + | Dostępnych też jest wiele //middleware// (warstw pośredniczących) które pozwalają programiście używać sieci bez pisania kodu obsługującego sieć, np: |
* [[https://en.wikipedia.org/wiki/Remote_procedure_call|RPC]] / [[https://en.wikipedia.org/wiki/Distributed_object_communication|RMI]] | * [[https://en.wikipedia.org/wiki/Remote_procedure_call|RPC]] / [[https://en.wikipedia.org/wiki/Distributed_object_communication|RMI]] | ||
* [[https://pl.wikipedia.org/wiki/Message_Passing_Interface|MPI]] | * [[https://pl.wikipedia.org/wiki/Message_Passing_Interface|MPI]] | ||
Linia 106: | Linia 106: | ||
Często w komunikacji sieciowej korzysta się z dodatkowych warstw abstrakcji między TCP a wiadomościami aplikacyjnymi do osiągnięcia: | Często w komunikacji sieciowej korzysta się z dodatkowych warstw abstrakcji między TCP a wiadomościami aplikacyjnymi do osiągnięcia: | ||
* bezpieczeństwa (integralności, poufności, autentyczności) wykorzystując [[https://en.wikipedia.org/wiki/Transport_Layer_Security|SSL lub TLS]] | * bezpieczeństwa (integralności, poufności, autentyczności) wykorzystując [[https://en.wikipedia.org/wiki/Transport_Layer_Security|SSL lub TLS]] | ||
- | * kompresji danych (o ile dane dają się kompresować) wykorzystując np. [[https://en.wikipedia.org/wiki/Zlib|deflate, zlib]], [[https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)|lz4]] | + | * kompresji danych (o ile dane dają się kompresować) wykorzystując np. [[https://en.wikipedia.org/wiki/Zlib|deflate, zlib]], [[https://en.wikipedia.org/wiki/LZ4_(compression_algorithm)|lz4]], [[https://en.wikipedia.org/wiki/Zstd|zstd]] |
==== Testowanie ==== | ==== Testowanie ==== |