2016-03-04 16 views
9

Wenn ein einzelner Benutzer auf eine Anwendung zugreift, können mehrere Threads verwendet werden, und sie können parallel ausgeführt werden, wenn mehrere Kerne vorhanden sind. Wenn nur ein Prozessor vorhanden ist, werden die Threads nacheinander ausgeführt.Multithreading - mehrere Benutzer

Wenn mehrere Benutzer auf eine Anwendung zugreifen, wie werden die Threads behandelt?

+0

welche art von anwendung? – ArchLicher

+0

Eine in Java geschriebene Webanwendung, die auf einem Tomcat-Server bereitgestellt wird – user2296988

Antwort

7

Ich kann aus Java Perspektive sprechen, also ist Ihre Frage "wenn mehrere Benutzer auf eine Anwendung zugreifen, wie werden die Threads behandelt?". Die Antwort ist alles hängt davon ab, wie Sie es programmiert haben, wenn Sie einige Web/App-Container verwenden, bieten sie Thread-Pool-Mechanismus, wo Sie mehrere Threads für Server-Benutzer benötigen, Pro Benutzer gibt es eine Anfrage initiiert und welche in Turn wird von einem Thread behandelt, wenn also 10 gleichzeitige Benutzer vorhanden sind, gibt es 10 Threads, um die 10 Anfragen gleichzeitig zu bearbeiten. Jetzt haben wir jetzt nicht blockierende IO an Tagen, an denen die Anfrageverarbeitung in andere Threads geladen werden kann weniger als 10 Threads für 10 Benutzer.

Jetzt, wenn Sie wissen wollen, wie genau Thread-Planung um CPU-Kern getan, es hängt wieder vom Betriebssystem ab. Eine Gemeinsamkeit, obwohl "Thread die Grundeinheit der Zuweisung zu einer CPU ist". Beginnen Sie mit grünen Fäden here, und Sie werden es besser verstehen.

2

Tomcat verwendet Java Multi-Threading-Unterstützung für HTTP-Anfragen.

Um eine HTTP-Anfrage zu bedienen, startet Tomcat einen Thread aus dem Thread-Pool. Der Pool wird effizient verwaltet, da die Erstellung von Threads teuer ist.

Siehe Java-Dokumentation über die Parallelität für weitere Informationen https://tomcat.apache.org/tomcat-8.0-doc/config/executor.html

6

Die falsche Assuption ist

Wenn nur ein Prozessor vorhanden ist, dann wird Fäden nacheinander ausgeführt werden.

Wie Threads ausgeführt werden, hängt von der Laufzeitumgebung ab. Mit Java gibt es einige Definitionen, dass bestimmte Teile Ihres Codes keine Synchronisation mit anderen Threads verursachen und somit keine (potenzielle) Neuterminierung von Threads verursachen.

Im Allgemeinen wird das Betriebssystem für die Planung von Ausführungseinheiten zuständig sein. Früher waren solche Entitäten meist Prozesse. Jetzt kann es von Prozessen und Threads (einige planen nur auf Thread-Ebene). Der Einfachheit halber lassen wir uns nur mit Threads beschäftigen.

Das Betriebssystem kann dann einem Thread erlauben zu laufen, bis es einen Punkt erreicht, an dem es nicht fortfahren kann, z. warten, bis eine E/A-Operation abgeschlossen ist. Dies ist gut für den Thread, da es CPU für max. Dies ist schlecht für alle anderen Threads, die selbst einige CPU-Zyklen erhalten möchten. (Im Allgemeinen wird es immer mehr Threads als verfügbare CPUs geben. So ist das Problem unabhängig von der Anzahl der CPUs.) Um das interaktive Verhalten zu verbessern, könnte ein OS Zeitscheiben verwenden, die es einem Thread erlauben, für eine bestimmte Zeit zu laufen. Nach Ablauf der Zeitscheibe wird der Thread zwangsweise aus der CPU entfernt und das OS wählt einen neuen Thread zum Ausführen aus (könnte sogar der gerade unterbrochene sein).

Dadurch kann jeder Thread einige Fortschritte machen (etwas Overhead für die Planung hinzufügen). Auf diese Weise laufen Threads, auch auf einem Einzelprozessorsystem, scheinbar parallel.

Für das Betriebssystem ist es also überhaupt nicht wichtig, ob eine Gruppe von Threads von einem einzelnen Benutzer (oder sogar von einem einzelnen Aufruf einer Webanwendung) stammt oder von mehreren Benutzern und Webanrufen erstellt wurde.

1

Es gibt zwei Punkte, um Ihre Frage zu beantworten: Thread Scheduling & Thread Communication

Thread Scheduling Implementierung Betriebssystem spezifisch ist. Der Programmierer hat in dieser Hinsicht keine Kontrolle außer der Einstellungspriorität für eine Thread.

Thread Communication wird von program/programmer angetrieben.

Angenommen, Sie haben mehrere Prozessoren und mehrere Threads. Mehrere Threads können parallel mit mehreren Prozessoren ausgeführt werden. Die Art und Weise, in der die Daten geteilt und aufgerufen werden, ist programmspezifisch.

Sie können Ihre Threads parallel ausführen. Sie können auch darauf warten, dass Threads die Ausführung abschließen, bevor Sie fortfahren (join, invokeAll, CountDownLatch usw.). Der Programmierer hat die volle Kontrolle über das Thread-Lebenszyklus-Management.

0

Es gibt keinen Unterschied, wenn Sie einen oder mehrere Benutzer haben. Threads funktionieren abhängig von der Logik Ihres Programms. Der Prozessor führt jeden Thread für eine bestimmte Zeit aus und folgt dann dem nächsten. Die Zeit ist sehr kurz. Wenn also nicht zu viele Threads (oder andere Prozesse) funktionieren, wird der Benutzer es nicht bemerken. Wenn der Prozessor eine 20-ms-Einheit verwendet und es 1000 Threads gibt, muss jeder Thread für seine nächste Runde zwei Sekunden warten. Glücklicherweise haben aktuelle Prozessoren, sogar mit nur einem Kern, zwei Prozesseinheiten, die für parallele Threads verwendet werden können.

0

In "klassischen" Implementierungen werden alle Webanfragen, die am selben Port ankommen, zuerst von demselben einzelnen Thread bedient. Sobald jedoch eine Anforderung empfangen wird (Socket.accept), würden fast alle Server sofort einen Fork verwenden oder einen anderen Thread erneut verwenden, um die Anforderung abzuschließen. Einige spezialisierte Einzelbenutzerserver und auch einige erweiterte Server der nächsten Generation wie Netty können dies nicht tun.

Der einfache (und gebräuchliche) Ansatz wäre, einen neuen Thread für die gesamte Dauer der einzelnen Webanforderung (GET, POST usw.) auszuwählen oder wiederzuverwenden. Nachdem die Anforderung geliefert wurde, wird der Thread wahrscheinlich für eine andere Anforderung wiederverwendet, die zu demselben oder einem anderen Benutzer gehören kann.

Es ist jedoch durchaus möglich, den benutzerdefinierten Code für den Server zu schreiben, der bestimmte Threads an die Webanforderung des angemeldeten Benutzers oder der IP-Adresse bindet und dann wieder verwendet. Dies kann schwierig zu skalieren sein. Ich denke, Standard-Server wie Tomcat tun dies normalerweise nicht.