Linux - 进程管理(一)

本贴最后更新于 1863 天前,其中的信息可能已经水流花落

进程是个什么玩意?

  1. 在 Linux 中,每一个执行的程序都称为一个进程。每一个进程都分配一个 ID 号。
  2. 每一个进程,都会对应一个父进程,而这个父进程可以复制多个子进程。从这一点其实还可以推测出,进程在 Linux 中是树型结构。
  3. 每一个进程都可能以两种方式存在的。前台与后台,所谓前台进程就是用户目前屏幕上可以进行操作的。后台进程则是实际在操作,但由于屏幕上无法看到的进程,通常使用后台的方式执行。
  4. 一般系统的服务都是后台进程的方式存在,而且会常驻在系统中,直到关机才结束。

如何查看进程

一般我们会使用三条命令来查看进程,分别是 pspstreetop

其中 ps 命令可以查看各种进程信息,pstree 查看进程树的情况,然后 top 的作用比较强大,可以查看各个进程资源的占用状况。

ps

用法 ps -选项

选项说明

-a:显示当前终端的所有进程信息

-u:以用户的形式显示进程信息

-x:显示后台进程运行的参数

-e:显示所有进程

-f:全格式

我们以命令 ps -ef 的输出的部分例子作为分析

huny@huny-PC:~$ ps -ef  #以全格式显示当前所有的进程
UID        PID  PPID  C STIME TTY          TIME CMD
root         9     2  0 17:55 ?        00:00:00 [rcu_bh]
root      5431     1  0 17:58 ?        00:00:00 /usr/lib/upower/upowerd
root     11470  3131  5 18:54 tty1     00:06:05 /usr/lib/xorg/Xorg -background none :0 -seat seat0 -auth /var/run/lightdm/root/:0 -nolisten tcp vt1 -novtswitch
root     11544  3131  0 18:54 ?        00:00:00 lightdm --session-child 13 22
huny     11632     1  0 18:54 ?        00:00:00 /lib/systemd/systemd --user
huny     11633 11632  0 18:54 ?        00:00:00 (sd-pam)
huny     11658     1  0 18:54 ?        00:00:00 /usr/bin/dbus-daemon --fork --print-pid 5 --print-address 7 --session

UID 是用户名(执行改线程的用户)。

PID 是该线程在系统中的唯一标识。

PPID 是该进程的父进程 I 的 ID。

C 是 CPU 用于计算执行优先级的因子,数值越大,表明进程是 CPU 密集型运算, 执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高。

STIME 是进程启动的时间。

TIME 是累积的 CPU 时间(user+system)

CMD 是启动进程所用的命令和参数。

pstree

如果需要查看进程树的状况的时候,我们就可以使用 pstree 命令。下面我截取了部分我电脑上输入 pstree 的信息。

huny@huny-PC:~$ pstree
systemd─┬─ModemManager─┬─{gdbus}
        │              └─{gmain}
        ├─NetworkManager─┬─dhclient
        │                ├─{gdbus}
        │                └─{gmain}
        ├─QQProtect.exe───15*[{QQProtect.exe}]
        ├─TIM.exe───55*[{TIM.exe}]
        ├─accounts-daemon─┬─{gdbus}
        │                 └─{gmain}
        ├─acpid
        ├─at-spi-bus-laun─┬─dbus-daemon
        │                 ├─{dconf worker}
        │                 ├─{gdbus}
        │                 └─{gmain}
        ├─at-spi2-registr─┬─{gdbus}
        │                 └─{gmain}
        ├─bamfdaemon-dbus───bamfdaemon─┬─{gdbus}
        │                              └─{gmain}
        ├─bluetoothd
        ├─cron
        ├─cupsd
        ├─4*[dbus-daemon]
        ├─2*[dbus-launch]
        ├─dconf-service─┬─{gdbus}
        │               └─{gmain}
        ├─dde-control-cen─┬─{QDBusConnection}
        │                 ├─{QThread}
        │                 ├─{QXcbEventReader}
        │                 ├─{Qt bearer threa}
        │                 ├─{dconf worker}
        │                 ├─{disk_cache:0}
        │                 ├─{gdbus}
        │                 └─{gmain}
        ├─dde-file-manage─┬─{QDBusConnection}
        │                 └─{gmain}

其实可以从这个输出中(自己输出看一下整体的结构)看出,系统中的所有的进程的父进程都是 systemd。

如果觉得在终端上显示观看不太方便,可以使用输出重定向将结果输出到文件。

例如 pstree > out.txt 这样就可以在当前目录下查看 out.txt 来观察 pstree 命令的结果。

top

top 命令真的十分的强大,当我们需要查看系统中各个进程的资源占用情况,那么使用这个命令绝对是会让我们欣喜的。

直接在终端输入 ps 命令进入 top 视图(部分输出如下)。

top - 21:09:13 up  3:13,  1 user,  load average: 1.44, 1.60, 1.52
Tasks: 296 total,   2 running, 221 sleeping,   0 stopped,   1 zombie
%Cpu(s):  8.5 us,  5.1 sy,  0.0 ni, 86.1 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
KiB Mem : 16292804 total,  9736652 free,  2827132 used,  3729020 buff/cache
KiB Swap:  8388604 total,  8388604 free,        0 used. 12489240 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                     
14229 huny      20   0 2165636 287516  63520 S  16.3  1.8  15:45.71 TIM.exe                     
13905 huny      20   0 5900760 269560 164456 S  14.0  1.7  16:53.91 netease-cloud-m             
14054 huny      20   0    9380   6732   1980 S  11.6  0.0   9:55.58 wineserver.real             
11470 root      20   0  587440 166508 134444 S   8.5  1.0   7:22.55 Xorg                         
11809 huny      20   0 3468336 103444  76484 S   8.5  0.6   7:10.48 kwin_x11                     
14531 huny      20   0  976664 229780 135208 S   3.9  1.4   9:22.44 chrome                       
15352 huny      20   0 1568616 135040  89420 S   3.9  0.8   5:47.90 Typora                     16832 huny      20   0 1849376 175768  82316 S   3.9  1.1   3:34.45 Typora                       
22383 huny      20   0   46812   3876   3180 R   0.8  0.0   0:01.00 top                       
    1 root      20   0  204896   7168   5208 S   0.0  0.0   0:02.95 systemd                     
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.03 kthreadd                 
    4 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 kworker/0:0H        
    6 root       0 -20       0      0      0 I   0.0  0.0   0:00.00 mm_percpu_wq                 
    7 root      20   0       0      0      0 S   0.0  0.0   0:00.45 ksoftirqd/0                
    8 root      20   0       0      0      0 I   0.0  0.0   0:22.53 rcu_sched                   

第一行

系统的一些基本信息

  • 21:09:13:当前系统时间
  • 3:13:系统已经开机 3 小时 13 分钟了
  • 1 user:当前只有一个用户登录
  • load average:后面三个数分别是 1 分钟、5 分钟、15 分钟的负载情况。
  • load average 数据是每隔 5 秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。

第二行

系统的进程信息

  • total 表示总共的进程数
  • running 表示处于运行中的进程数
  • sleep 标识休眠中的进程数,stopped 是已经停止了的进程
  • zombie 是僵尸进程(父进程已经退出,而该进程 dead 之后没有进程接受)的数目。

第三行

cpu 的状态信息

  • us:用户空间占用 CPU 的百分比
  • sy:内核空间占用 CPU 的百分比。
  • ni:改变过优先级的进程占用 CPU 的百分比
  • id:空闲 CPU 百分比
  • wa:IO 等待占用 CPU 的百分比
  • hi:硬中断(Hardware IRQ)占用 CPU 的百分比
  • si:软中断(Software Interrupts)占用 CPU 的百分比

什么是硬中断/软中断?

硬中断

由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。

软中断

为了满足实时系统的要求,中断处理应该是越快越好。linux 为了实现这个特点,当中断发生的时候,硬中断处理那些短时间

就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。

这里的 CPU 的使用比率貌似和 windows 概念不同,涉及到用户态和系统态,有空去了解了解。

第四行

内存的相关信息

  • total:物理内存总量
  • used:使用中的内存总量
  • free:空闲内存总量
  • buffers:缓存的内存量

第五行

交换分区的信息

  • total:交换区总量
  • used:使用的交换区总量
  • free:空闲交换区总量
  • cached:缓冲的交换区总量

这里需要注意的一点是:

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到 free 中去,因此在 Linux 上 free 内存会越来越少,但不用为此担心。

如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的 free + 第四行的 buffers + 第五行的 cached。

对于内存监控,在 top 里我们要时刻监控第五行 swap 交换分区的 used,如果这个数值在不断的变化,说明内核在不断进行内存和 swap 的数据交换,这是真正的内存不够用了。

然后下面的各行就是个进程的状态信息

其中:

USER:进程所有者

PR:进程优先级

NI:nice 值(-20----19)越大表示优先级越低。

S:进程状态

COMMAND:进程名称(命令/命令行)

切换观察模式

如果是多 cpu 的电脑,那么上面的 cpu 显示的是综合的 cpu 的信息,如果想要看单独的某个 cpu 的信息,可以在当前按 1 切换模式

当然除此之外还有其他的模式可以选择,详情请参考:Linux top 命令的用法详细详解

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...