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