[Linux]LinuxプロセスPIDハッシュ
3779 ワード
linuxシステムの各プロセスは、1つのプロセスidによって識別され、カーネルにtask_が対応するstruct構造のプロセス記述子、システム内のすべてのプロセスのtask_structはチェーンテーブルでリンクされており、カーネルではプロセスidでプロセス記述子を取得することがしばしば必要であり、最も簡単な方法はtask_を遍歴することができる.structチェーンテーブルはidの値を比較して取得されるが、特にシステムで多くのプロセスが実行される場合、効率が低すぎる.
linuxカーネルはPIDハッシュテーブルでこの問題を解決し、プロセスIDでプロセス記述子を迅速に取得できます.
PIDハッシュ・リストには4つのテーブルが含まれています.プロセス記述子には異なるタイプのPIDを表すフィールドが含まれているため、各タイプのPIDには独自のハッシュ・リストが必要です.
/proc/pid/statusを表示すると、いくつかのプロセスの現在のステータスが表示されます.
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