為何線程有PID?

在linux下用 top -H -p <pid> 查詢某個進程的線程
按理說,都是某個進程下的線程, 應該進程id PID一樣啊,但實際卻都不一樣


實際是被PID的名字給弄混了,線程進程都會有自己的ID,這個ID就叫做PID,PID是不特指進程ID,線程ID也可以叫做PID。

pthread庫里的每一個線程都對應一個內核線程,都是有單獨的pid。


The four threads will have the same PID but only when viewed from above. What you (as a user) call a PID is not what the kernel (looking from below) calls a PID.

In the kernel, each thread has it's own ID, called a PID (although it would possibly make more sense to call this a TID, or thread ID) and they also have a TGID (thread group ID) which is the PID of the thread that started the whole process.

Simplistically, when a new process is created, it appears as a thread where both the PID and TGID are the same (new) number.

When a thread starts another thread, that started thread gets its own PID (so the scheduler can schedule it independently) but it inherits the TGID from the original thread.

That way, the kernel can happily schedule threads independent of what process they belong to, while processes (thread group IDs) are reported to you.


關于線程繼承關系圖如下:

               USER VIEW<-- PID 43 --> <----------------- PID 42 ----------------->+---------+| process |_| pid=42  |__/ | tgid=42 | \_ (new thread) __ (fork) _/   +---------+                  \/                                        +---------+
+---------+                                    | process |
| process |                                    | pid=44  |
| pid=43  |                                    | tgid=42 |
| tgid=43 |                                    +---------+
+---------+<-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->KERNEL VIEW

在這里你可以清晰的看到,創建一個新的進程會給一個新的PID和TGID,并且2個值相同,當創建一個新的線程的時候,會給你一個新的PID,并且TGID和之前開始的進程一致。

Linux通過進程查看線程的方法 1).htop按t(顯示進程線程嵌套關系)和H(顯示線程) ,然后F4過濾進程名。2).ps -eLf | grep java(快照,帶線程命令,e是顯示全部進程,L是顯示線程,f全格式輸出) 3).pstree -p <pid>(顯示進程樹,不加pid顯示所有) 4).top -Hp <pid>?(實時) 5).ps -T -p <pid>(快照)?推薦程度按數字從小到大。

打印線程的PID的方法如下:

getpid()方法可以打印進程的PID
gettid()方法可以打印線程的PID

void * thread_start(void *arg) ?
{ ?
? ? printf("Process ID: %d, thread ID %d\n", getpid(), gettid()); ?
} ?
由于gettid()在glibc中沒有包含
Note: There is no glibc wrapper for this system call; see NOTES.?

所以用如下syscall函數在用戶空間替代gettid()的功能
syscall(__NR_gettid)) ? 或者 ?syscall(SYS_gettid)

在文件 /usr/include/bits/syscall.h里, 有一行:
#define SYS_gettid __NR_gettid ?
可見二者是一樣的。__NR_gettid是系統調用號

#include <pthread.h> ?
#include <stdio.h> ?
#include <sys/types.h> ?
#include <sys/syscall.h> ?
#include <unistd.h> ?


void * thread_start(void *arg) ?
{ ?
? ? printf("[1] Process ID: %d, thread ID %d\n", getpid(), syscall(__NR_gettid)); ?
? ? printf("[2] Process ID: %d, thread ID %d\n", getpid(), syscall(SYS_gettid)); ?
} ?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383406.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383406.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383406.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關于樹和二叉樹的一些基本概念,基本名詞解釋。

二叉樹的概念 概念 一棵二叉樹是結點的一個有限集合&#xff0c;該集合或者為空&#xff0c;或者是由一個根節點加上兩棵別稱為左子樹和右子樹 的二叉樹組成。 二叉樹的特點&#xff1a; 每個結點最多有兩棵子樹&#xff0c;即二叉樹不存在度大于2的結點。二叉樹的子樹有左右…

在VI中刪除行尾的換行符

在vi中&#xff0c;如果要刪除行尾的換行符&#xff0c;可以用如下方法 第一種情況&#xff1a;只刪除單行 如有文件如下&#xff1a; [fanzfSWserver ~/tmp]$ cat names.tmp 101 Nate H. 102 John M. 104 Cassy T. 106 Mary L. 107 Isaac …

用c語言構建二叉樹(重點)

結點創建 二叉樹創建 我們以‘#’為NULL&#xff0c;我們要把輸入進來的一個字符串轉變為二叉樹&#xff0c;所以我們要記住遞歸的每一步走到數組了哪個位置 所以我們要記住創建過程中用掉的前序個數&#xff0c;并返回&#xff0c;除此之外&#xff0c;還要加上當時的那個結點…

linux 同步IO: sync msync、fsync、fdatasync與 fflush

最近閱讀leveldb源碼&#xff0c;作為一個保證可靠性的kv數據庫其數據與磁盤的交互可謂是極其關鍵&#xff0c;其中涉及到了不少內存和磁盤同步的操作和策略。為了加深理解&#xff0c;從網上整理了linux池畔同步IO相關的函數&#xff0c;這里做一個羅列和對比。大部分為copy&a…

二叉樹的廣度優先遍歷(層序遍歷)

先定義一個二叉樹的結點 再創建二叉樹&#xff0c;這里就不寫了&#xff0c;之前的有創建二叉樹的博客。 層序遍歷 用到棧的思想&#xff0c; 1 先讓根 節點進隊列&#xff0c;2 然后讀隊頂元素&#xff0c;3 讓他出隊列4 打印它的值5 讓隊頂元素的左右子樹進棧&#xff0…

用前序中序創建二叉樹(用中序后序創建二叉樹)

定義二叉樹結點 比如就拿這個二叉樹 前序中序創建 因為前序遍歷的順序是 根 &#xff0c; 左 &#xff0c;右。 中序的遍歷是 左 根 右。 我們會很不好想&#xff0c;但我們可以用前序和中序把上面那個二叉樹的遍歷一邊 前序遍歷&#xff1a;ABDEHCFG中序遍歷&#xff1a;D…

Epoll詳解及源碼分析

文章來源&#xff1a;http://blog.csdn.net/chen19870707/article/details/42525887 Author&#xff1a;Echo Chen&#xff08;陳斌&#xff09; Email&#xff1a;chenb19870707gmail.com Blog&#xff1a;Blog.csdn.net/chen19870707 Date&#xff1a;Jan.7th, 2015 1…

非遞歸實現二叉樹(前序,中序,后序)c/c++實現

這里還是用到棧的思想&#xff0c;為了方便用了c的一些內容&#xff0c;把出棧&#xff0c;進棧&#xff0c;讀棧頂元素用一個個函數封裝起來了&#xff0c;前面做了一些處理來使用這些函數。 前序非遞歸 思想&#xff1a;一直走左邊&#xff0c;依次進棧。等左邊為空的時候&…

Linux 中統計一個進程的線程數

如果你想看到 Linux 中每個進程的線程數&#xff0c;有以下幾種方法可以做到這一點。 方法一: /proc proc 偽文件系統&#xff0c;它駐留在 /proc 目錄&#xff0c;這是最簡單的方法來查看任何活動進程的線程數。 /proc 目錄以可讀文本文件形式輸出&#xff0c;提供現有進程和系…

Linux_linux基礎命令(增刪查,權限,Linux下的重要目錄,重要命令(. du, df, top, free, pstack, su, sudo).安裝gcc/g++, gdb, vim )

r&#xff1a;表示可讀w&#xff1a;表示可寫x&#xff1a;表示可執行也可以用數字表示這一點我們會在修改文件權限說明。對于文件夾的rwx表示&#xff1a;r表示可讀及可以查看文件夾內容可以ls查看w表示可寫及可以向文件夾中傳送內容如文件x表示可執行及可以向文件夾中可以cd進…

pthread_create會導致內存泄露

這幾天一直在調試一個系統&#xff0c;系統的功能就是定時發送數據、接收數據然后解析收到的數據&#xff0c;轉換成一定的格式存入數據庫中。我為了并發操作&#xff0c;所以每接收到一個數據包&#xff0c;就調用pthread_create函數創建一個默認屬性的線程進行處理。 系統…

Linux_linux常用工具之make/makefile詳解

make/makefile make/makefile: 項目自動化構建工具 makefile:普通文本文件&#xff0c;記錄了項目的構建流程規則。 make: 一個解釋程序&#xff0c;到當前執行make命令的目錄下尋找makefile文件&#xff0c;并且對makefile 中記錄的項目構建規則進行解釋執行。makefile: 編寫…

Linux_linux常用工具(git,vim ,gcc ,gdb,權限)超詳解

git :項目版本控制工具 項目克隆&#xff1a;git clone項目提交&#xff1a;git add&#xff08;本地倉庫提交&#xff09; git commit -m “bak msg”&#xff08;-m 備注信息&#xff09;同步到服務器&#xff1a;git push origin master&#xff08;提交到主分支&…

T20調試札記

最近在調試T20的內存&#xff0c;使用的指令在此記錄一下 1. pmap指令查看指定進程中的內存分布。該指令需要在busybox中開啟 pmap -x 111 2.應用與so需要執行strip操作&#xff0c;可以減小存儲空間的大小 mips-linux-gnu-strip libsysutils.so 3.nm指令和file指令可以查…

samba 2.2.7a 編譯

今天在君正T20上編譯samba 2.2.7a 遇到了一些問題&#xff0c;特此記錄一下 1.自己寫一個build.sh腳本&#xff0c;方便后續的再次編譯 #!/bin/sh # export CFLAGS"-O2 -muclibc" export CPPFLAGS"-O2 -muclibc" export CXXFLAGS"-O2 -muclibc&qu…

Linux_linux常用工具------進度條程序

緩沖區對文件讀寫的影響&#xff1a;數據并沒有直接寫入文件&#xff0c;而是寫入到緩沖區&#xff08;內存&#xff09;中&#xff0c;等到緩沖區中數據寫滿或者刷新緩沖區的時候&#xff0c;才會將數據真正的寫入文件 fflush&#xff08;stdout&#xff09;刷新。 回車與換行…

Ubuntu下QT的安裝詳細教程

本文轉自&#xff1a;http://blog.chinaunix.net/uid-7945126-id-4987195.html 經測試完美解決 ------------------------------------------------------------- 最近需要在Ubuntu下開發桌面軟件&#xff0c;想起了QT。書上介紹的方法太老了&#xff0c;網上找了一大堆安裝方法…

Linux_linux常用工具---閑雜篇(除了vim, 還有哪些常用的牛逼的編輯器, 并能夠橫向對比編輯器之間的區別和優缺點.)

vim自行查找資料, 自行配置插件. 借鑒別人的 " 顯示相關 “”""""""""""""""""""""""""""""""""&…

ubuntu14.04下安裝qt4.8.6 +qt creator

原創作品&#xff0c;允許轉載&#xff0c;轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://248341.blog.51cto.com/238341/1438867以前安裝時沒太注意&#xff0c;安裝qt后發現在qt creator下無法輸入中文&#xff0c;或者中文無法…

網絡基礎一(協議的概念,網絡應用程序設計模式)

協議的概念 什么是協議&#xff1f; 從應用的角度出發&#xff0c;協議可理解為“規則”&#xff0c;是數據傳輸和數據的解釋的規則。 假設&#xff0c;A、B雙方欲傳輸文件。規定&#xff1a; 第一次&#xff0c;傳輸文件名&#xff0c;接收方接收到文件名&#xff0c;應答OK…