2016-03-04 15 views
9

Gdy pojedynczy użytkownik uzyskuje dostęp do aplikacji, można użyć wielu wątków i można je uruchomić równolegle, jeśli obecnych jest wiele rdzeni. Jeśli istnieje tylko jeden procesor, wątki będą uruchamiane jeden po drugim.Wielowątkowość - wielu użytkowników

Kiedy wielu użytkowników uzyskuje dostęp do aplikacji, w jaki sposób obsługiwane są wątki?

+0

jaki rodzaj aplikacji? – ArchLicher

+0

aplikacja internetowa napisana w języku Java, wdrożona na serwerze Tomcat – user2296988

Odpowiedz

7

Mogę mówić z perspektywy Java, więc pytanie brzmi "kiedy wielu użytkowników uzyskuje dostęp do aplikacji, w jaki sposób obsługiwane są wątki?". Odpowiedź jest taka, że ​​wszystko zależy od tego, jak ją zaprogramowałeś, jeśli korzystasz z jakiegoś kontenera WWW/aplikacji, udostępniasz mechanizm puli wątków, w którym możesz mieć więcej niż jeden wątek do ponownego wysłania przez użytkownika serwera, Dla każdego użytkownika jest inicjowane jedno żądanie, a które w obrót jest obsługiwany przez jeden wątek, więc jeśli jest 10 równoczesnych użytkowników, będzie 10 wątków, aby obsłużyć 10 żądań jednocześnie, teraz mamy Non-blocking IO teraz dni, w których przetwarzanie żądań może być załadowane do innych wątków, umożliwiając mniej niż 10 wątków do obsługi 10 użytkowników.

Teraz, jeśli chcesz wiedzieć, jak dokładnie planowanie wątków odbywa się wokół rdzenia procesora, znowu zależy to od systemu operacyjnego. Jednak jedna rzecz jest powszechna, chociaż "wątek jest podstawową jednostką przydziału do procesora". Zacznij od zielonych wątków here, a zrozumiesz to lepiej.

2

Tomcat używa obsługi wielowątkowości Java do obsługi żądań http.

Aby obsłużyć żądanie http, tomcat uruchamia wątek z puli wątków. Pula jest utrzymywana dla wydajności, ponieważ tworzenie nici jest drogie.

znaleźć w dokumentacji java o współbieżności, aby przeczytać więcej https://docs.oracle.com/javase/tutorial/essential/concurrency/

proszę zobaczyć konfiguracji puli wątek tomcat więcej informacji https://tomcat.apache.org/tomcat-8.0-doc/config/executor.html

4

co potrzeba zrozumieć o wątku harmonogramu. W rzeczywistości w jednym rdzeniu procesor dzieli swój czas między wiele wątków (proces nie jest dokładnie sekwencyjny). W rdzeniu wielokrotnym dwa (lub więcej) wątki mogą uruchamiać jednocześnie . Przeczytaj thread article in wikipedia. Polecam Tanenbaum's OS book.

6

nieprawidłowy assuption jest

Jeżeli tylko jeden procesor istnieje, wątki będą działać kolejno.

Sposób wykonywania wątków zależy od środowiska wykonawczego. W języku java istnieją pewne definicje, że niektóre części kodu nie będą powodować synchronizacji z innymi wątkami, a zatem nie spowodują (potencjalnego) zmiany harmonogramu wątków.

Zasadniczo system operacyjny będzie odpowiedzialny za planowanie jednostek wykonawczych. W dawnych czasach większość takich podmiotów była procesami. Teraz może być przez procesy i wątki (niektóre harmonogramują tylko na poziomie wątku). Dla uproszczenia niech ssume OS zajmuje się tylko wątkami.

System operacyjny może zezwolić na uruchomienie wątku, dopóki nie osiągnie punktu, w którym nie może kontynuować, np. oczekiwanie na operację I/O do cpmplete. Jest to dobre dla wątku, ponieważ może wykorzystać procesor dla max. Jest to szkodliwe dla wszystkich innych wątków, które chcą samodzielnie wykonać kilka cykli procesora. (Generalnie zawsze będzie więcej wątków niż dostępnych procesorów. Więc problem jest niezależny od liczby procesorów.) Aby poprawić interaktywne zachowanie, system operacyjny może używać wycinków czasowych, które umożliwiają działanie wątku przez określony czas. Po wygaśnięciu wycinka czasu wątek jest usuwany z procesora, a system operacyjny wybiera nowy wątek do uruchomienia (może nawet zostać właśnie przerwany).

Pozwoli to na postęp każdego wątku (dodając trochę narzutu do planowania). W ten sposób, nawet w systemie z jednym procesorem, wątki moje (zdają) działać równolegle.

Tak więc dla systemu operacyjnego nie ma żadnego znaczenia, czy zestaw wątków jest wynikiem pojedynczego użytkownika (lub nawet z pojedynczego połączenia z aplikacją internetową) lub został utworzony przez wielu użytkowników i połączenia internetowe.

1

Istnieją dwa punkty, aby odpowiedzieć na pytanie: Thread Scheduling & Thread Communication

Thread Scheduling realizacja jest specyficzne dla systemu operacyjnego. Programista nie ma żadnej kontroli w tym zakresie, oprócz ustawienia priorytetu dla Thread.

Thread Communication jest napędzany przez program/programmer.

Załóżmy, że masz wiele procesorów i wiele wątków. Wiele wątków może działać równolegle z wieloma procesorami. Ale w jaki sposób dane są udostępniane i dostępne, są specyficzne dla programu.

Możesz uruchamiać swoje wątki równolegle Lub możesz poczekać, aż wątki zakończą wykonywanie zanim przejdą dalej (join, invokeAll, CountDownLatch itd.). Programista ma pełną kontrolę nad zarządzaniem cyklem życia Nici.

0

Nie ma różnicy, jeśli masz jednego użytkownika lub kilka. Wątki działają w zależności od logiki Twojego programu. Procesor uruchamia każdy wątek przez określoną ilość czasu, a następnie przechodzi do następnego. Czas jest bardzo krótki, więc jeśli nie ma zbyt wiele wątków (lub różnych procesów), użytkownik nie zauważy tego. Jeśli procesor używa jednostki o długości 20 ms i istnieje 1000 wątków, to każdy wątek będzie musiał odczekać dwie sekundy na swój następny ruch. Na szczęście obecne procesory, nawet z jednym rdzeniem, mają dwa procesory, które można wykorzystać do równoległych wątków.

0

W "klasycznych" implementacjach wszystkie żądania WWW przychodzące do tego samego portu są najpierw obsługiwane przez ten sam pojedynczy wątek. Jednak zaraz po otrzymaniu żądania (Socket.accept zwraca), prawie wszystkie serwery natychmiast rozwidlają się lub ponownie używają innego wątku, aby ukończyć żądanie. Niektóre wyspecjalizowane serwery pojedynczego użytkownika, a także niektóre zaawansowane serwery następnej generacji, takie jak Netty, nie mogą tego robić.

Proste (i pospolite) podejście polegałoby na wybraniu lub ponownym użyciu nowego wątku przez cały czas trwania pojedynczego żądania internetowego (GET, POST itd.). Po dostarczeniu żądania wątek prawdopodobnie zostanie ponownie użyty dla innego żądania, które może należeć do tego samego lub innego użytkownika.

Jednak jest w pełni możliwe wpisanie niestandardowego kodu dla serwera, który wiąże, a następnie wykorzystuje dany wątek do żądania sieciowego zalogowanego użytkownika lub adresu IP. Może to być trudne do skalowania. Myślę, że standardowe proste serwery, takie jak Tomcat, zwykle tego nie robią.