[Linux]LinuxプロセスPIDハッシュ

3779 ワード

linuxシステムの各プロセスは、1つのプロセス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