0


【linux 多进程并发】linux下使用常见命令,来解析进程家族体系脉络

0101 Linux进程

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

文章目录

一、概述


在多任务并发编程中,进程是一个非常重要的概念,在应用程序运行时,都是以进程的方式启动,再展开为多进程或多线程的架构。

涉及到系统编程,每个操作系统平台实现存在差异,这里以linux操作系统为例。

在Linux操作系统中,进程是程序的一个实例化(也就是运行起来后),是系统进行资源分配和调度的基本单位。

每个进程是独立的占有资源,会被分配独立的内存空间,CPU核,文件描述符等。

进程之间通过进程间通信(IPC)机制进行通信和同步,当然这里是与线程有区别。

多进程编程就是在同一程序中创建并运行多个进程,以实现并发处理。

本节就来总体介绍一下linux下的进程相关知识,后续会对每个点进行详细介绍。

二、进程家族


在linux操作系统中,所有进程之间都存在继承关系,可以说是一个大家族。

在这里插入图片描述

在操作系统启动时,创建PID为0的idle进程,它是进程家族的祖先。

之后又会创建两个进程:

  • systemd,用户进程祖先,最新的linux系统采用systemd,而之前版本会用init,它的PID为1;
  • kthreadd, 内核进程的祖先,kthreadd,也就是kernal thread deamon的缩写,它的PID为2;

对于用户应用程序,启动时它的父进程的PID一般就是1,有些没有认领的僵尸进程,也会被1号进程接管。
而内核进程启动时,它都是从2号进程继承下来。

三、进程的查看方法


在Linux操作系统运行时,实际上已经有很多服务在运行,每个服务会有一个或多个进程,我们可以通过系统自带的命令进行查看。

这里简要介绍最常用的三个命令:

3.1

ps

命令

ps

命令是最常用的查看进程的命令,支持BSD,Unix,GUN三种风格的参数输入,下面以Unix格式为主进行介绍。

常用的几个参数介绍如下:

控制显示格式
参数含义

-j

使用job格式显示

-f

ASCII码形式显示进程关系
显示内容控制
参数含义

-e

在命令后面显示环境变量信息

-H

显示进程关系图

-T

显示线程信息,增加SPID列来显示线程ID
演示

  • 查看所有进程信息, 带 -ef 参数;
[senllang@hatch src]$ ps -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1002023 ?        00:37:55 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root           2002023 ?        00:00:32 [kthreadd]
root           3202023 ?        00:00:00 [rcu_gp]
root           4202023 ?        00:00:00 [rcu_par_gp]
root           5202023 ?        00:00:00 [slub_flushwq]
root           7202023 ?        00:00:00 [kworker/0:0H-events_highpri]
root          10202023 ?        00:00:00 [mm_percpu_wq]

列出当前系统中的所有进程信息,默认以PID列进行了排序,内容非常多。

可以看到前面介绍的进程1 systemd和进程2 kthreadd,之后的进程都是以这两个进程为父进程。

  • 带过滤条件查看
[senllang@hatch src]$ ps -ef|grep toadb
senllang 1463947199 Sep02 pts/19   46-21:21:45 ./toadb-0-01 -M 2
senllang 24813791478950 09:03 pts/17   00:00:00 ./tools/tbench/toadbench 163
senllang 248153841294380 09:04 pts/7    00:00:00 grep --color=auto toadb

大多数时候,我们不需要这么多的内容,可以使用

grep

进行信息的过滤,带上自己信息的关键字。

但是列表中,会多出一行grep进程的信息,一般再对它进行取反过滤

grep -v grep

[senllang@hatch src]$ ps -ef|grep toadb |grep -v grep
senllang 1463947199 Sep02 pts/19   46-21:21:45 ./toadb-0-01 -M 2
senllang 24813791478950 09:03 pts/17   00:00:00 ./tools/tbench/toadbench 163

这样就不会有多余的信息。

3.2

top

命令

top

命令常用于查看进程占用资源的信息,比如CPU占用率,内存的占用率;

当然也可以进行实时观察进程状态的变化。

惯常用法就很简单,直接执行就可以。

[senllang@hatch src]$ top

Tasks: 666 total,   1 running, 659 sleeping,   3 stopped,   2 zombie
%Cpu(s):  5.7 us, 13.0 sy,  0.0 ni, 79.3 id,  0.0 wa,  0.0 hi,  1.9 si,  0.0 st
MiB Mem :  31672.7 total,   6838.9 free,  13261.2 used,  11572.6 buff/cache
MiB Swap:   1020.0 total,      0.0 free,   1020.0 used.  16038.6 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
1463947 senllang  20   0 1875124   1.1g   1644 S 193.8   3.5  70139:19 toadb-0-01
2717739 senllang  20   0   55036   5036   3580 R   6.2   0.0   0:00.01 top
      1 root      20   0  251316  11140   4696 S   0.0   0.0  37:55.49 systemd
      2 root      20   0       0      0      0 S   0.0   0.0   0:32.56 kthreadd
      3 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_gp
      4 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 rcu_par_gp
      5 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 slub_flushwq
      7 root       0 -20       0      0      0 I   0.0   0.0   0:00.00 kworker/0:0H-events_highpri
     10 root       0 -20       0      0      0 I   0.0   0.0   0:00.01 mm_percpu_wq
     11 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_rude_
     12 root      20   0       0      0      0 S   0.0   0.0   0:00.00 rcu_tasks_trace
     13 root      20   0       0      0      0 S   0.0   0.0   7:51.90 ksoftirqd/0
     14 root      20   0       0      0      0 I   0.0   0.0  83:02.09 rcu_sched
     15 root      rt   0       0      0      0 S   0.0   0.0   0:15.83 migration/0
     16 root      rt   0       0      0      0 S   0.0   0.0   0:07.44 watchdog/0
     17 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/0
     18 root      20   0       0      0      0 S   0.0   0.0   0:00.00 cpuhp/1
     19 root      rt   0       0      0      0 S   0.0   0.0   0:16.97 watchdog/1

退出时,按

q

键即可。

在命令执行后,会不断刷新信息,默认按

%CPU

CPU占用率列进行排序,

顶部显示概要信息,总的任务数,CPU总体使用情况,内存总体占用;下半部分详细列出各进程的使用情况。

在命令运行界面,只能通过键盘进行控制,

h

键是帮助信息。

3.3

kill

命令

kill

命令用于给指定进程传递信号或一些值;常用的就是给进程传递 SIGKILL(9),强制结束进程。

我们先来后台启动一个top进程

[senllang@hatch src]$ top &
[1] 2726248
```shel

查看top进程的PID,然后使用kill命令给进程PID=2726248发送SIGKILL信号;

```shel
[senllang@hatch src]$ ps -ef|grep top |grep -v grep
zpzhao    609215  457332  0  2023 ?        00:26:31 /usr/libexec/xdg-desktop-portal
zpzhao    609229  457332  0  2023 ?        08:04:39 /usr/libexec/xdg-desktop-portal-gtk
root     1343614 1339665  0  2023 ?        00:03:28 /usr/libexec/xdg-desktop-portal
root     1343648 1339665  0  2023 ?        00:00:03 /usr/libexec/xdg-desktop-portal-gtk
senllang 2726248 2708534  0 11:13 pts/8    00:00:00 top

[senllang@hatch src]$ kill -9 2726248

再次查看时,系统提示已经被kill掉了。

[senllang@hatch src]$ ps -ef|grep top |grep -v grep
zpzhao    609215  457332  0  2023 ?        00:26:31 /usr/libexec/xdg-desktop-portal
zpzhao    609229  457332  0  2023 ?        08:04:39 /usr/libexec/xdg-desktop-portal-gtk
root     1343614 1339665  0  2023 ?        00:03:28 /usr/libexec/xdg-desktop-portal
root     1343648 1339665  0  2023 ?        00:00:03 /usr/libexec/xdg-desktop-portal-gtk
[1]+  Killed                  top

这里的信号,可以用数字,也可以用信号的名称,下面列出了信号的定义。

      Signal     Value     Action   Comment
    ──────────────────────────────────────────────────────────────────────
       SIGHUP        1       Term    Hangup detected on controlling terminal
                                     or death of controlling process
       SIGINT        2       Term    Interrupt from keyboard
       SIGQUIT       3       Core    Quit from keyboard
       SIGILL        4       Core    Illegal Instruction
       SIGABRT       6       Core    Abort signal from abort(3)
       SIGFPE        8       Core    Floating-point exception
       SIGKILL       9       Term    Kill signal
       SIGSEGV      11       Core    Invalid memory reference
       SIGPIPE      13       Term    Broken pipe: write to pipe with no
                                     readers; see pipe(7)
       SIGALRM      14       Term    Timer signal from alarm(2)
       SIGTERM      15       Term    Termination signal
       SIGUSR1   30,10,16    Term    User-defined signal 1
       SIGUSR2   31,12,17    Term    User-defined signal 2
       SIGCHLD   20,17,18    Ign     Child stopped or terminated
       SIGCONT   19,18,25    Cont    Continue if stopped
       SIGSTOP   17,19,23    Stop    Stop process
       SIGTSTP   18,20,24    Stop    Stop typed at terminal
       SIGTTIN   21,21,26    Stop    Terminal input for background process
       SIGTTOU   22,22,27    Stop    Terminal output for background process

四、总结


本文介绍了Linux系统平台下进程的相关概念,在Linux下所有进程是有继承关系的,最初的1号和2号进程分别是用户进程和内核进程的祖先,通过

ps

,

top

,

kill

三个常用的命令,就可以查看进程信息,资源占用情况,以及结束进程。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

标签: linux 服务器 c语言

本文转载自: https://blog.csdn.net/senllang/article/details/142589393
版权归原作者 韩楚风 所有, 如有侵权,请联系我们删除。

“【linux 多进程并发】linux下使用常见命令,来解析进程家族体系脉络”的评论:

还没有评论