04 进程线程相关工具

pidin

https://www.qnx.com/developers/docs/7.0.0/index.html#com.qnx.doc.neutrino.utilities/topic/p/pidin.html
pidin是一个非常强大的工具,它可以查看进程的详细信息,包括进程的状态,进程的线程,进程的内存映射,进程的文件描述符,运行进程的环境变量等。下面显示了一个没有带任何参数的pidin命令的输出结果。

# pidin
     pid tid name               prio STATE       Blocked                     
       1   1 /procnto-smp-instr   0f RUNNING                                 
       1   2 /procnto-smp-instr   0f READY                                   
       1   3 /procnto-smp-instr   0f RUNNING                                 
       1   4 /procnto-smp-instr   0f RUNNING                                 
       1   5 /procnto-smp-instr  10r RECEIVE     1                           
       1   6 /procnto-smp-instr   1r RECEIVE     2                           
       1   7 /procnto-smp-instr  10r CONDVAR     (0xffff8000000cf320)        
       1   8 /procnto-smp-instr  10r CONDVAR     (0xffff8000000cf328)        
       1   9 /procnto-smp-instr 255r RECEIVE     4                           
       1  10 /procnto-smp-instr 255r RECEIVE     1                           
       1  11 /procnto-smp-instr 255r RECEIVE     1                           
       1  12 /procnto-smp-instr 255r RECEIVE     1                           
       1  13 /procnto-smp-instr  10r RUNNING                                 
       1  14 /procnto-smp-instr  10r RECEIVE     1                           
       1  15 /procnto-smp-instr  10r RECEIVE     1                           
       1  16 /procnto-smp-instr  10r RECEIVE     1                           
       1  17 /procnto-smp-instr  10r RECEIVE     1                           
       1  18 /procnto-smp-instr  10r RECEIVE     1                           
       2   1 proc/boot/slogger2  10r RECEIVE     1                           
       3   1 proc/boot/random    10r SIGWAITINFO                             
       3   2 proc/boot/random    10r NANOSLEEP                               
       3   3 proc/boot/random    21r RECEIVE     1                           
       4   1 proc/boot/dumper    10r RECEIVE     1                           
       5   1 proc/boot/pipe      10r SIGWAITINFO                             
       5   2 proc/boot/pipe      10r RECEIVE     1                           
       5   3 proc/boot/pipe      10r RECEIVE     1                           
       6   1 proc/boot/devc-pty  10r RECEIVE     1                           
       7   1 oc/boot/pci-server  21r RECEIVE     2                           
       7   2 oc/boot/pci-server  10r RECEIVE     2                           
       7   3 oc/boot/pci-server  10r RECEIVE     2                           
       8   1 roc/boot/devb-eide  10r SIGWAITINFO                             
       8   2 roc/boot/devb-eide  21r RECEIVE     1                           
       8   3 roc/boot/devb-eide  21r RECEIVE     3                           
       8   4 roc/boot/devb-eide  10r RECEIVE     7                           
       8   5 roc/boot/devb-eide  10r RECEIVE     9                           
       8   6 roc/boot/devb-eide  10r RECEIVE     11                          
       8   7 roc/boot/devb-eide  10r RECEIVE     5                           
       8   8 roc/boot/devb-eide  10r RECEIVE     5                           
       8   9 roc/boot/devb-eide  21r RECEIVE     5                           
       8  10 roc/boot/devb-eide  10r RECEIVE     5                           
       9   1 /boot/devc-ser8250  24r RECEIVE     1                           
    4106   1 /boot/io-pkt-v6-hc  21r SIGWAITINFO                             
    4106   2 /boot/io-pkt-v6-hc  21r RECEIVE     2                           
    4106   3 /boot/io-pkt-v6-hc  21r RECEIVE     20                          
    4106   4 /boot/io-pkt-v6-hc  21r RECEIVE     22                          
    4106   5 /boot/io-pkt-v6-hc  21r RECEIVE     24                          
   12299   1 bin/sh              10r SIGSUSPEND                              
  471052   1 proc/boot/pidin     10r REPLY       1      

整个结果输出有6列,从左到右分别是pid,tid,name,prio,state和blocked。其中:

  • pid列显示进程的ID;
  • tid列显示线程的ID;
  • name列显示进程名字,如果名字太长则只显示后面一段而忽略前面的字符;
  • prio列显示线程调度信息的复合体。前面数字表示线程调度优先级,后面的小写字母表示线程调度策略。调度策略有前述的四种形式:f(先进先出 FIFO), r(轮询 Round Robin), s(sporadic)和o(other)。
  • state列显示线程的状态,blocked列的值依赖于线程状态。不同的线程状态拥有不同含义的值。具体如下表所示:
状态值含义
CONDVAR条件变量地址
JOIN阻塞线程ID
MUTEX互斥量的地址,或者被阻塞的进程和线程的id,后面是被锁定的次数,形式为pid-tid #times
RECEIVE被阻塞线程的进程内的消息通信通道
REPLY进程ID
SEM信号量的地址
SEND进程ID
STACK栈大小
WAITPAGE内存页虚拟地址
WAITTHREAD阻塞线程ID

另外pidin还支持丰富的选项,满足不同的需求。下面是pidin的选项列表。

pidin 选项

-d delay

以0.1秒为单位的延迟。只有在使用-l选项时才生效,其默认值为10,即1秒钟。

-F formats

类似printf()格式化字符串的格式化代码组合。每个代码都由一个百分号(%)、一个可选的字段宽度和一个格式字符(例如"%I %60N")组成。有关更多信息,请参阅下面的 [“格式字符”] 。如果不指定任何格式代码,则默认为“%a %b %N %p %J %b”。 上面我们直接使用pidin的输出结果就是这种形式。

-f formats

与-F选项相同,但formats参数是一个可以展开的格式代码的连续字符串。例如,-f mbe扩展为-f “%m %b %e”。

-h
帮助信息。

-k
持续显示PID和TIDs的数据,直到发生错误,例如,遇到一个状态未知的PID/TID(因为PID/TID是部分活动状态的)。

-l
循环模式;显示每delay*0.1秒延迟的统计数据(delay使用-d选项指定)。

例如 每5秒钟刷一次屏幕,可以使用-d 50选项,即-d 5*10=50。
$ pidin -l -d 50

-M formats

格式字符的组合,每个字符后面都有一个百分号(%),类似于printf()的格式字符串,用于控制有关内存区域信息的格式化。有关更多信息,请参阅的 “内存格式字符”

-n node

获取信息的远程节点名称。

-o prio (似乎无效)

只显示运行在指定prio线程调度优先级的进程/线程。

-P pid

大写的P,只显示指定pid的进程族(pid可能是进程的名称,也可能进程号)。

-p pid

只显示指定的pid进程。

例如,只显示pid或进程名为8的进程:
# pidin -p 8
     pid tid name               prio STATE       Blocked                     
       8   1 roc/boot/devb-eide  10r SIGWAITINFO                             
       8   2 roc/boot/devb-eide  21r RECEIVE     1                           
       8   3 roc/boot/devb-eide  21r RECEIVE     3                           
       8   4 roc/boot/devb-eide  10r RECEIVE     7                           
       8   5 roc/boot/devb-eide  10r RECEIVE     9                           
       8   6 roc/boot/devb-eide  10r RECEIVE     11                          
       8   7 roc/boot/devb-eide  21r RECEIVE     5                           
       8   8 roc/boot/devb-eide  10r RECEIVE     5                           
       8   9 roc/boot/devb-eide  10r RECEIVE     5   

pidin 支持多达63项不同内容的格式化字符串,并提供了一些常用的格式化字符串,在这摘取一些常用的参数展示如下:

arguments (-F “%a %A”)

显示进程的命令行参数。这样可以很清晰的看到进程启动时使用了什么参数。

# pidin arg
     pid Arguments
       1 procnto-smp-instr -v -P 100 
       2 slogger2 -U 2030:2030 -s 1000k -g 2030 -l /tmp 
       3 random -t 
       4 dumper -U 2040:2040 -d /tmp -I 
       5 pipe -U 2050:2050 
       6 devc-pty 
       7 pci-server --aspace-enable 
       8 devb-eide blk cache=64M,auto=partition,vnode=2000,ncache=2000,noatime,commit=low dos exe=all 
       9 devc-ser8250 -e -b115200 
    4106 io-pkt-v6-hc -d e1000 name=eq 
   12299 sh 
   77837 /usr/sbin/sshd 
  114702 /usr/sbin/sshd -R 
 1740816 pidin arg 

backtrace (-F “%I %q”)

显示当前显示进程中每个线程的回溯信息,这个选项可以很方便的查看进程中每个线程的调用栈信息。例如下面显示了io-pkt-v6-hc进程中每个线程的回溯信息。

# pidin -p io-pkt-v6-hc back
pid-tid     backtrace                                                   
    4106-01 10004fb05:8072ef2                                           
    4106-02 10004f9f8:8146a96                                           
    4106-03 1000508cb:814680d 

environment (-F “%a %N %E”)

显示运行进程的环境变量。

# pidin -p sshd env
     pid name               Environment
   32781 usr/sbin/sshd      _=/usr/sbin/sshd PATH=/proc/boot:/usr/bin:/bin:/usr/sbin:/sbin SIGKILL_TIMEOUT=300 LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll:/lib/dll/pci PCI_BASE_VERBOSITY=3 PCI_DEBUG_MODULE=/proc/boot/pci_debug2.so PCI_SLOG_MODULE=/proc/boot/pci_slog2.so PCI_HW_MODULE=/proc/boot/pci_hw-Intel_x86.so ENV=/etc/.kshrc
  180236 usr/sbin/sshd      _=/usr/sbin/sshd PATH=/proc/boot:/usr/bin:/bin:/usr/sbin:/sbin SIGKILL_TIMEOUT=300 LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll:/lib/dll/pci PCI_BASE_VERBOSITY=3 PCI_DEBUG_MODULE=/proc/boot/pci_debug2.so PCI_SLOG_MODULE=/proc/boot/pci_slog2.so PCI_HW_MODULE=/proc/boot/pci_hw-Intel_x86.so ENV=/etc/.kshrc

info

显示系统信息,例如每个处理器的类型、频率,内存大小、使用情况,进程数量等。

# pidin info
CPU:X86_64 Release:7.0.4  FreeMem:895MB/1023MB BootTime:Jul 12 07:29:37 GMT 2023
 Actual resident free memory:897Mb
Processes: 15, Threads: 46
Processor1: 524974 Intel 686 F6M1�S10 1798MHz FPU 
Processor2: 524974 Intel 686 F6M1�S10 1799MHz FPU 


# pidin info
CPU:AARCH64 Release:7.0.4  FreeMem:24GB/30GB BootTime:Jan 01 00:00:00 GMT 1970
 Actual resident free memory:24Gb
Processes: 64, Threads: 335
Processor1: 1309605952 D20/0x0350F66D 1600MHz FPU 
Processor2: 1309605952 D20/0x0350F66D 1600MHz FPU 
Processor3: 1309605952 D20/0x0350F66D 1600MHz FPU 
Processor4: 1309605952 D20/0x0350F66D 1600MHz FPU 
Processor5: 1309605952 D20/0x0350F66D 1600MHz FPU 
Processor6: 1309605952 D20/0x0350F66D 1600MHz FPU 
Processor7: 1309605952 D20/0x0350F66D 1600MHz FPU 

threads (-F “%a %b %N %h %J %B”)

显示进程ID,线程ID, 短进程名,线程名称,线程状态,线程block状态, 如果线程没有线程名称,那么相应列就显示线程ID。

# pidin -p devb-eide threads
     pid tid name               thread name          STATE       Blocked                     
       8   1 roc/boot/devb-eide xpt_signal_handler   SIGWAITINFO                             
       8   2 roc/boot/devb-eide eide_driver_thread   RECEIVE     1                           
       8   3 roc/boot/devb-eide eide_driver_thread   RECEIVE     3                           
       8   4 roc/boot/devb-eide async_io             RECEIVE     7                           
       8   5 roc/boot/devb-eide fsnotify_thread      RECEIVE     9                           
       8   6 roc/boot/devb-eide swap_io              RECEIVE     11                          
       8   7 roc/boot/devb-eide fsys_resmgr          RECEIVE     5                           
       8   8 roc/boot/devb-eide fsys_resmgr          RECEIVE     5                           
       8   9 roc/boot/devb-eide fsys_resmgr          RECEIVE     5    

top

top 工具是一个动态显示进程信息的工具,它可以实时显示进程的运行状态,包括进程的CPU占用率、内存占用率、进程的PID、进程的名称等信息。top工具的使用非常简单,直接在命令行输入top即可,显示结果如下所示:

16 processes; 48 threads;
CPU states: 50.0% user, 0.0% kernel
CPU  0 Idle: 0.0% 
CPU  1 Idle: 99.9% 
Memory: 1023M total, 895M avail, page size 4K

      PID   TID PRI STATE    HH:MM:SS    CPU  COMMAND
   241679     1  10 Run       0:00:18  49.99% main
     4106     2  21 Rcv       0:00:07   0.01% io-pkt-v6-hc
        6     1  10 Rcv       0:00:00   0.00% devc-pty
        1     9  10 Run       0:00:00   0.00% kernel
   245776     1  10 Rply      0:00:00   0.00% top
    20492     1  10 SigW      0:00:00   0.00% sshd
        3     2  10 NSlp      0:00:00   0.00% random
        5     3  10 Rcv       0:00:00   0.00% pipe
        8     3  21 Rcv       0:00:00   0.00% devb-eide
        8     2  21 Rcv       0:00:00   0.00% devb-eide

             Min        Max       Average 
CPU 0 idle:    0%        99%        66% 
CPU 1 idle:    0%        99%        33% 
Mem Avail:   895MB      895MB      895MB  
Processes:    16         16         16    
Threads:      48         48         48  

在上面的结果表示,当前系统中存在16个进程,48个线程,CPU的使用率分为用户态使用率和内核态使用率,其中前者为50%。设计优良的系统,用户态使用率高,内核态CPU使用率低。上面系统显示存在两个CPU核,其中CPU 0一直在工作,空闲率为0%,而CPU 1一直空闲,空闲率~100%。系统一共有1G大小内存,其中可用内存为895M,内存使用率为12.5%。内存页大小为4K。

top默认只显示前10个CPU使用率高的进程信息。每个进程显示了进程ID,线程ID,优先级,进程状态,运行时间,CPU使用率,进程名称。

结果的最后部分显示了各个CPU核的空闲率,可使用内存,系统中进程和线程数量的统计信息,每类信息都包含最小值,最大值和平均值。

如果想要将top显示的信息保存到文件中,-b选项,让top使用批处理模式,将结果输出到文件中,例如:

top -b > top.txt

top支持下列可交互的命令:

? or h

显示帮助信息。

d

设置刷新时间,单位为秒。

k

杀死指定进程,需要输入进程ID。

l

立即刷新屏幕。

n

设置显示的线程数目,默认值为10, 最小值为5。

q

退出top。

ps

ps(process status)是POSIX标准中定义的一个工具,它可以显示系统中的进程信息,包括进程的PID,进程的状态,进程的名称、参数等,可以参考QNX ps说明。

ps 包含有很多选项,可以满足不同的需求,下面列出一些常用的选项:

-a

显示所有关联到当前终端的所有进程信息。

-A

显示所有进程信息。

-e

显示所有进程信息, 与-A类似。

-f

显示完整的列表。

-l

显示长列表。

-o format

按照指定的规范格式显示进程的信息。format 支持下列字段:

“ruser”: 进程实际的用户名或者ID号

“user”: 进程有效的用户名或者ID号

“rgroup”: 进程的实际的进程组名或ID号

“group”: 进程有效的进程组名或ID号

“pid”: 进程ID

“ppid”: 父进程ID

“pgid”: 进程组ID

“pcpu”: 最近一段时间内已使用CPU时间与可用CPU时间比率

“vsz”: 进程大小

“nice”: 进程有效优先级

“etime”: 进程启动后经过的时间

“time”: 进程累计耗时

“tty”: 正在控制终端名字(未支持)

“comm”: 正在执行的命令

“args”: 包含所有参数的命令

The command with all of its arguments.

虽然POSIX 未要求,但QNX ps还支持下列字段:

“uid”: 进程实际用户名称或ID

“env”: 以空格分割的环境变量列表

“f”: 进程标志

“pri”: 进程实际优先积极

“sid”: 会话头进程ID

“suid”: 会话所有者用户ID

“sgid”: 会话所有者组ID

“umask”: 进程文件属性掩码

“sigign”: 进程忽略信号列表

“sigpend“: 进程或者线程阻塞信号列表

“sigqueue”: 进程信号队列列表

“threads”: 进程所含有线程数目

“stime”: 进程开始运行时间

“cmd”: 当前执行命令

“sz”: 内存使用大小

以上有些是线程相关的字段,在这种情况下,使用进程中第一个线程的值。

下列字段名称显示的是线程相关的信息:

“tid”: 线程ID

“tflags”: 线程标志

“dflags”: 线程debug标志

“tsigblk”: 阻塞在线程上的列表

“cpu”: 最后运行线程的CPU号

“state”: 线程状态

“wchan”: 等待通道

“addr”: 等待地址

“psched”: 调度策略

hogs

显示系统中进程占用CPU的信息。它按照应用程序使用CPU百分比降序排列显示出一个进程列表。hogs输出的信息包含:

  PID — 进程ID
  NAME- 进程名称
  %CPU — 进程使用的CPU百分比
  %MEM — 进程使用的内存百分比
  NAME — 进程名
  ARGS — 进程的命令行参数

hogs 支持以下选项信息:

-i iter

将输出限制为指定的循环次数(默认无次数限制)。

-m [e][t][p][s]

指定要包含在每个进程的内存总数中的内存映射类型
e — MAP_ELF mappings
t — MAP_STACK mappings
s — MAP_SHARED mappings
p — MAP_PRIVATE mappings (the default)

-p priority

以给定的优先级运行hogs(默认值:与父进程相同)。

-S [c|m|p]

排序方式:

    c — CPU (the default)
    m — memory
    p — process ID

-s sec

更新间隔的休眠时间(默认值:3秒)。
Sleep this long between updates (default: 3 seconds).

-% num [c|m]

只显示CPU或内存占用百分比等于或高于此值的进程。您可以使用此选项来减少输出量。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言北万

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值