{"id":459,"date":"2014-11-02T23:59:15","date_gmt":"2014-11-02T22:59:15","guid":{"rendered":"http:\/\/www.instruyete.org\/?p=459"},"modified":"2014-11-02T23:59:15","modified_gmt":"2014-11-02T22:59:15","slug":"posix-threads-unter-linux-und-deren-ids","status":"publish","type":"post","link":"https:\/\/www.instruyete.org\/?p=459","title":{"rendered":"Posix Threads unter Linux und deren ID&#8217;s"},"content":{"rendered":"<p>Nach ein paar Monaten Abstinenz von der Welt der <em>POSIX Threads<\/em> f\u00e4llt es immer wieder schwer, die ID&#8217;s in den richtigen Kontext zu bringen. Deshalb r\u00e4umt dieser Beitrag nochmal auf.<\/p>\n<ul>\n<li><strong>PID\/TGID<\/strong><br \/>\nDie <em><strong>P<\/strong>rocess <strong>Id<\/strong>entification <strong>N<\/strong>umber<\/em> ist im Falle von gethreadeden Programmen auch gleichzeitig die <em><strong>T<\/strong>hread <strong>G<\/strong>roup <strong>Id<\/strong>entifcation Number<\/em>. Pro Executable gibt es nur eine solche Nummer, die alle Threads zur\u00fcckliefern k\u00f6nnen\n<\/li>\n<li><strong>TID<\/strong><br \/>\nDa Linux alle Threads als eigenst\u00e4ndige Prozesse (<strong>LWP<\/strong>=<em>Lightweight Processes<\/em>) ansieht, verwaltet der Kernel eine eigene Prozessnummer &#8211; die <em><strong>T<\/strong>hread <strong>Id<\/strong>entication Number<\/em>. Um den Balanceakt der Unterscheidung zwischen Prozessen und Threads besser zu meistern, kann der Begriff der <em>Kernel Scheduling Entity<\/em> (<strong>KSE<\/strong>) benutzt werden.\n<\/li>\n<li><strong>(Posix) Thread ID<\/strong><br \/>\nDiese 32bit Nummer stellt eine eindeutigen POSIX-konformen <em>thread Identifier<\/em> her. Neben der eigentliche <em>pthreads<\/em> Verwaltung wird auch in der SW Entwicklung mit den g\u00e4ngigen Tools diese ID gerne benutzt.\n<\/li>\n<\/ul>\n<p>Das Einpr\u00e4gen dieser o.g. Definitionen wird einem allerdings durch zahlreiche Monitoring Tools &#8211; die sich auf das virtuelle Filesystem <em>proc<\/em> st\u00fctzen &#8211; nicht gerade erleichert. So zeigen Tools wie <strong>htop<\/strong> unter PID eigentlich die TID an. Daf\u00fcr gibt es einen extra Spalte TGID (welche nat\u00fcrlich das gleiche darstellen sollte als PID). Posix Thread ID fehlt daf\u00fcr g\u00e4nzlich.<\/p>\n<p>Eine anschauliche Illustration der Thematik bietet folgendes Programm an:<\/p>\n<p><code><br \/>\n\/*<br \/>\n * gcc -o pthreads_id pthreads_id.c -lpthread<br \/>\n *<br \/>\n * This programs shows the difference of<br \/>\n * 1. The PID (Process ID of the kernel, aka TGID Thread Group ID)<br \/>\n * 2. The TID (Thread ID of the kernel, subsequent number of main threads PID)<br \/>\n * 3. The Posix Thread ID<br \/>\n *\/<br \/>\n#include <pthread.h>\n#include <stdio.h><br \/>\n#include <stdlib.h><br \/>\n#include <sys\/syscall.h><br \/>\n#include <sys\/types.h><\/p>\n<p>pthread_t ntid;<\/p>\n<p>void printids(const char *s){<br \/>\n\tpid_t     pid;<br \/>\n\tpid_t     tid;<br \/>\n\tpthread_t ptid;<\/p>\n<p>\tpid = getpid();<br \/>\n        tid = syscall(SYS_gettid);<br \/>\n\tptid = pthread_self();<br \/>\n\tprintf(\"%s pid %u tid %u thread_id %u (0x%x)\\n\",s,(unsigned int)pid,(unsigned int)tid,(unsigned int)ptid,(unsigned int)ptid);<br \/>\n}<\/p>\n<p>void* thr_fn(void* arg){<br \/>\n\tprintids(\" new thread: \");<br \/>\n\treturn((void*)0);<br \/>\n}<\/p>\n<p>int main(void){<br \/>\n\tint err;<br \/>\n\terr = pthread_create(&ntid,NULL,thr_fn,NULL);<br \/>\n\tif(err!=0) printf(\"can't create thread: %i\\n\",strerror(err));<br \/>\n\tprintids(\"main thread: \");<br \/>\n\tsleep(1);<br \/>\n\texit(0);<br \/>\n}<br \/>\n<\/code><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Nach ein paar Monaten Abstinenz von der Welt der POSIX Threads f\u00e4llt es immer wieder schwer, die ID&#8217;s in den richtigen Kontext zu bringen. Deshalb r\u00e4umt dieser Beitrag nochmal auf. PID\/TGID Die Process Identification Number ist im Falle von gethreadeden Programmen auch gleichzeitig die Thread Group Identifcation Number. Pro Executable gibt es nur eine solche &hellip; <a href=\"https:\/\/www.instruyete.org\/?p=459\" class=\"more-link\"><span class=\"screen-reader-text\">Posix Threads unter Linux und deren ID&#8217;s<\/span> weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,7],"tags":[17],"class_list":["post-459","post","type-post","status-publish","format-standard","hentry","category-linux","category-unix","tag-posix-thread"],"_links":{"self":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/459","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=459"}],"version-history":[{"count":0,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=\/wp\/v2\/posts\/459\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=459"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=459"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.instruyete.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=459"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}