通过线程的status文件,可以查看线程的调度次数。status的最后两行,voluntary_ctxt_switches表示线程的资源调度次数,比如线程调用了sleep睡眠,或者调用io接口发生了阻塞,均会统计为主动调度次数;nonvoluntary_ctxt_switches表示非自愿调度次数,比如线程在运行过程中被强张了。
如果线程在运行过程中被中断打断了,那么不会统计到调度次数。因为中断不会参与调度,不会被schedule,不是一个被调度的对象。线程只是被中断打断了,并不是被一个可调度的对象打断了,此时不会增加调度次数。
# cat /proc/1/status
Name: systemd
Umask: 0000
State: S (sleeping)
Tgid: 1
Ngid: 0
Pid: 1
PPid: 0
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0
FDSize: 256
Groups:
NStgid: 1
NSpid: 1
NSpgid: 1
NSsid: 1
VmPeak: 21496 kB
VmSize: 19948 kB
VmLck: 0 kB
VmPin: 0 kB
VmHWM: 9992 kB
VmRSS: 9992 kB
RssAnon: 2856 kB
RssFile: 7136 kB
RssShmem: 0 kB
VmData: 2400 kB
VmStk: 132 kB
VmExe: 1236 kB
VmLib: 13392 kB
VmPTE: 76 kB
VmSwap: 0 kB
HugetlbPages: 0 kB
CoreDumping: 0
THP_enabled: 1
Threads: 1
SigQ: 0/113668
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 7be3c0fe28014a03
SigIgn: 0000000000001000
SigCgt: 00000001800004ec
CapInh: 0000000000000000
CapPrm: 000001ffffffffff
CapEff: 000001ffffffffff
CapBnd: 000001ffffffffff
CapAmb: 0000000000000000
NoNewPrivs: 0
Seccomp: 0
Seccomp_filters: 0
Speculation_Store_Bypass: thread vulnerable
Cpus_allowed: 3ff
Cpus_allowed_list: 0-9
Mems_allowed: 1
Mems_allowed_list: 0
voluntary_ctxt_switches: 31270
nonvoluntary_ctxt_switches: 2525