12、进程管理
00 分钟
2024-6-25
Created
Jun 20, 2024 12:40 AM
Tags
进程管理
一、进程的定义及相关概念
进程
是已启动的可执行程序的运行实例。
相关概念:已分配内存的地址空间、进程ID、程序代码、进程状态。# 查看进程命令:ps -aux
—·—————————————————————————
一个进程的生命周期
process —(fork)—→ child process —(execute)—↓
process ←…/…zombie……←—(exit)— child process
·父进程复制自己的地址空间(fork)创建一个新的子进程结构;
·每个新进程分配一个唯一的进程ID(PID);
·进程ID(PID)和父进程ID(PPID)是子进程环境的元素,任何进程都可创建子进程;
·所有进程都是第一个系统进程的后代;
·在CentOS5、CentOS6版本中PID为1的进程是init;
·在CentOS7版本中PID为1的进程是systemd
———————————————————————————
进程管理
包括进程调度、中断处理、信号、进程优先级、进程切换、进程状态、进程内存等。
僵尸进程
当某子进程比父进程先结束,父进程既没有收回子进程,也没有释放其占用的资源,此时子进程将成为一个僵尸进程;如果父进程先退出,子进程被init(或systemd)接管,子进程退出后init(或systemd)会回收其占用的相关资源。
·僵尸进程不执行代码但是占用内存地址空间;
·在某进程执行完所有代码后,将发送相关终止报告至其父进程;
·正常情况下,父进程会移除所有子进程的数据结构;
·当一个进程接收到终止信号时,其结束之前需一段时间来结束所有任务;
·通常情况,进程会在某极短时刻变为僵尸进程(发送信号后、父进程收回前);
·kill命令不能杀死僵尸进程,可通过杀死僵尸进程的父进程将其去除,不100%有效;
·kill命令是让系统以命令的形式给进程发送信号,默认为结束进程;
·父进程是init/systemd的僵尸进程需通过重启系统来释放其占用资源。
线程
线程是进程中产生的一个执行单元,在同一个进程中与其他线程并行运行。线程之间可共享资源,如内存、地址空间、打开文件等。
上下文切换
实际处理器运行过程中,先存储运行进程的上下文,之后将下一个要运行的上下文恢复到寄存器,此过程称之为上下文切换。如果进程是运行过的,会接着恢复上次的内容继续运行。
# 处理器执行期间,运行进程的信息被储存在处理器的寄存器和高速缓存中。上下文即是正在执行的进程加载到寄存器的数据。
!通常不能有太多的上下文切换,因为处理器每次均要刷新寄存器和高速缓存,以便释放空间给新进程,可能导致性能下降。
中断处理
优先级最高的任务之一,必须从当前执行的进程切换到新进程。
通常由I/O产生,比如网络接口、键盘、磁盘控制器等。
当中断信号到达内核时,内核必须从当前执行的进程切换到一个新的进程,以便处理这个中断。这就意味着中断会导致上下文切换,也就是说大量中断会导致性能下降。
# linux中通常有两类型的中断:
(1)硬中断:由硬件产生的,需要快速响应(e.g. 鼠标中断)
(2)软中断:被用来处理可以推迟的任务(e.g. TCP/IP协议操作)
进程的属性
·PID # 进程ID,唯一的数值
·PPID # 父进程的ID
·UID # 进程的用户ID
·GID # 进程的所归属组ID
·进程的状态(STAT) # 可分为运行R、休眠S、僵尸Z
·进程执行的优先级
·进程所连接的终端名称
·进程资源占用百分比
—————————————注—————————————
· Linux 进程的 5 种基本状态
① R 表明该程序目前正在运作,或者是可被运作
② S 表明该程序目前正在睡眠当中,但可被某些讯号(signal) 唤醒
③ T 表明该程序目前正在侦测或者是停止了 # Ctrl+z
④ Z 表明该程序应该已终止,但未被其父程序正常终止,僵尸状态
⑤ D 表明该程序为不可中断状态,通常存在于 I/O 情况下
# 5 个基本状态后,还可以加一些标识,e.g. Ss、R+
·额外标识具体含义
< 表示进程运行在高优先级上
N 表示进程运行在低优先级上
L 表示进程有页面锁定在内存中 # 物理内存
s 表示进程是控制进程
l 表示进程是多线程的
+ 表示当前进程运行在前台
———————————————————————————
二、查询进程相关指标的命令
(一)ps命令查看进程工具
1.1常用的参数:-aux
[root@localhost ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
选项:-a 显示与当前终端关联的所有进程
-u 显示的进程以不同用户来区分
  • x 显示所有进程(不以终端来区分)
·每列分别对应的含义↓
第一列 USER 启动进程的用户
第二列 PID 进程的ID,进程号
第三列 %CPU 进程占用的CPU百分比
第四列 %MEM 进程占用的内存百分比
第五列 VSZ 进程占用的虚拟内存大小(单位KB)
第六列 RSS 进程占用的物理内存大小(单位KB)
第七列 TTY 进程对应的终端
第八列 STAT 进程目前的状态
第九列 START 进程触发启动的时间
第十列 TIME 进程实际使用CPU的时间
第十一列 COMMAND 进程的实际指令
# 用[]括起的进程为内核态的进程,没有括起的进程为用户态进程。
1.2 常用的参数:-ef # 可以显示PPID
[root@localhost ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
选项:-e 显示所有进程
  • f 显示完整格式输出
·每列分别对应的含义↓
第一列 UID 启动进程的用户
第二列 PID 进程的ID
第三列 PPID 父进程的ID
第四列 C 进程生命周期中的CPU利用率
第五列 STIME 进程启动时的系统时间
第六列 TTY 进程运行对应的终端
# 显示?表示与终端无关,这种进程一般是内核态进程;tty1-tty6是本机上的登入者程序,pts/0等表示运行在虚拟终端上的进程。
第七列 TIME 进程运行累计占用CPU的时间
第八列 CMD 启动的程序名称
—·拓展———————————————————————
·查看CPU信息的方法 → ① cat /etc/proc/cpuinfo;② lscpu命令
———————————————————————————
(二)free命令查看内存使用情况
[root@localhost ~]# free -h
total used free shared buff/cache available
Mem: 972M 126M 694M 7.6M 151M 679M
Swap: 2.0G 0B 2.0G
选项:-h 以适合的单位显示
-m/g/.. 以特定单位显示,free默认单位为KB
·各项分别对应的含义↓
total 系统的物理内存总量
used 系统已使用的内存量
free 系统空闲的内存
share 多个进程共享的内存量
buff/cache 用来缓冲和缓存的空间,内核会在内存将要耗尽时释放这部分内存给其他进程使用
# buffers 缓冲内存数;cached 缓存内存数
available 可使用空间,评估有多少内存可用于启动新应用程序
# available字段考虑了页缓存,而不是所有可回收的内存。这使得通常free与buff/cache相加的数值大于available的数值。
swap 虚拟内存(硬盘上的交换分区)
# 若发现swap一直被大量使用,说明物理内存不足,需考虑是否添加物理内存或是否调整swap的使用比例。
—·拓展———————————————————————
·缓冲(buffer)、缓存(cache)与内存(RAM)
缓冲技术是为了协调IO和CPU之间的速度不一致而存在的一种设计,以减少CPU中断次数,提高程序效率;缓存技术则是通过将CPU最为频繁访问的数据保存在特定区域,并具有优先被访问权,这样提高CPU对数据的获取效率来提高程序运行效率;缓冲区和内存缓存区都属于内存的一部分,但是在底层设计上,缓存一般具有比普通内存更快的访问速度。
·页缓存(page cache)
为了避免每次读写文件时,都需要对硬盘进行读写操作,Linux 内核使用页缓存(Page Cache)机制来对文件中的数据进行缓存。Linux 内核会以页大小(4KB)为单位,将文件划分为多数据块。当用户对文件中的某个数据块进行读写操作时,内核首先会申请一个内存页(称为页缓存)与文件中的数据块进行绑定。用户对文件进行读写时,实际上是对文件的页缓存进行读写。
———————————————————————————
(三)uptime命令查看系统负载
[root@localhost ~]# uptime
00:36:14 up 1:13, 2 users, load average: 0.00, 0.01, 0.05
·各项分别对应的含义↓
00:36:14
up 1:13
2 users
load average:
0.00, 0.01, 0.05
当前时间
系统连续运行时间
当前登录用户数
系统负载,即任务队列的平均长度
1min、5min、15min前到现在的平均值
—·Q&A———————————————————————
- Q:找出CPU负载过高的服务器?
·服务器1 → load average:0.15、0.08、0.01 1核
·服务器2 → load average:4.15、6.08、6.01 1核
  • A:服务器2负载过高。
服务器CPU核心数为1时,load average≥3负载过高;换言之,若服务器CPU核心数为4,load average≥12则CPU负载过高。经验总结,单核心1分钟的系统平均负载不要超过3。
———————————————————————————
(四)top命令动态管理进程
top命令弹出信息如下:
notion image
·第一行内容显示系统负载。同uptime命令结果;
00:36:14 up 1:13, 2 users, load average: 0.00, 0.01, 0.05
·第二、第三行显示进程与CPU信息
Tasks:100 total,1 running,99 sleeping,0 stopped, 0 zombie
%CPU(s):0.3 us,0.7 sy,0.0 ni,99.0 id,0.0 wa,0.0 hi,0.0 si,0.0 st
具体各项含义内容如下↓
Tasks:100 total
进程总数
1 running
正在运行的进程数
99 sleeping
睡眠的进程数
0 stopped
停止的进程数
0 zombie
僵尸进程数
%CPU(s):0.3 us
系统用户进程使用CPU百分比
0.7 sy
内核进程占用CPU百分比
0.0 ni
用户进程空间内改变过优先级的进程占用CPU百分比
99.0 id
空闲CPU百分比
0.0 wa
CPU等待I/O完成的时间总量
0.0 hi
硬中断占用CPU百分比
0.0 si
软中断占用CPU百分比
0.0 st
虚拟机偷取物理CPU的时间
·第四、第五行显示内存信息
KiB Mem:995896 total,710028 free,129580 used,156288 buff/cache
KiB Swap:2097148 total,2097148 free,0 used. 694976 avail Mem
具体各项含义内容如下↓
KiB Mem:995896 total
物理内存总量
710028 free
空闲内存总量
129580 used
使用内存总量
156288 buff/cache
用作内核缓存的内存量(同free命令结果)
KiB Swap:2097148 total
虚拟内存(交换分区)总量
2097148 free
交换分区空闲量
0 used
交换分区使用量
694976 avail Mem
可使用内存总量
·第六行显示进程信息
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
具体各项含义内容如下↓
PID
进程号
USER
进程所有者的用户名
PR
内核看到的进程优先级,内核动态调整,用户不能修改。 “rt”表示任务正在实时调度优先级下运行。
NI
nice值进程优先级,用户调整。 负值表示高优先级,正值表示低优先级。
VIRT
虚拟内存,是进程正在使用的所有内存。(PS中为VSZ) virtual memory usage的缩写,进程“需要的”内存大小。 申请100m内存,使用10m内存会记录100m至VIRT中。
RES
物理内存,是进程实际使用的内存。(PS中为RSS) resident memory usage的缩写,进程现使用的内存大小。不包括swap,包括其他进程的共享。 申请100m内存,使用10m内存,会记录10m至RES中。
SHR
共享内存。 除了自身进程的共享内存,也可能包括与其他进程的共享内存。通常不是所有内存都留驻。 ***计算某进程所占物理内存大小公式为RES - SHR
S
进程状态。即D、R、S、T、Z。
%CPU
上次更新到现在的CPU时间占用百分比
%MEM
进程使用的物理内存百分比
TIME+
进程总计使用的CPU时间,单位为1/100秒
COMMAND
具体命令名称/命令行
交互快捷键:
s 修改刷新时间,默认3s刷新一次
space 立即刷新
q 退出
P 按照CPU占比排序
M 按照内存占比排序
T 按时间排序
1 显示每个内核的CPU使用率
选项:-p 进程ID,查看某进程状态
  • u/U 指定显示某用户的相关进程
(五)fuser命令 # 根据文件、端口找进程
作用:可以根据文件或端口号找到相应进程
选项:-k 默认为结束进程,也可以执行发送信号(与KILL命令信号不同)
  • i 在结束进程前会交互式确认
  • u 在进程后显示进程所属用户名
  • c 查看有哪些进程访问挂载点下文件
# 在对文件或目录执行fuser命令后会输出相应进程号,如果在进程号后出现“c”表示执行进程用户所在位置在查询目录内;“f”表示文件,通常默认不显示;“r”表示root目录;“e”表示正在运行的可执行文件。
e.g.
例一、列出有哪些进程正在访问/mnt目录,并对应其用户名
fuser -u /mnt/
例二、查看/boot分区有哪些进程在访问文件
fuser -c /boot
例三、查看TCP协议22号端口有哪些进程
fuser 22/tcp
(六)lsof命令 # 可用于根据进程找文件、端口
作用:查看进程打开的文件、进程打开的端口(tcp、udp)
语法:lsof [设备文件名或目录] 查看系统中有关设备的进程信息
选项:-i<条件> 列出符合条件的进程(4、6、协议、:端口、@ip)
  • p<进程号> 列出指定进程号所打开的文件
(七)ss命令
[root@localhost ~]# ss -anpt
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 *:111 *:*
users:(("rpcbind",pid=6448,fd=4),("systemd",pid=1,fd=45))
作用:用于查看套接字(socket)
选项:-a 显示监听和建立连接的套接字
-t 显示TCP套接字
  • u 显示UDP套接字
  • n 以端口号显示(默认显示服务名称)
  • p 显示使用套接字的进程
# fd:文件描述符,内核用于管理已被打开的文件创建的索引,用来指向被打开的文件。
三、进程前后台切换
(一)linux后台进程、前台进程之间的区别
1.1前台进程和依赖终端、后台进程和脱离终端
当某终端中运行的命令在执行过程中持续占用前台,就称之为前台进程。此进程所在的终端就变为它的控制终端,一旦该终端关闭,进程随之消失,即此进程依赖终端
当进程放入后台运行,就称之为后台进程。通常后台进程不会影响所在终端后续命令执行。后台进程中有一类进程叫做守护进程(Daemon),运行在后台但不受终端控制、不需终端交互。这类进程即脱离终端
# linux中大多是服务器是用守护进程实现的。
1.2 进程前后台转换
&
用在命令的最后,可以将此命令移到后台执行
ctrl + z
将一个正在前台执行的命令移到后台并暂停
jobs
作业控制命令,查看当前在后台运行的进程
fg
将后台中的命令调至前台继续运行。 foreground process的缩写。 若后台中有多个命令,可用fg jobnumber调出选中的命令。jobnumber为jobs命令所查后台执行命令的序号(不是 pid)
bg
将某个后台暂停的命令调为继续执行。 background process的缩写。 同上,可用bg jobnumber调出选中的命令。
nohup CMD &
放入后台脱离终端并持续运行
四、进程关闭
(一)kill命令
格式:kill [进程号]
选项:-l 列出所有支持的信号
  • [信号编号] 发送对应编号的信号
信号:1 SIGHUP 重新加载配置
2 SIGINT 键盘中断 ——(Ctrl+c)
3 SIGQUIT 退出
9 SIGKILL 强制终止
15 SIGTERM 正常终止,缺省信号
18 SIGCONT 继续
19 SIGSTOP 停止
20 SIGTSTP 暂停 ——(Ctrl+z)
举例:kill -19 [进程号] 停止进程
kill -9 [进程号] 强制终止进程
(二)killall命令
格式:killall [-选项][信号] [进程名]
选项:-i 交互式问询是否杀死某个进程
举例:killall -i sshd #交互式杀死sshd每一个进程。
(三)pkill命令
格式:pkill [-选项][信号] [进程名]
选项:-t [终端号] 按照终端号踢出用户
举例:pkill -t pts/0 ?
五、进程优先级管理
# 优先级取值范围(-20,19),越小优先级越高,默认为0
(一)nice命令 # 未执行的进程
格式:nice [-选项] [指定值] [执行的进程]
作用:指定程序的运行优先级
选项:-n 指定设置的nice值
举例:nice -n -20 vim /etc/fstab
(二)renice命令 # 已执行的进程
格式:renice [-选项] [指定值] [进程号]
作用:改变程序的运行优先级
选项:-n 指定改变的nice值
举例:renice -n pid
六、screen终端复用工具
常用参数:
screen -S test 新建一个名为test的会话
screen -ls 列出当前所有会话
screen -r test 回到test会话
—·Summary————————————————*****———
·进程概述和ps查看进程工具
·uptime查看系统负载、top动态管理进程
·前后台切换、进程优先级管理、screen终端复用工具
———————————————————————————
上一篇
Linux 基础知识 往期汇总
下一篇
<K8S> vol. 01 - kubernetes 组件