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格式显示 |
-f | ASCII码形式显示进程关系 |
显示内容控制
参数 | 含义 |
---|---|
-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
键即可。
在命令执行后,会不断刷新信息,默认按%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
如有错误或者疏漏欢迎指出,互相学习。
注:未经同意,不得转载!