当前位置:首页 » 《关注互联网》 » 正文

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

24 人参与  2024年09月29日 08:40  分类 : 《关注互联网》  评论

点击全文阅读


0101 Linux进程

专栏内容

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

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

文章目录

0101 Linux进程一、概述 二、进程家族 三、进程的查看方法 3.1 `ps` 命令 3.2 `top` 命令 3.3 `kill` 命令 四、总结 结尾

一、概述


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

涉及到系统编程,每个操作系统平台实现存在差异,这里以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格式显示
-fASCII码形式显示进程关系

显示内容控制

参数含义
-e在命令后面显示环境变量信息
-H显示进程关系图
-T显示线程信息,增加SPID列来显示线程ID

演示

查看所有进程信息, 带 -ef 参数;
[senllang@hatch src]$ ps -efUID          PID    PPID  C STIME TTY          TIME CMDroot           1       0  0  2023 ?        00:37:55 /usr/lib/systemd/systemd --switched-root --system --deserialize 18root           2       0  0  2023 ?        00:00:32 [kthreadd]root           3       2  0  2023 ?        00:00:00 [rcu_gp]root           4       2  0  2023 ?        00:00:00 [rcu_par_gp]root           5       2  0  2023 ?        00:00:00 [slub_flushwq]root           7       2  0  2023 ?        00:00:00 [kworker/0:0H-events_highpri]root          10       2  0  2023 ?        00:00:00 [mm_percpu_wq]

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

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

带过滤条件查看
[senllang@hatch src]$ ps -ef|grep toadbsenllang 1463947       1 99 Sep02 pts/19   46-21:21:45 ./toadb-0-01 -M 2senllang 2481379  147895  0 09:03 pts/17   00:00:00 ./tools/tbench/toadbench 1 63senllang 2481538 4129438  0 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 grepsenllang 1463947       1 99 Sep02 pts/19   46-21:21:45 ./toadb-0-01 -M 2senllang 2481379  147895  0 09:03 pts/17   00:00:00 ./tools/tbench/toadbench 1 63

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

3.2 top 命令

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

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

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

[senllang@hatch src]$ topTasks: 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 stMiB Mem :  31672.7 total,   6838.9 free,  13261.2 used,  11572.6 buff/cacheMiB 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+ COMMAND1463947 senllang  20   0 1875124   1.1g   1644 S 193.8   3.5  70139:19 toadb-0-012717739 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键即可。

在命令执行后,会不断刷新信息,默认按%CPUCPU占用率列进行排序,

顶部显示概要信息,总的任务数,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 grepzpzhao    609215  457332  0  2023 ?        00:26:31 /usr/libexec/xdg-desktop-portalzpzhao    609229  457332  0  2023 ?        08:04:39 /usr/libexec/xdg-desktop-portal-gtkroot     1343614 1339665  0  2023 ?        00:03:28 /usr/libexec/xdg-desktop-portalroot     1343648 1339665  0  2023 ?        00:00:03 /usr/libexec/xdg-desktop-portal-gtksenllang 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 grepzpzhao    609215  457332  0  2023 ?        00:26:31 /usr/libexec/xdg-desktop-portalzpzhao    609229  457332  0  2023 ?        08:04:39 /usr/libexec/xdg-desktop-portal-gtkroot     1343614 1339665  0  2023 ?        00:03:28 /usr/libexec/xdg-desktop-portalroot     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
如有错误或者疏漏欢迎指出,互相学习。

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


点击全文阅读


本文链接:http://zhangshiyu.com/post/166024.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1