Głównym powodem, dla którego mogę myśleć o użyciu asynchronicznego IO jest lepsze wykorzystaj procesor. Wyobraź sobie, że masz jakąś aplikację, która przetwarza jakiś plik. Załóżmy również, że możesz przetwarzać dane zawarte w pliku w porcjach. Jeśli nie wykorzystasz asynchronicznego IO, aplikacja prawdopodobnie zachowa się w następujący sposób:
- Przeczytaj blok danych. Brak wykorzystania procesora w tym momencie, ponieważ jesteś zablokowany, czekając na odczyt danych.
- przetwarzać właśnie przeczytane dane. W tym momencie aplikacja zacznie zużywać cykle procesora podczas przetwarzania danych.
- Jeśli masz więcej danych do przeczytania, goto nr 1.
Wykorzystanie procesora wzrośnie, a następnie wyzeruje, a następnie wzrośnie, a następnie wyzeruje .... Idealnie nie chcesz być bezczynny, jeśli chcesz, aby aplikacja była wydajna i przetwarzała dane tak szybko, jak to możliwe. Lepszym rozwiązaniem byłoby:
- Issue asynchroniczny czytać
- Po zakończeniu odczytu następny problem asynchroniczny czytać, a następnie dane procesowe
Pierwszym krokiem jest ładującego. Nie masz jeszcze danych, więc musisz wydać odczyt. Od tego momentu, gdy otrzymasz powiadomienie, które zakończyło się po przeczytaniu, wydajesz kolejny asynchroniczny odczyt, a następnie przetwarzasz dane. Zaletą jest to, że do czasu zakończenia przetwarzania fragmentu danych prawdopodobnie zakończy się kolejny odczyt, więc zawsze masz dane do przetworzenia i dzięki temu wydajniej korzystasz z procesora. Jeśli przetwarzanie zakończy się przed zakończeniem odczytu, może być konieczne wydanie wielu asynchronicznych odczytów, aby mieć więcej danych do przetworzenia.
Nick
Dzięki, ale zastanawiałem się więcej o przyczynach efektywności - Nie mogę zrozumieć, dlaczego wykonanie I/O w innym wątku pomaga. Jeden wątek zawsze musi blokować wejścia/wyjścia, a nie ma zgłoszonego ponownego użycia zasobów, wykorzystania funkcji sprzętu ani żadnych innych zachowań zwiększających wydajność. –
Zaletą tego jest to, że * nie * potrzebujesz dwóch wątków. Jeśli piszesz duże blob danych, na niskim poziomie, kontroler dysku wykonuje zadanie zapisywania danych na dysk przed sygnalizowaniem przerwania, które idzie w górę stosu, aby wywołać twój program obsługi zakończenia. Twój wątek nie musi blokować podczas tego procesu i może wykonywać inne czynności. Używasz jednego wątku mniej, program planujący wątek zarządza jednym wątkiem mniej, nie musisz używać powiadomień java. Zasadniczo zużywasz mniej zasobów, aby zrobić to samo. – lenkite
System operacyjny może także zoptymalizować kolejność wykonywania asynchronicznych operacji we/wy. Na przykład, jeśli masz dużą liczbę odczytów z różnych regionów w pliku, które są wykonywane asynchronicznie, system operacyjny może je grupować w sekwencyjne odczyty, bez martwienia się o wykonanie wszystkich operacji w podanej dokładnej kolejności. –