Asynchroniczne operacje I/O za pomocą IOCP

Slides:



Advertisements
Podobne prezentacje
Temat 2: Podstawy programowania Algorytmy – 1 z 2 _________________________________________________________________________________________________________________.
Advertisements

Blok I: PODSTAWY TECHNIKI Lekcja 7: Charakterystyka pojęć: energia, praca, moc, sprawność, wydajność maszyn (1 godz.) 1. Energia mechaniczna 2. Praca 3.
OBOWIĄZKI INFORMACYJNE BENEFICJENTA Zintegrowane Inwestycje Terytorialne Aglomeracji Wałbrzyskiej.
Tworzenie odwołania zewnętrznego (łącza) do zakresu komórek w innym skoroszycie Możliwości efektywnego stosowania odwołań zewnętrznych Odwołania zewnętrzne.
PRACA Z APLIKACJAMI SYSTEM PRZEMIESZCZANIA oraz NADZORU WYROBÓW AKCYZOWYCH EMCS PL 1.
Sprawozdawczość. Podstawowe terminy Okres sprawozdawczy  3 kolejne miesiące, licząc od daty zawarcia umowy o dofinansowanie projektu Rodzaje raportów.
Excel 2007 dla średniozaawansowanych zajęcia z dnia
 Czasem pracy jest czas, w którym pracownik pozostaje w dyspozycji pracodawcy w zakładzie pracy lub w innym miejscu wyznaczonym do wykonywania pracy.
Ryzyko a stopa zwrotu. Standardowe narzędzia inwestowania Analiza fundamentalna – ocena kondycji i perspektyw rozwoju podmiotu emitującego papiery wartościowe.
Poczta elektroniczna – e- mail Gmail zakładanie konta. Wysyłanie wiadomości.
CIMCO Edit z dodatkiem CNC-Calc koszty i korzyści Wdrożenie środowiska do tworzenia, edycji i symulacji programów NC Korzyści: -Tworzenie ścieżki narzędzia.
Algorytmy Informatyka Zakres rozszerzony
Opodatkowanie spółek Podziały Spółek. Podziały spółek Rodzaje podziałów wg KSH Przewidziane są cztery sposoby podziału: 1) podział przez przejęcie, który.
Model warstwowy OSI Model OSI (Open Systems Interconnection) opisuje sposób przepływu informacji między aplikacjami programowymi w jednej stacji sieciowej.
Teoria masowej obsługi Michał Suchanek Katedra Ekonomiki i Funkcjonowania Przedsiębiorstw Transportowych.
Menu Jednomiany Wyrażenia algebraiczne -definicja Mnożenie i dzielenie sum algebraicznych przez jednomian Mnożenie sum algebraicznych Wzory skróconego.
Czym jest gramofon DJ-ski?. Gramofon DJ-ski posiada suwak Pitch służący do płynnego przyspieszania bądź zwalniania obrotów talerza, na którym umieszcza.
Instalacja nienadzorowana windows xp Jakub klafta.
Python. Języki Programistyczne Microcode Machine code Assembly Language (symboliczna reprezentacja machine code) Low-level Programming Language (FORTRAN,
Optymalna wielkość produkcji przedsiębiorstwa działającego w doskonałej konkurencji (analiza krótkookresowa) Przypomnijmy założenia modelu doskonałej.
Usługa PUE-ZUS (Platforma Usług Elektronicznych Zakładu Ubezpieczeń Społecznych) Michał Dobrzyński, Departament Informatyki MRPiPS
Definiowanie i planowanie zadań typu P 1.  Planowanie zadań typu P  Zadania typu P to zadania unikalne służące zwykle dokonaniu jednorazowej, konkretnej.
Katarzyna Rychlicka Wielomiany. Katarzyna Rychlicka Wielomiany Przykłady Wykresy funkcji wielomianowych Równania wielomianowe Działania na wielomianach.
Sieci przepływowe: algorytmy i ich zastosowania.
1 Definiowanie i planowanie zadań budżetowych typu B.
Dr Agata Michalska-Olek Adwokat Poznań. Art [Umowa spedycji]  § 1.Przez umowę spedycji spedytor zobowiązuje się za wynagrodzeniem w zakresie działalności.
System operacyjny Renata P. System operacyjny - jest to zbiór nadrzędnych i niezbędnych programów umożliwiających pracę na komputerze. Jest on pośrednikiem.
Język Java Paweł Rajba
Mikroprocesory.
P-CART.
wspomaganej systemem komputerowym NABÓR 2017
Przeglądarka stron WWW
Schematy blokowe.
Przejście zakładu pracy na innego pracodawcę
DEFINICJA I ZASTOSOWANIE W JĘZYKU HASKELL
On-the-Fly Garbage Collection
Liczby pierwsze.
Akademia C# - Lab2 Zmienne, instrukcje warunkowe, pętle, debugger,
ALGORYTMY I STRUKTURY DANYCH
Akademia C# lab. 9 Zdarzenia i delegaty.
Programowanie obiektowe
Budowa, typologia, funkcjonalność
Optymalizacja programów Open-Source
Lekcja 1 – Hello World! Visual Studio, coś łatwego na początek 
Wstęp do Informatyki - Wykład 8
Kurs języka C++ – wykład 13 ( )
Routing statyczny Sieci IP: / /24
BUDOWA I DZIAŁANIE STRZELBY GŁADKOLUFOWEJ
Wykorzystanie aplikacji użytkowych do przeprowadzenia cyberataku
System operacyjny cz.3 i ostatnia
PROGRAMY DO KONTROLI RODZICIELSKIEJ
System operacyjny cz.2.
Języki programowania.
Akceptacja w Module Wnioski i Postępowania
Laboratorium 1 – obsługa wejść i wyjść
Jak korzystać z usługi Video s i Raportu Kontaktów
Zapraszamy do nowego programu PowerPoint
Koszyk danych.
Podstawy informatyki Zygfryd Głowacz.
Zapraszamy do nowego programu PowerPoint
Zapraszamy do nowego programu PowerPoint
ALGORYTMY I STRUKTURY DANYCH
Implementacja rekurencji w języku Haskell
Znajdowanie liczb pierwszych w zbiorze
Jak szukać błędów w Eclipsie?
Bufory.
Język C++ Operatory Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła.
Ministerstwo Rolnictwa i Rozwoju Wsi
Autor: Magdalena Linowiecka
To naprawdę bardzo proste!
Zapis prezentacji:

Asynchroniczne operacje I/O za pomocą IOCP Patrycja Brzozowska

I/O Completion Ports Porty zakończenia operacji I/O zapewniają wydajny model wątkowania do przetwarzania wielu asynchronicznych żądań I/O w systemie wieloprocesorowym. Gdy proces tworzy port zakończenia operacji I/O, system tworzy powiązany obiekt kolejki dla żądań, których jedynym celem jest obsługa tych żądań.

Jak działa IOCP ? Funkcja CreateIoCompletionPort tworzy port zakończenia I/O i kojarzy jeden lub więcej uchwytów pliku z tym portem. Gdy zakończy się asynchroniczna operacja I/O na jednym z tych uchwytów pliku, pakiet zakończenia I/O jest umieszczany w kolejce w kolejności FIFO (first-in-first-out) do powiązanego portu zakończenia operacji I/O.

Jednym z potężnych zastosowań tego mechanizmu jest połączenie punktu synchronizacji dla wielu uchwytów plików w jeden obiekt, chociaż istnieją również inne użyteczne aplikacje. Należy zwrócić uwagę, że podczas gdy pakiety są umieszczane w kolejce w kolejności FIFO, mogą one zostać z niej usunięte w innej kolejności.

Gdy uchwyt pliku jest powiązany z portem zakończenia, przekazany blok statusu nie zostanie zaktualizowany, dopóki pakiet nie zostanie usunięty z portu zakończenia. Jedynym wyjątkiem jest sytuacja, gdy pierwotna operacja powraca synchronicznie z błędem.

Wątek (utworzony przez główny wątek lub sam wątek główny) używa funkcji GetQueuedCompletionStatus, aby poczekać, aż pakiet zakończenia zostanie dodany do kolejki portu zakończenia operacji I/O, zamiast oczekiwać bezpośrednio na zakończenie asynchronicznych operacji I/O.

Wątki, które blokują ich wykonywanie na porcie zakończenia operacji I/O, są wydawane w kolejności „last-in-first-out" (LIFO), a następny pakiet ukończenia jest pobierany z kolejki FIFO portu zakończenia operacji I/O dla tego wątku. Oznacza to, że po wypuszczeniu pakietu ukończenia do wątku system zwalnia ostatni (najnowszy) wątek powiązany z tym portem, przekazując mu informację o ukończeniu najstarszego zakończenia I/O.

Mimo, że dowolna liczba wątków może wywołać funkcję GetQueuedCompletionStatus dla określonego portu zakończenia operacji I/O, gdy określony wątek wywoła GetQueuedCompletionStatus po raz pierwszy, zostanie powiązany z określonym portem zakończenia operacji I/O do momentu wystąpienia jednej z trzech rzeczy: wyjście wątku, wątek określa inny port zakończenia operacji I/O, wątek zamyka port zakończenia operacji I/O.  Innymi słowy, pojedynczy wątek może być powiązany z najwyżej jednym portem zakończenia I/O.

Gdy pakiet zakończenia jest umieszczany w kolejce do portu zakończenia I/O, system najpierw sprawdza ile wątków powiązanych z tym portem jest uruchomionych. Jeśli liczba uruchomionych wątków jest mniejsza niż wartość współbieżności , to jeden z oczekujących wątków (najnowszy) może przetwarzać pakiet zakończenia. Gdy uruchomiony wątek zakończy przetwarzanie, zwykle wywołuje ponownie GetQueuedCompletionStatus, w którym to momencie albo zwraca z następnym pakietem ukończenia albo czeka (jeśli kolejka jest pusta).

Zalety IOCP Wszystkie operacje I/O mogą być zarejestrowane do tego samego portu zakończenia operacji I/O. Unikamy blokowania własnych wątków oraz wątków roboczych ThreadPool. Otrzymujemy automatyczne zarządzanie wątkami, które minimalizuje przełączanie kontekstów oraz daje głównemu wątkowi więcej czasu procesora.

Trochę kodu... Należy utworzyć port zakończenia operacji I/O oraz zachować do niego uchwyt. //create completion code var completionPortHandle = Interop.CreateIoCompletionPort(new IntPtr(-1), IntPtr.Zero, 0, 0);

Następnie po utworzeniu file handle dla asynchronicznej operacji I/O należy powiązać go do IOCP. const uint Flags = 128 | (uint)1 << 30; var fileHandle = Interop.CreateFile("test.txt", (uint)1 << 31, 0, IntPtr.Zero, 3, /*FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED */ Flags, IntPtr.Zero); Interop.CreateIoCompletionPort( fileHandle, completionPortHandle, (uint)fileHandle.ToInt64(), 0);

Wreszcie, za każdym razem wykonując operację należy podać wywołanie zwrotne oraz uzyskać wskaźnik do struktury NativeOverlapped*. var readBuffer = new byte[1024]; uint bytesRead; var overlapped = new Overlapped { AsyncResult = new FileReadAsyncResult() ReadCallback = (bytesCount, buffer) => var contentRead = Encoding.UTF8.GetString(buffer, 0, (int)bytesCount); }, Buffer = readBuffer } }; NativeOverlapped* nativeOverlapped = overlapped.UnsafePack(null, readBuffer); Interop.ReadFile(fileHandle, readBuffer, (uint)readBuffer.Length, out bytesRead, nativeOverlapped);

Jak wykonywane jest wywołanie zwrotne ? Poprzedni kod zapewnia tylko wywołanie zwrotne, ale nigdy go nie wywołuje. Jest to rola oddzielnego składnika, którego używamy do symulacji wątku portu zakończenia. var completionPortThread = new Thread(() => new IOCompletionWorker().Start(completionPortHandle)) { IsBackground = true }; completionPortThread.Start();

Ten komponent jest odpowiedzialny za sprawdzenie portu zakończenia dla elementów w kolejce i wywołanie powiązanego asynchronicznego wywołania zwrotnego (a także pewne czyszczenie). public class IOCompletionWorker { public unsafe void Start(IntPtr completionPort) while (true) uint bytesRead; uint completionKey; NativeOverlapped* nativeOverlapped; var result = Interop.GetQueuedCompletionStatus( completionPort, out bytesRead, out completionKey, &nativeOverlapped, uint.MaxValue); (...)

(...) var overlapped = Overlapped.Unpack(nativeOverlapped); if (result) { var asyncResult = ((FileReadAsyncResult)overlapped.AsyncResult); asyncResult.ReadCallback(bytesRead, asyncResult.Buffer); } else ThreadLogger.Log(Interop.GetLastError().ToString()); Overlapped.Free(nativeOverlapped);