目录
程序
—— 没有运行的代码就是程序
进程
进程是程序的副本,是被载入内存的一个指令集合,运行起来的代码就是进程
进程的五大性能
—— 内存 :free 、top (查看内存的命令)
—— cpu :top 、ps 和 aux 为单个进程
—— 磁盘大小:大小为 lsblk 、剩余为 df
—— 读写性能:读写为 iostat (dd 为写入) 、vmstat 输出
—— 网络:dmstat 、iftop 需要安装依赖包(yum install epel-release.noarch -y)
进程具有的特征
动态性、并发性、独立性、结构性
进程与线程的区别
—— 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
—— 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
—— 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见
—— 调度和切换:线程上下文切换比进程上下文切换要快得多
例题1
—— 如何确定一个程序是多线程还是单线程
grep -i threads /proc/进程的 PID /status
prtstat 进程 PID 号
僵尸进程
—— 当子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程,如果父进程先退出 ,子进程被init接管,子进程退出后init会回收其占用的相关资源,子进程已经结束了,父进程没有意识到
实验举例
—— 上一步将会导致虚拟机卡住,利用 Xshell 开启另一个窗口进行后续操作 ——
—— 此时切换回上一个窗口,显示结果 ——
进程使用内存的问题
内存泄漏 Memory Leak
—— 指程序中用 malloc 或 new 申请了一块内存,但是没有用 free 或 delete 将内存释放,导致这块内存一直处于占用状态
内存溢出 Memory Overflow
—— 指数据溢出,例:程序申请了 10M 的空间,但是在这个空间写入 10M 以上字节的数据
内存不足 OOM
—— OOM 即 Out Of Memory ,内存用完了
进程状态
进程的基本状态
—— 创建状态
进程在创建时需要申请一个空白 PCB(process control block 进程控制块),向其中填写控制和管理进程的信息,完成资源分配,如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
—— 就绪状态
进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
—— 执行状态
进程处于就绪状态被调度后,进程进入执行状态
—— 阻塞状态
正在执行的进程由于某些事件( I/O 请求,申请缓存区失败)而暂时无法运行,进程受到阻塞,在满足请求时进入就绪状态等待系统调用
—— 终止状态
进程结束,或出现错误,或被系统终止,进入终止状态,无法再执行
进程更多的状态
—— 运行态:running
—— 就绪态:ready
—— 睡眠态
可中断:interruptable
不可中断:uninterruptable
—— 停止态
stopped,暂停于内存,但不会被调度,除非手动启动
—— 僵死态
zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态 的子进程
进程的通讯
pipe :管道,单向传输
socket :套接字文件,双工通信
Memory-maped file :文件映射,将文件中的一段数据映射到物理内存,多个进程共享这片内存
shm shared memory :共享内存
signal :信号
Lock :对资源上锁,如果资源已被某进程锁住,则其它进程想修改甚至读取这些资源,都将被阻塞,直到锁被打开
semaphore :信号量,一种计数器
进程分类
操作系统分类
协助式多任务、抢占式多任务
进程类型
守护进程:daemon ,在系统引导过程中启动的进程和终端无关进程
前台进程:跟终端相关,通过终端启动的进程
按照进程资源使用的分类
CPU-Bound :CPU 密集型、非交互
IO-Bound :IO 密集型、交互
进程管理相关命令
系统中可识别的信号 kill
—— 可通过 kill -l 查看
—— 常用信号
代号 | 名称 | 解释 |
---|---|---|
1 | SIGHUP | 该信号让进程立即关闭.然后重新读取配置文件之后重启 |
2 | SIGINT | 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键 |
3 | SIGQUIT | 退出 |
8 | SIGFPE | 在发生致命的算术运算错误时发出,不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误 |
9 | SIGKILL | 用来立即结束程序的运行,本信号不能被阻塞、处理和忽略。般用于强制中止进程 |
14 | SIGALRM | 时钟定时信号,计算的是实际的时间或时钟时间,alarm 函数使用该信号 |
15 | SIGTERM | 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9 |
18 | SIGCONT | 该信号可以让暂停的进程恢复执行,本信号不能被阻断 |
19 | SIGSTOP | 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键,本信号不能被阻断 |
killall 命令
killall 选项 进程名
-i :交互式,询问是否要杀掉某个进程
-l :忽略进程名的大小写
ps 命令
—— ps -l :查看当前登录产生了哪些进程
—— ps -aux :静态显示当前主机所有的进程
a :显示所有终端上的进程
u :列出进程的所属用户
x :显示终端进程的信息
列表组成 | 注释 |
---|---|
USER | 进程属于哪个用户 |
PID | 进程号;程序的进程号是唯一的 |
%CPU | 进程占用 CPU 的百分比,占用的百分比越高,进程越耗费资源 |
%MEM | 进程占用物理内存的百分比,占用的百分比越高,进程越耗费资源 |
VSZ | 该进程占用虚拟内存的大小,单位 KB |
RSS | 该进程占用实际物理内存的大小,单位 KB |
TTY | 从哪个终端运行的,不是从终端运行的都显示 ? |
STAT | 进程的状态信息 |
START | 该进程的启动时间 |
TIME | 该进程占用 CPU 的运算时间,并不是系统时间 |
COMMAND | 该进程的启动命令 |
——STAT 的常见状态信息 ——
常见状态代号 | 注释 |
---|---|
D | 不可被唤醒的睡眠状态,通常用于 I/O 情况 |
R | 正在运行 |
S | 处于休眠状态,但是可以被唤醒 |
T | 停止状态或者调试状态 |
Z | 僵尸进程 |
< | 高优先级 |
N | 低优先级 |
L | 被锁入内存里 |
W | 内存交互状态(从 2.6 内核开始无效) |
s | 包含子进程 |
l | 多线程 |
+ | 位于后台 |
—— ps -elf :查看静态的进程统计信息
e :显示系统内的所有进程信息
l :使用长格式显示进程信息
f :使用完整的格式显示进程信息
列表组成 | 注释 |
---|---|
F | 内核分配给进程的系统标记 |
S | 进程的状态 |
UID | 启动这些进程的用户 |
PID | 进程的进程 ID ,每个进程都有一个唯一的 PID |
PPID | 父进程的进程号(如果该进程是由另—个进程启动的) |
C | 进程生命周期中的CPU利用率 |
PRI | 进程的优先级(越大的数字代表越低的优先级) |
NI | 谦让度值用来参与决定优先级 |
ADDR | 进程的内存地址 |
SZ | 假如进程被换出,所需交换空间的大致大小 |
WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
STIME | 进程启动时的系统时间 |
TTY | 进程启动时的终端设备 |
TIME | 运行进程需要的累计 CPU 时间 |
CMD | 进程的启动命令 |
ps -elf|head :查看进程的优先级
进程的优先级
—— 在 Linux 系统中,表示进程优先级的有两个参数:Priority 和 Nice 其中,PRI 代表 Priority ,NI 代表 Nice ,这两个值都表示优先级,数值越小代表该进程越优先被 CPU 处理,不过,PRI 值是由内核动态调整的,用户不能直接修改,所以我们只能通过修改 NI 值来影响 PRI 值,间接地调整进程优先级,NI 值越小,进程的 PRI 就会降低,该进程就越优先被 CPU 处理;反之,NI 值越大,进程的 PRI 值就会増加,该进程就越靠后被 CPU 处理
—— 修改 NI 值的注意事项
-
NI 范围是 -20 ~ 19
-
普通用户调整 NI 值的范围是 0 ~ 19,而且只能调整自己的进程
-
普通用户只能调高 NI 值,而不能降低;如原本 NI 值为 0 ,则只能调整为大于 0
-
只有 root 用户才能设定进程 NI 值为负值,而且可以调整任何用户的进程
进程优先级调整
—— 静态优先级:100 - 139
—— 进程默认启动时的 nice 值为 0 ,优先级为 120(-20 -- 19)
—— 只有根目录才能降低 nice 值(提高优先性)
相关命令
ps -elf|head :查看进程的优先级
nice -n -10 ping 127.0.0.1 :更改优先级为 10 ,ping 回环地址
renice -n -20 2118 :降低进程优先级
查看进程信息 prtstat
格式:prtstat 进程 PID 号
top 命令
—— 可以动态地持续监听进程地运行状态
第一部分
第一行:任务队列信息
说明 | |
---|---|
23:55:21 | 系统当前时间 |
up 4:48 | 系统已运行的时长 |
3 users | 当前登录的用户数(目前有三个用户登录) |
load average: 0.00,0.01,0.05 | 平均负载,即单位时间内系统处理的任务数,后面三个数值分别为 1 分钟、5 分钟、15 分钟前到现在的平均值 |
第二行:系统进程信息
说明 | |
---|---|
Tasks:187 total | 系统中的进程总数(目前有 187 个进程) |
1 running | 正在运行的进程数(目前有 1 个正在运行的进程) |
184 sleeping | 睡眠的进程数量(目前有 184 个睡眠的进程) |
2 stopped | 中止的进程数(目前有 2 个中止的进程数) |
0 zombie | 僵尸进程的个数 |
第三行:CPU 信息
%Cpu(s) | 占用 cpu 的百分比 |
---|---|
0.0 us | 用户占用百分比 |
0.0 sy | 系统模式占用百分比 |
0.0 ni | 优先级调度占用百分比 |
100.0 id | 空闲 cpu 的占用百分比 |
0.0 wa | 等待输入/输出的进程进程占用百分比 |
0.0 hi | 硬件中断占用百分比 |
0.0 si | 软件中断占用百分比 |
0.0 st | 虚拟程序占用百分比 |
第四行:物理内存信息
KiB Mem | 内存占用(单位为 K) |
---|---|
3865304 total | 物理内存总量(目前为 3865304 K) |
566680 free | 空闲内存量(目前为 566680 K) |
894640 used | 已使用物理内存量(目前为 894640 K) |
2403984 buff/cache | 物理内存和交互内存的缓冲区总和(2403984 K) |
第五行:swap 信息
KiB Swap | swap 分区(单位为 K) |
---|---|
4194300 total | 交换分区(虚拟内存)总大小(目前为 4194300 K) |
4194300 free | 空闲交换分区的大小(目前为 4194300 K) |
0 used | 已经使用的交换分区的内存大小(目前为 0 K) |
2630196 avail Mem | 可以物理空间大小(目前为 2630196 K) |
第二部分
列表组成 | 注释 |
---|---|
PID | 进程的进程 ID ,每个进程都有一个唯一的 PID |
USER | 进程属于哪个用户 |
PR | 优先级,数值越小优先级越高 |
NI | 优先级,数值越小优先级越高 |
VIRT | 该进程使用的虚拟内存的大小,单位为 KB |
RES | 该进程使用的物理内存的大小,单位为 KB |
SHR | 共享内存大小,单位为 KB |
S | 进程状态 |
%CPU | 该进程占用 CPU 的百分比 |
%MEM | 该进程占用内存的百分比 |
TIME+ | 该进程共占用的 CPU 时间 |
COMMAND | 进程的命令名 |
top 命令选项
top | 作用 |
---|---|
-d 秒数 | 指定 top 命令每隔几秒更新 |
-b | 使用使用批处理模式输出,一般和 " -n " 选项合用,用于把 top 命令重定向到文件中 |
-n 次数 | 指定 top 命令执行的次数 |
-p 进程PID | 仅查看指定 ID 的进程 |
-s | 是 top 命令在安全模式中运行,避免在交互模式中出现错误 |
-u 用户名 | 只监听某个用户的进程 |
top 命令界面的交互选项
—— ?或 h :显示交互模式的帮助
—— c :按照 CPU 的使用率排序,默认就是此选项
—— M :按照内存的使用率排序
—— N :按照 PID 排序
—— T :按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序
—— k :按照 PID 给予某个进程一个信号,一般用于中止某个进程,信号 9 是强制中止的信号
—— r :按照 PID 给某个进程重设优先级(Nice)值
—— q :退出 top 命令
pidof 命令
已知程序名不知道 PID 号
格式:pidof 进程名
查看目标进程的 PID 号
pgrep 命令
查看指定的进程
格式:pgrep 选项 进程名
选项 | 作用 |
---|---|
-U | 指定用户 |
-l | 显示进程名 |
-a | 显示完整格式的进程名 |
-p pid | 显示指定进程的子进程 |
pstree 命令进程树
以树形结构列出进程信息
常用选项 | 作用 |
---|---|
-a | 显示启动每个进程对应的完整指令,包括启动进程的路径、参数等 |
-p | 显示 PID |
-T | 不显示线程 thread ,默认显示线程 |
-u | 显示用户切换 |
-H pid | pid 高亮显示指定进程及其前辈进程 |
例:
—— pstree 1
查看进程号为 1 的进程
—— pstree lisi
查看用户 lisi 的进程
—— pstree -pH 1780
高亮显示进程号为 1780 的进程
lsof 命令
根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件
格式:lsof 选项
选项 | 作用 |
---|---|
-c 字符串 | 只列出以字符串开头的进程打开的文件 |
+d 目录名 | 列出某个目录中所有被进程调用的文件 |
-u 用户名 | 只列出某个用户的进程打开的文件 |
-p pid | 列出某个 PID 进程打开的文件 |
误删文件如何找回
前提条件:有人在使用误删的文件
losf |grep delete 找回删除文件 echo “ ” > bigfile
vmstat 监控系统资源 虚拟资源
动态了解当前系统资源的使用情况
格式:vmstat -a 刷新时间 刷新次数
内存查看
free
pmap 进程 PID 号
iostat 命令
可以提供丰富的 IO 性能状态数据
iostat | 作用 |
---|---|
-c | 只显示 CPU 行 |
-d 磁盘绝对位置 | 显示磁盘使用状态 |
-k | 以千字节为为单位显示输出 |
-t | 在输出中包括时间戳 |
-x | 在输出中包括扩展的磁盘指标 |
iotop 命令
是一个用来监视磁盘 I/O 使用状况的 top 类工具,它可以显示磁盘 I/O 使用情况最高的进程和线程,以及它们的 I/O 速率,对于 HEL/CentOS 的系统,可以使用 YUM Command 来安装 iotop
—— 安装包命令:sudo yum install iotop
uptime 命令
系统运行了多久时间
mpstat 命令
显示 CPU 相关统计
dstat 命令
系统资源统计
yum install dstat -y :依赖包
webadin 命令:图形界面
进程管理
手动启动
—— 前台启动:通过终端启动,且启动后一直占据终端
—— 后台启动:可通过终端启动,但启动后即转入后台运行(释放终端),在命令行尾加入 & 符号
进程的前/后台调用
—— Ctrl Z 组合键:将当前进程挂起,即调入后台并停止执行
—— jobs 命令:查看处于后台的任务列表
jobs -l :显示 PID 号
—— fg 命令:将后台进程恢复到前台运行,可指定任务序列号
—— bg 工作号:继续任务
中止程序的运行
—— Ctrl C 组合键:中断正在执行的命令
计划任务管理
at 一次性计划任务
at 队列存放在 /var/spool/at 目录中,服务脚本名称为 /etc/init.d/atd
格式:at HH:MM yyyy-mm-dd —— 例:at 10:02 2023-11-7
atq —— 查看未执行的一次性计划任务
atrm 数字编码 —— 删除第几条任务
crontab 任务配置的格式
* | * | * | * | * | user-name command to be executed | |
---|---|---|---|---|---|---|
代表意义 | 一小时当中的第几分钟(minute) | 一天当中的第几小时(hour) | 一个月当中的第几天(day) | 一年当中的第几个月(month) | 一周当中的星期几(week) | 命令 |
数字范围 | 0~59 | 0~23 | 1~31 | 1~12 | 0~7 | 需要执行的命令 |
时间表示的特殊符号 | 含义 |
---|---|
* | 代表任何时间(每分钟或者每小时都执行一次) |
, | 代表不连续的时间 |
- | 代表连续的时间 |
/ | 代表每个多久执行一次 |
—— 在书写 crontab 定时任务时,需要注意以下几个事项:
6 个选项都不能为空,必须填写,如果不确定,则使用“*”代表任意时间
crontab 定时任务的最小有效时间是分钟,最大有效时间是月,像 2018 年某时执行,3 点 30 分 30 秒这样的时间都不能被识别
在定义时间时,日期和星期最好不要在一条定时任务中出现,因为它们都以天为单位,非常容易让管理员混淆
在定时任务中,不管是直接写命令,还是在脚本中写命令,最好都使用绝对路径、有时使用相对路径的命令会报错
编辑计划任务
crontab -e [-u 用户名]
删除计划任务
crontab -r [-u 用户名]
查看计划任务
crontab -l [-u 用户名]
病毒的解决思路
—— 中病毒很明显的表现形式:内存使用量过高
—— 通过ps aux 找到内存使用过高的应用程序
然后进到 prog 的 pid 文件下通过 xe 的软连接来找到他的位置并将他删掉
然后在同目录下先建一个同名文件,并加上一个不可删除的权限,可以暂时缓解病毒的问题,再顽强就解决不了了,只能重装系统