天天看點

[Linux] Linux程序PID散清單

linux系統中每個程序由一個程序id辨別,在核心中對應一個task_struct結構的程序描述符,系統中所有程序的task_struct通過連結清單連結在一起,在核心中,經常需要通過程序id來擷取程序描述符,最簡單的方法可以通過周遊task_struct連結清單并對比id的值來擷取,但這樣效率太低,尤其當系統中運作很多個程序的時候。

 linux核心通過PID散清單來解決這一問題,能快速的通過程序ID擷取到程序描述符。

 PID散清單包含4個表,因為程序描述符包含了表示不同類型PID的字段,每種類型的PID需要自己的散清單。

enum pid_type

{

        PIDTYPE_PID,  // 程序的PID

        PIDTYPE_TGID, // 線程組領頭程序的PID

        PIDTYPE_PGID, // 程序組領頭程序的PID

       PIDTYPE_SID,  // 會話領頭程序的PID

        PIDTYPE_MAX   // 類型個數

};      

檢視/proc/pid/status可以看到一些程序的目前狀态:

shell@android:/proc/19280/task $ cat 19282/status                              
Name:    GC
State:    S (sleeping)
Tgid:    19280
Pid:    19282
PPid:    17974
TracerPid:    0
Uid:    10043    10043    10043    10043
Gid:    10043    10043    10043    10043
FDSize:    256
Groups:    1006 1007 1015 1028 3001 3002 3003 
VmPeak:      483560 kB
VmSize:      481500 kB
VmLck:           0 kB
VmPin:           0 kB
VmHWM:       44940 kB
VmRSS:       29684 kB
VmData:       24848 kB
VmStk:         136 kB
VmExe:           8 kB
VmLib:       29096 kB
VmPTE:         160 kB
VmSwap:           0 kB
Threads:    19
SigQ:    0/5987
SigPnd:    0000000000000000
ShdPnd:    0000000000000000
SigBlk:    0000000000001204
SigIgn:    0000000000000000
SigCgt:    00000002000094e8
CapInh:    0000000000000000
CapPrm:    0000000000000000
CapEff:    0000000000000000
CapBnd:    ffffffffffffffff
Cpus_allowed:    3
Cpus_allowed_list:    0-1
voluntary_ctxt_switches:    5
nonvoluntary_ctxt_switches:    33