Heim  >  Artikel  >  System-Tutorial  >  Der Unterschied zwischen Threads und Prozessen: Ein Prozess ist die Grundeinheit für die Ressourcenzuweisung und ein Thread ist ein unabhängig laufender Kontrollfluss.

Der Unterschied zwischen Threads und Prozessen: Ein Prozess ist die Grundeinheit für die Ressourcenzuweisung und ein Thread ist ein unabhängig laufender Kontrollfluss.

王林
王林Original
2024-07-23 10:57:541016Durchsuche

Der Unterschied zwischen Threads und Prozessen: Ein Prozess ist die Grundeinheit für die Ressourcenzuweisung und ein Thread ist ein unabhängig laufender Kontrollfluss.

Thread: Es handelt sich um den Kontrollfluss einer einzelnen Sequenz im Prozess (gemeinsam als Lightweight-Prozesse bezeichnet)

Thread ist die kleinste Einheit, die das Betriebssystem zur Berechnungsplanung ausführen kann. Es ist die eigentliche Betriebseinheit im Prozess. Ein Thread bezieht sich auf eine einzelne Sequenz des Kontrollflusses im Prozess In einem Prozess verwendete Threads können vom Betriebssystemkernel geplante Kernel-Threads sein.

Mehrere Threads desselben Prozesses teilen sich alle Systemressourcen im Prozess, wie z. B. virtuellen Adressraum, Dateideskriptoren, Signalverarbeitung usw.

Mehrere Threads im selben Prozess verfügen jedoch über eigene Aufrufstapel, eigene Registerumgebungen und ihren eigenen lokalen Thread-Speicher.

Der Unterschied zwischen Threads und Prozessen ist: Im Allgemeinen kann ein Prozess mehrere Threads enthalten. Linux-Prozess und Thread-Kernel Sie können die Ressourcen nutzen, die dem Prozess gehören Einheit zum Zuweisen von Ressourcen, Threads sind die Grundeinheit für unabhängigen Betrieb und unabhängige Planung. Zögernde Threads sind kleiner als Prozesse und erfordern grundsätzlich keine Systemressourcen.

Ein Prozess benötigt mindestens einen Thread als Befehlsausführungskörper. Der Prozess verwaltet Ressourcen (wie CPU, Videospeicher, Dateideskriptoren usw.) und der Thread wird der CPU zur Ausführung zugewiesen.

Das Thread-Modell ist in zwei Thread-Modelle unterteilt: Threads auf Kernebene und Threads auf Benutzerebene. Der Klassifizierungsstandard besteht hauptsächlich darin, ob sich der Thread-Scheduler innerhalb des Kernels oder außerhalb des Kernels befindet -Prozessorressourcen, wobei ersteres stärker berücksichtigt wird als der Kontextwechsel-Overhead.

内核进程和内核线程_linux进程与线程 内核_linux内核线程和用户线程

Der Linux-Kernel bietet nur Unterstützung für leichtgewichtige Prozesse, wodurch die Implementierung effizienterer Threading-Modelle eingeschränkt wird Obwohl Linux leichte Prozesse unterstützt, kann nicht gesagt werden, dass es Prozesse auf Kernebene unterstützt. Da sich Threads und Prozesse in Linux tatsächlich auf derselben Planungsebene befinden und einen Prozessidentifizierungsraum teilen, können diese Einschränkungen unter Linux Sense POSIX nicht vollständig umgesetzt werden Einfädelmechanismus.

Der Linux-Kernel unterstützt keine Threads im eigentlichen Sinne. Linuxthreads verwendet zur Implementierung der Thread-Unterstützung einfache Prozesse, die dieselbe Kernel-Planungsansicht haben wie gewöhnliche Prozesse. Dieser leichtgewichtige Prozess verfügt über eine unabhängige Prozess-ID und verfügt in Bezug auf Prozessplanung, Signalverarbeitung, E/A usw. über dieselben Funktionen wie gewöhnliche Prozesse.

Threads unter Linux sind leichtgewichtige Prozesse.

Jeder Linux-Thread hat sowohl eine Thread-ID als auch eine Prozess-ID, wobei die Prozess-ID die vom Kernel verwaltete Prozessnummer ist

, während Thread-IDs von Linuxthreads zugewiesen und verwaltet werden

Die Thread-ID von __pthread_initial_thread ist PTHREAD_THREADS_MAX, die Thread-ID von __pthread_manager_thread ist 2*PTHREAD_THREADS_MAX+1Linux-Formatierungsbefehl, die Thread-ID des ersten Benutzerthreads ist PTHREAD_THREADS_MAX+2 und die Thread-ID des nachfolgenden n-ten Benutzerthreads folgt der folgenden Formel :内核进程和内核线程_linux进程与线程 内核_linux内核线程和用户线程

tid=n*PTHREAD_THREADS_MAX+n+1

Diese Zuordnungsformulare stellen sicher, dass alle Threads im Prozess (einschließlich derjenigen, die bereits beendet wurden) nicht dieselbe Thread-ID haben und der Typ der Thread-ID pthread_t als unsigned long int (unsignedlongint) definiert ist, was auch eine angemessene Laufzeit gewährleistet Interne Thread-IDs werden nicht wiederholt.

Die Suche nach der Thread-Datenstruktur anhand der Thread-ID wird in der Funktion pthread_handle() abgeschlossen. Tatsächlich ist es nur die Thread-Nummer modulo PTHREAD_THREADS_MAX, und das Ergebnis ist der Index des Threads in __pthread_handles.

5. Erstellung von Threads

Nachdem pthread_create() eine REQ_CREATE-Anfrage an den Verwaltungsthread gesendet hat, ruft der Verwaltungsthread pthread_handle_create() auf, um einen neuen Thread zu erstellen. Nachdem Sie den Stapel zugewiesen und das Thread-Attribut festgelegt haben, verwenden Sie pthread_start_thread() als Funktionseintrag und rufen Sie __clone() auf, um einen neuen Thread zu erstellen und zu starten. pthread_start_thread() liest seine eigene Prozess-ID-Nummer, speichert sie in der Thread-Beschreibungsstruktur und konfiguriert die Planung gemäß der darin aufgezeichneten Planungsmethode. Nachdem alles fertig ist, rufen Sie die echte Thread-Ausführungsfunktion auf und rufen Sie pthread_exit () auf, um die Szene zu löschen, nachdem diese Funktion zurückgekehrt ist.

Drei Möglichkeiten, die Anzahl der Threads unter Linux zu überprüfen:

1.cat/proc/pid/status

2.pstree-ppid

3.top-H-ppid

4.psxH, alle vorhandenen Threads anzeigen

5.ps-mppid

linux进程与线程 内核_linux内核线程和用户线程_内核进程和内核线程

6.ps-eLf|grep

Die zweite Spalte des Befehlsabfrageergebnisses ist PID, die dritte Spalte ist PPID, die vierte Spalte ist LWP und die sechste Spalte ist NLWP.

jstack30420|less, dann nach nid=0x44bf suchen, oh, gefunden

Shell-Code

"main"prio=10tid=0x11400nid=0x44bfrunnable[0x0000000040f5c000..0x0000000040f5ced0]

java.lang.Thread.State:RUNNABLE

at.SocketInputStream.socketRead0(NativeMethod)

at.SocketInputStream.read(SocketInputStream.java:129)

at.SocketInputStream.read(SocketInputStream.java:182)

atcom.caucho.server.resin.Resin.waitForExit(Resin.java:524)

atcom.caucho.server.resin.Resin.main(Resin.java:614)

Der jstack-Befehl ist zu Ende, schauen wir uns ihn erst einmal nicht an

Das obige ist der detaillierte Inhalt vonDer Unterschied zwischen Threads und Prozessen: Ein Prozess ist die Grundeinheit für die Ressourcenzuweisung und ein Thread ist ein unabhängig laufender Kontrollfluss.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn