进程是怎样工作的
当系统启动的时候,内核先把一些它自己的活动初始化为进程,然后运行一个叫做 init 的程序。init, 依次地,再运行一系列的称为 init 脚本的 shell 脚本(位于/etc),它们可以启动所有的系统服务。 其中许多系统服务以守护(daemon)程序的形式实现,守护程序仅在后台运行,没有任何用户界面。 这样,即使我们没有登录系统,至少系统也在忙于执行一些例行事务。
在进程方案中,一个程序可以发动另一个程序被表述为一个父进程可以产生一个子进程。
内核维护每个进程的信息,以此来保持事情有序。例如,系统分配给每个进程一个数字,这个数字叫做 进程 ID 或 PID。PID 号按升序分配,init 进程的 PID 总是1。内核也对分配给每个进程的内存和就绪状态进行跟踪以便继续执行这个进程。 像文件一样,进程也有所有者和用户 ID,有效用户 ID,等等。
查看进程
查看进程,最常使用地命令是 ps。ps 程序有许多选项,它最简单地使用形式是这样的:webadmin@xuexiyuan:~$ ps
PID TTY TIME CMD
564 pts/0 00:00:00 bash
578 pts/0 00:00:00 ps
上例中,列出了两个进程,进程 564 和进程 578,各自代表命令 bash 和 ps。正如我们所看到的,默认情况下,ps 不会显示很多进程信息,只是列出与当前终端会话相关的进程。为了得到更多信息, 我们需要加上一些选项,但是在这样做之前,我们先看一下 ps 命令运行结果的其它字段。 TTY 是 “Teletype” 的简写,是指进程的控制终端。这里,Unix 展示它的年龄。TIME 字段表示 进程所消耗的 CPU 时间数量。正如我们所看到的,这两个进程使计算机工作起来很轻松。
如果给 ps 命令加上选项,我们可以得到更多关于系统运行状态的信息:webadmin@xuexiyuan:~$ ps x
PID TTY STAT TIME COMMAND
555 ? S 0:00 sshd: webadmin@pts/0
564 pts/0 Ss 0:00 -bash
636 pts/0 R+ 0:00 ps x
13452 ? S 0:44 nginx: worker process
17296 ? Sl 125:09 /opt/jdk1.8.0_151/jre/bin/java -Djava.util.logging.config.file=/opt/apache-tomcat-8.5.23/conf/logging.properties
18068 ? Ss 0:00 /lib/systemd/systemd --user
18071 ? S 0:00 (sd-pam)
加上 “x” 选项(注意没有开头的 “-“ 字符),告诉 ps 命令,展示所有进程,不管它们由什么 终端(如果有的话)控制。在 TTY 一栏中出现的 “?” ,表示没有控制终端。使用这个 “x” 选项,可以 看到我们所拥有的每个进程的信息。
输出结果中标题为 STAT 它揭示了进程当前状态,下表是对进程状态说明:
另外一个常用选项组合是 “aux”(不带开头的”-“字符),能够显示属于每个用户的进程信息:webadmin@xuexiyuan:~$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.4 37792 4472 ? Ss 2017 2:21 /lib/systemd/systemd --system --deserialize 18
root 2 0.0 0.0 0 0 ? S 2017 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 2017 0:14 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S
...
使用这个选项,可以唤醒 “BSD 风格” 的输出结果,下表是对命令列标题的说明:
用 top 命令动态查看进程
虽然 ps 命令能够展示许多计算机运行状态的信息,但是它只是提供 ps 命令执行时刻的机器状态快照。 为了看到更多动态的信息,我们使用 top 命令:webadmin@xuexiyuan:~$ top
top - 13:59:41 up 96 days, 16:30, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 114 total, 1 running, 113 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1016096 total, 88584 free, 685916 used, 241596 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 133796 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
17296 webadmin 20 0 2272184 371784 3404 S 0.3 36.6 125:11.52 java
30841 root 20 0 25980 2196 1584 S 0.3 0.2 35:22.76 AliYunDunUpdate
1 root 20 0 37792 4472 2624 S 0.0 0.4 2:21.17 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:14.62 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
top 程序以进程活动顺序显示连续更新的系统进程列表。(默认情况下,每三秒钟更新一次)。top 显示结果由两部分组成: 最上面是系统概要,下面是进程列表,以 CPU 的使用率排序。
其中系统概要包含许多有用信息。下表是对系统概要的说明:
top 程序接受一系列从键盘输入的命令。两个最有趣的命令是 h 和 q。h,显示程序的帮助屏幕; H,显示线程信息; q, 退出 top 程序。
查看进程的线程数使用ps、pstree命令查看指定进程的线程数:ps H 进程号 | wc -l
ps -T 进程号 | wc -l
pstree -p 进程号 | wc -l
ps命令,线程相关参数帮助文档:
使用top命令方式获取进程的线程数:top -Hp 进程号
通过 proc 伪文件系统方式查看进程的线程信息:cat /proc/进程号/status
proc 伪文件系统,它驻留在 /proc 目录,这是最简单的方法来查看任何活动进程的线程数。 /proc 目录以可读文本文件形式输出,提供现有进程和系统硬件相关的信息如 CPU、中断、内存、磁盘等等.查看当前系统所有进程的线程总数ps axH | wc -l
ps -eT | wc -l