当前位置: 首页 > article >正文

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

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 -ef
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0  2023 ?        00:37:55 /usr/lib/systemd/systemd --switched-root --system --deserialize 18
root           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 toadb
senllang 1463947       1 99 Sep02 pts/19   46-21:21:45 ./toadb-0-01 -M 2
senllang 2481379  147895  0 09:03 pts/17   00:00:00 ./tools/tbench/toadbench 1 63
senllang 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 grep
senllang 1463947       1 99 Sep02 pts/19   46-21:21:45 ./toadb-0-01 -M 2
senllang 2481379  147895  0 09:03 pts/17   00:00:00 ./tools/tbench/toadbench 1 63

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

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键即可。

在命令执行后,会不断刷新信息,默认按%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 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
如有错误或者疏漏欢迎指出,互相学习。

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


http://www.kler.cn/news/323823.html

相关文章:

  • Java: 数据类型与变量和运算符
  • 网络管理:网络故障排查指南
  • 目前相对稳定的下载上传的方法(WebClient )(异步与进度)
  • MacOS Sequoia安装geant4.10.07
  • 20_BERT微调训练
  • 探索Python网络世界的利器:Requests-HTML库
  • Python自学查漏9.28
  • Spark 中 任务集 TaskSet 详解
  • 探索私有化聊天软件:即时通讯与音视频技术的结合
  • RSpec简析及应用案例
  • leetcode刷题day32|动态规划Part01(509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯)
  • uni-app进行微信小程序开发,快速上手
  • STM32 F1移植FATFS文件系统 USMART组件测试相关函数功能
  • 二、初步编写drf API
  • 太速科技-389-基于KU5P的双路100G光纤网络加速计算卡
  • linux系统的常用命令
  • 【系统规划与管理师】【案例分析】【考点】【答案篇】第10章 团队建设与管理
  • docker相关命令
  • 基于单片机的精确电压表DA-AD转换
  • 【笔记】神领物流day1.1.13前后端部署【未完】
  • JVM、JRE、JDK关系。HotSpot。JVM规范
  • 【R语言】fs 工具功能速查
  • 【项目经验分享】深度学习点云算法毕业设计项目案例定制
  • 【JavaEE】——内存可见性问题
  • 支付宝远程收款api之小荷包跳转码
  • 画两个数的平方和的曲线
  • ECharts图表图例3
  • 【记录】Excel|不允许的操作:合并或隐藏单元格出现的问题列表及解决方案
  • el-table给列加单位,表头加样式,加斑马纹
  • 【YashanDB知识库】如何dump数据文件,转换rowid, 查询对应内容