进程管理

进程状态管理命令(静态查看)

# 进程管理
ps

# 语法
ps 选项 参数

# 常用命令
ps -ef
ps aux

# 选项
a:显示所有与终端相关的进程,由终端发起的
u:显示用户导向的用户列表
x:显示所有与终端无关的进程
o:自定义展示
l:显示该进程启动的命令

# ps命令第一行解读
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
USER 该进程的管理用户
PID 进程号
%CPU 该进程占用CPU的百分比
%MEM 该进程占用内存的百分比
VSZ 该进程占用虚拟内存的大小
RSS 该进程占用物理内存的大小
TTY
   ? 由内核发起的进程
   tty 机器上的终端进程
   pts/N 远程链接工具的终端进程
STAT 程序的状态
   D # 无法中断的休眠进程(通IO进程)
   R # 正在运行的状态
   S # 处于休眠状态的进程
   T # 暂停或者被跟踪的状态
   W 进入交换内存的进程(CentOS7见不到)
   X 死掉的进程(少见)
   Z # 僵尸进程
   < 优先级高的进程
   N 优先级低的进程
   L 有些数据页被锁进内存的进程
   s 父进程,在底下有子进程
   l:以线程的方式运行
   |:多进程的
   +:# 该进程运行在前台
START:进程被触发开启的时间
TIME:该进程实际使用CPU的运行时间
COMMAND:命令的名称和参数
        []:内核态的进程(由内核发起的)
        没[]:用户态的进程(由用户发起的)

后台进程

# 后台被暂停的进程
jobs # 查看所有暂停的进程
bg # 让暂停的进程运行起来,后面加数字 bg默认是恢复最后一个(无法用ctrl+c终止)
fg # 把后台暂停的进程,放到前台运行,后面加数字 fg默认是恢复最后一个

top解读(动态查看)

# 第一行
top - 19:27:23 up  2:54,  2 users,  load average: 0.00, 0.01, 0.05
top 命令
19:27:23 当前系统时间
up  2:54 该服务的开启运行时间
2 users 当前登陆的用户数量
load average: 0.04, 0.10, 0.12 系统的平均负载
0.00 1分钟前
0.01 5分钟前
0.05 15分钟前
1分钟的值大于15分钟时,平均负载在提升

# 第二行
Tasks:  96 total,   1 running,  95 sleeping,   0 stopped,   0 zombie
 96 total    当前系统中所有的进程数量
 1 running   当前系统中所有的运行状态的进程数量
 95 sleeping 当前系统中所有的睡眠状态的进程数量
 0 stopped   当前系统中所有的暂停状态的进程数量
 0 zombie    当前系统中所有的僵尸状态的进程数量
 
 # 第三行 cpu的百分比
23 %Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
24 us 用户进程占用的cpu百分比
25 sy 系统进程占用的cpu百分比(通常内核与硬件进行交互)
26 ni 优先级较高的进程占用cpu的百分比
27 id cpu的空闲百分比
28 wa 等待状态的进程占用cpu百分比
29 hi 硬中断占用cpu的百分比 [由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统,系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。]
30 si 软中断占用cpu的百分比 [为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。] 
31 st 虚拟化技术占用cpu的百分比

# 第四行 物理内存
34 KiB Mem : 995896 total, 304136 free, 142004 used, 549756 buff/cache
35 995896 total 总内存数
36 304136 free 空闲内存
37 142004 used 已使用内存
38 549756 buff/cache buffer缓冲区/缓冲区

# 第五行 虚拟内存
42 KiB Swap: 1048572 total, 1048572 free, 0 used. 678784 avail Mem
43 1048572 total 总虚拟内存
1048572 free 空闲虚拟内存
0 used 已使用的虚拟内存
678784 avail Mem 可用的虚拟内存数

PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND 
 PID      进程的id号
 USER     该进程的用户
 PR NI    进程的优先级
 VIRT     虚拟内存占用空间
 RES      物理内存占用空间
 SHR      共享内存占用空间
 S        进程的状态
 %CPU     占用cpu的百分比
 %MEM     占用内存的百分比
 TIME+    运行时间
 COMMAND  进程的运行命令

什么是中断?

中断是系统用来影响硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的终端处理程序来影响设备的请求。

为什么要有中断?

举个栗子:

比如你定了一份外卖,但是不确定外卖什么时候送到,也没有别的方法了解外卖的进度,但是配送人员送外卖是不等人的,到了你这,没人接取的话,直接走人了。所以你只能苦苦的等着,时不时的去门口看看外卖送到没有,而不能做其他的事情。

不过如果在订外卖的时候,你就跟配送员约定好了,让他送到给你打电话,那你就不用苦苦等着了,可以去忙别的事情了,直到电话一响,接到电话,就可以取外卖了。此时打电话就是一个中断的操作。

没接到电话之前,你可以做其他事情,当你接到电话之后(就发生了中断),你才要进行另一个动作取外卖

PS:中断是一个异步的事件处理机制,可以提高操作系统处理并发的能力。

那么中断会带来什么问题?

由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中弄断处理程序就需要尽可能快的运行,如果中弄断本身要做的事情不多,那么处理起来也不会有太大的问题,但是如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间。

特别是,中断处理程序在影响中断时,还会临时关闭中断,这就会导致上一次中断处理完成之前,其他中断都能不能响应,也就是说中断有可能会丢失。

还是以外卖为例:加入你定了2份外卖

一份主食和一份饮料,由2个不同的配送员来配送。这次你不用时时等待着,两份外卖都约定了电话取外卖的方式。那么问题又来了。

当第一份外卖送到时,配送员给你打了个很长的电话,商量发票处理的方式,与此同时,第二个配送员也到了,也想给你打电话,但是会占线,因为电话占线(也就关闭了中断的响应),第二个配送给你打电话打不通,所以,那么很有可能在尝试几次还占线,就走了(丢失了一次中断)

系统的软中断

刚才说了丢失一次中断,如果对于系统来说,每次都只能处理一次中断,那就很刺激了,天天都在丢失中断,用户的请求发过来,没响应,还做个P的运维,回家种地吧...  

事实上,为了解决中断处理程序执行过长的和丢失中断的问题,Linux将中断处理过程分成了两个阶段: 第一阶段:用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关工作 第二阶段:用来延迟处理第一阶段未完成的工作,通常以内核线程的方式运行。

你猜的没错,还是外卖的那个例子:

第一阶段:当你接到第一个配送员电话时,你可以跟他说,你已经知道了,其他事见面再细说,然后就可以挂断电话了。

第二阶段:才是取外卖,然后见面聊发票的处理动作。

如此一来,第一个配送员不会在电话里占用你很长时间,第二个配送员来的时候,照样可以打通电话。

生产例子

当网卡在接收数据包的时候,会通过硬中断的方式通知内核,有新数据到了。这时,内核就应该调用中断处理程序来影响它。对第一阶段来说,既然是快速处理,其实就是把网卡接收到的数据包,先放置内存当中,然后更新一下硬件寄存器的状态(表示数据已经读好了),而第二阶段,被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它发送给应用程序。

言简意赅:

第一阶段:直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行。

第二阶段:由内核触发该请求,也就是我们常说的软中断,特点是延迟执行。

Linux软中断与硬中断小结:

1.Linux中弄断处理程序分为上半部和下半部:

上半部对应硬中断,用来快速处理

下半部对应软中断,用来异步处理上半部未完成的工作

2.Linux中的软中断包括:网络收发,定时,调度等各种类型,可以通过/proc/softirqs来观察中断的运行情况

在企业中,会经常听说一个问题,就是大量的网络小包会导致性能问题,为啥呢?

因为大量的网络小包会导致频繁的硬中断和软中断,所以大量的网络小包传输速度很慢,但如果将所有的网络小包"打包","压缩"一次性传输,是不是会快很多。

就好比,你在某东自营买了100个快递,都是第二天到,如果分100个快递员,给你配送,你一天要接100个电话,老得劲了奥~~~~~~~~ 但是如果,某东只让一个快递员,把你买的100个快递,打包成一个大包裹,派送给你,会不会快很多?小老弟

top命令的使用

# 语法
top 选项 参数

# 选项
-d 指定刷新时间(默认3s)
-p 只查看指定pid的进程
-u 指定相关用户
-b 将top中的内容保存至文件中
-n 指定次数

[root@zls ~]# top -d 1
#查看指定进程的动态信息
[root@zls ~]# top -d 1 -p 10126
[root@zls ~]# top -d 1 -p 10126,1
#查看指定用户的进程
[root@zls ~]# top -d 1 -u apache
#将 2 次 top 信息写入到文件
[root@zls ~]# top -d 1 -b -n 2 > top.txt

# top常见快捷指令
 h 查看帮助
 z 高亮显示
 1 查看所有cpu的负载
 s 设置刷新时间
 b 高亮显示处在正在运行的进程
 M 按内存百分比进行排序输出
 P 按照cpu的百分比进行排序输出
 R 对排序进行反转
 f 自定义显示字段
 k kill掉指定的进程
 w 保存top的环境变量(环境变量保存在.toprc的文件中)
 q 退出


进程的信号管理

当程序运行为进程后,如果希望强行停止就可以使用kill命令对进程发送关闭信号,除了kill还有pkill、killall

定义守护进程的角色

结束用户会话和进程

[root@localhost ~]# kill -l
 1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
 6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
63) SIGRTMAX-1	64) SIGRTMAX

常见信号列表

数字信号 信号别名 作用
1 HUP 挂起信号,往往可以让进程重新配置
2 INT 中断信号 类似ctrl+c
3 QUIT 让进程退出
9 KILL 直接结束进程,不能被进程捕获
15 TERM 进程终止。这是默认信号
18 CONT 被暂停的进程将恢复运行 放在后台运行 (类似bg)
19 STOP 暂停进程
20 TSTP 用户停止请求,类似ctrl+z 把程序放置后台运行