一、进程的概念
1、什么是进程
比如:开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。
总结一句话就是:当我们运行一个程序,那么我们将运行的程序叫进程。
当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限。
在进程运行的过程中,系统会有各种指标来表示当前运行的状态。
2、程序和进程的区别
(1)程序是数据和指令的集合,是一个静态的概念。比如/bin/ls、/bin/cp等二进制文件。同时程序可以长期存在系统中。
(2)进程是程序运行的过程,是一个动态概念。进程是存在生命周期的概念的,也就是说进程会随着程序的终止而销毁,不会永久存在系统中。
3、进程的生命周期
生命周期就是指一个对象的生老病死。
图1.png当父进程接收到任务调度时,会通过fock派生子进程来处理,那么子进程会继承父进程属性。
(1)子进程在处理任务代码时,父进程会进入等待状态中。
(2)子进程在处理任务代码后,会执行退出,然后唤醒父进程来回收子进程的资源。
(3)如果子进程在处理任务过程中,父进程退出了,子进程没有退出,那么这些子进程就没有父进程来管理了,就变成僵尸进程。
每个进程父进程叫PPID,子进程则叫PID。
二、监控进程状态
程序在运行后,我们需要了解进程的运行状态。查看进程的状态分为 静态 和 动态 两种方式。
1、静态进程
使用ps命令查看当前的进程状态(静态)
(1)ps -aux常用组合
ps -aux常用组合,查看进程用户、PID、占用cpu百分比、占用内存百分比、执行的命令等。
图2.png状态 | 描述 |
---|---|
USER | 启动进程的用户 |
PID | 进程运行的ID号 |
%CPU | 进程占用CPU百分比 |
%MEM | 进程占用内存百分比 |
VSZ | 进程占用虚拟内存大小(单位KB) |
RSS | 进程占用物理内存实际大小(单位KB) |
TTY | 进程是由哪个终端运行启动的tty1、pts/0等 ?表示内核程序与终端无关 |
STAT | 进程运行过程中的状态man ps(/STATE) |
START | 进程的启动时间 |
TIME | 进程占用CPU的总时间(为0表示还没超过秒) |
COMMAND | 程序的运行指令,[方括号]属于内核态的进程。没有[] 的是用户态进程。 |
(2)STAT状态详解
STAT状态的Ss、S< 、S、S+、R、R+、D、T、Z 等等,都是什么意思?
STAT基本状态 | 描述 | STAT状态+符号 | 描述 |
---|---|---|---|
R | 进程运行 | s | 进程是控制进程,Ss进程的领导者,父进程 |
S | 可中断睡眠 | < | 进程运行在高优先级上,S<优先级较高的进程 |
T | 进程被暂停 | N | 进程运行在低优先级上,SN优先级较低的进程 |
D | 不可中断睡眠 | + | 当前进程运行在前台,R+该表示进程在前台运行 |
Z | 僵尸进程 | | | 进程是多线程的,Sl表示进程是以线程方式运行 |
(3)案例
1)ps命令模拟查看 R+ S+ T
- 同一台虚拟机开启两个窗口
- 终端1 输入vim fxtx ,然后停止不输入任何东西,转到终端2
- 终端2 运行ps命令查看状态
[root@oldboy ~]# ps aux | grep fxtx #S表示睡眠模式,+表示前台运行
root 7880 0.0 0.2 151528 5200 pts/1 S+ 15:51 0:00 vim fxtx
root 7897 0.0 0.0 112708 976 pts/0 R+ 16:06 0:00 grep --color=auto fxtx
- 终端1 挂起vim命令,按下:ctrl+z ,回到终端2
- 终端2 再次运行ps命令查看状态
[root@oldboy ~]# ps aux | grep fxtx #T表示停止状态
root 7880 0.0 0.2 151528 5200 pts/1 T 15:51 0:00 vim fxtx
root 7901 0.0 0.0 112708 976 pts/0 S+ 16:16 0:00 grep --color=auto fxtx
2)tar命令模拟查看 D+
- 同一台虚拟机开启两个窗口
- 终端1 输入tar -czf etc.tar.gz /etc/ /usr/ /var/ ,然后转到终端2
- 终端2 运行ps命令查看状态
#使用tar打包文件时,可以通过终端不断查看状态,由S+,R+变为D+
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 4.0 0.0 123680 1332 pts/1 D+ 16:19 0:00 tar -czf etc.tar.gz /etc/ /usr/ /var/
root 7906 0.0 0.0 112708 988 pts/0 R+ 16:19 0:00 grep --color=auto etc.tar.gz
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 16.0 0.0 123812 1332 pts/1 S+ 16:19 0:01 tar -czf etc.tar.gz /etc/ /usr/ /var/
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 16.5 0.0 123812 1548 pts/1 R+ 16:19 0:01 tar -czf etc.tar.gz /etc/ /usr/ /var/
root 7910 0.0 0.0 112708 988 pts/0 R+ 16:19 0:00 grep --color=auto etc.tar.gz
[root@oldboy ~]# ps aux | grep etc.tar.gz
root 7903 15.3 0.0 123812 1548 pts/1 S+ 16:19 0:01 tar -czf etc.tar.gz /etc/ /usr/ /var/
root 7912 0.0 0.0 112708 988 pts/0 R+ 16:19 0:00 grep --color=auto etc.tar.gz
2、动态进程
(1)top命令
使用top命令查看当前的进程状态(动态)
top命令可以模拟查看 R S
图4.png
#Tasks: 92 total 当前进程的总数
#3 running 正在运行的进程数
#89 sleeping 睡眠的进程数
#0 stopped 停止的进程数 挂起
#0 zombie 僵尸进程数
#%Cpu(s): 0.0 us 系统用户进程使用CPU百分比
#0.3 sy 内核中的进程占用CPU百分比,通常内核是于硬件进行交互
#0.0 ni 优先级的进程占用cpu的百分比
#99.7 id 空闲CPU的百分比
#0.0 wa CPU等待IO完成的时间
#0.0 hi 硬中断,占的CPU百分比
#0.0 si 软中断,占的CPU百分比
#0.0 st 虚拟机占用物理CPU的时间
(2)中断
1)什么是中断
中断是系统用来响应硬件设备请求的一种机制,它会打断进程的正常调度和执行,然后调用内核中的中断处理程序来响应设备的请求。
2)为什么要有中断
中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力。
3)中断带来的问题
由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行。如果中断本身要做的事情不多,那么处理起来也不会有太大问题;但如果中断要处理的事情很多,中断服务程序就有可能要运行很长时间。特别是,中断处理程序在响应中断时,还会临时关闭中断。这就会导致上一次中断处理完成之前,其他中断都不能响应,也就是说中断有可能会丢失。
4)系统中的软中断
事实上,为了解决中断处理程序执行过长和中断丢失的问题,Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部:
- 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理跟硬件紧密相关工作。
- 下半部用来延迟处理上半部未完成的工作,通常以内核线程的方式运行。
5)Linux软中断与硬中断小结
Linux 中的中断处理程序分为上半部和下半部:
- 上半部对应硬件中断,用来快速处理中断。
- 下半部对应软中断,用来异步处理上半部未完成的工作。
Linux 中的软中断包括网络收发、定时、调度、等各种类型,可以通过查看 /proc/softirqs 来观察软中断的运行情况。
(3)top 常见指令
字母 | 含义 |
---|---|
h | 查看帮助 |
1 | 数字1,显示所有CPU核心的负载 |
z | 以高亮显示数据 |
b | 高亮显示处于R状态的进程 |
M | 按内存使用百分比排序输出 |
P | 按CPU使用百分比排序输出 |
q | 退出top |