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.
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 :
tid=n*PTHREAD_THREADS_MAX+n+1Ces formulaires d'allocation garantissent que tous les threads du processus (y compris ceux qui sont déjà sortis) n'auront pas le même identifiant de thread, et le type d'identifiant de thread pthread_t est défini comme unsigned long int (unsignedlongint), ce qui garantit également un temps d'exécution raisonnable. Les ID de thread interne ne seront pas répétés.
La recherche de la structure des données du thread à partir de l'identifiant du thread est effectuée dans la fonction pthread_handle(). En fait, il s'agit simplement du numéro de thread modulo PTHREAD_THREADS_MAX, et le résultat est l'index du thread dans __pthread_handles.
5. Création de fils
Après que pthread_create() envoie une requête REQ_CREATE au thread de gestion, le thread de gestion appelle pthread_handle_create() pour créer un nouveau thread. Après avoir alloué la pile et défini l'attribut du thread, utilisez pthread_start_thread() comme entrée de fonction et appelez __clone() pour créer et démarrer un nouveau thread. pthread_start_thread() lit son propre numéro d'identification de processus et le stocke dans la structure de description du thread, et configure la planification en fonction de la méthode de planification qui y est enregistrée. Une fois que tout est prêt, appelez la vraie fonction d'exécution du thread et appelez pthread_exit() pour effacer la scène après le retour de cette fonction.
Trois façons de vérifier le nombre de threads sous Linux :
1.cat/proc/pid/status
2.pstree-ppid
3.top-H-ppid
4.psxH, affichez tous les fils de discussion existants
5.ps-mppid
6.ps-eLf|grep
La deuxième colonne du résultat de la requête de commande est PID, la troisième colonne est PPID, la quatrième colonne est LWP et la sixième colonne est NLWP.
jstack30420|moins, puis recherchez nid=0x44bf, oh, je l'ai trouvé
Code Shell
"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)
La commande jstack est terminée, ne l'étudions pas pour l'instant
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!