为什么同一进程的top和ps显示不同的PID?

为什么同一进程的top和ps显示不同的PID?

当我运行时top -H,我看到我的多个mysql线程都有相同的 PID。然而,ps -eLf我看到每个都有不同的 PID:

ps -eLf

UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
mysql     1424     1  1424  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1481  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1482  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1483  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1484  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1485  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1486  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1487  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1488  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1489  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1490  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1791  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1792  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1793  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1794  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1809  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld
mysql     1424     1  1812  0   17 18:41 ?        00:00:00 /usr/sbin/mysqld

并在top -H

PID USER      PR  NI  VIRT  RES  SHR S  %CPU %MEM    TIME+  COMMAND
 1424 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.08 mysqld                                                                  
 1481 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.16 mysqld                                                                  
 1482 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.33 mysqld                                                                  
 1483 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.16 mysqld                                                                  
 1484 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.23 mysqld                                                                  
 1485 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.27 mysqld                                                                  
 1486 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.15 mysqld                                                                  
 1487 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.18 mysqld                                                                  
 1488 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.16 mysqld                                                                  
 1489 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.16 mysqld                                                                  
 1490 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.34 mysqld                                                                  
 1791 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.26 mysqld                                                                  
 1792 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.54 mysqld                                                                  
 1793 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.00 mysqld                                                                  
 1794 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.00 mysqld                                                                  
 1809 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.00 mysqld                                                                  
 1812 mysql     20   0  539m  56m 7200 S   0.0  1.5   0:00.13 mysqld

发生了什么事,我应该相信哪一个?

答案1

他们实际上以不同的方式显示相同的信息。这就是-f-L选项要做ps的事情(来自man ps,强调我的):

-f 进行完整格式列表。此选项可以与许多其他 UNIX 样式选项结合使用以添加其他列。它还会导致打印命令参数。与 -L 一起使用时,将添加 NLWP(线程数)和 LWP(线程 ID)列。

-L 显示线程,可能与 LWP 和 NLWP 色谱柱一起使用。

tid TID 代表可调度实体的唯一编号(别名 lwp、spid)。该值也可能显示为:进程 ID (pid);进程组 ID (pgrp);会话领导者的会话 ID (sid);线程组领导者的线程组 ID (tgid);以及进程组领导者的 tty 进程组 ID (tpgid)。


因此,ps将在列中显示线程 ID,LWP而该PID列是实际的进程标识符

top另一方面,列出了该PID列中的不同线程,尽管我在 中找不到对此的明确提及man top

答案2

这只是呈现方式上的差异。查看输出LWP中的列ps-LWP是八个L过程。内核可以区分完整进程和线程,但它仍然必须使用与调度进程相同的机制独立地调度它们(这是线程的目的),因此调度程序看到的 id 必须是唯一的,最好的实现方法是为每个目的使用一个进程和线程 ID 池,并使用其他方法来区分这两种类型。WP

答案3

您会看到父进程1424,该进程创建了一个或多个子进程 ( the other PIDs)。

相关内容