一: linux 进程概念
一个程序的执行: 一个 program 需要执行时会将 program 的一个副本装载进内存; 此时会生成一个 process,process 工作时会发起 system call, 内核通过优先级队列来挑选一个最优先的进程分配时间片去 CPU 上执行.
内核负责: 进程管理, 文件系统, 网络功能, 内存管理, 驱动程序, 安全功能等
program: 程序, 在磁盘上的一段代码
process: 进程, 运行中的程序的一个副本
system call: 系统调用
模式切换: 用户模式(CPU 执行用户进程代码) <---> 内核模式(CPU 执行内核代码)
时间片: 一个 CPU 同一时间只可以做一件事, 但是我们需要计算机可以为我们处理多种事情, 所有就把 CPU 的计算力按时间来切片; 比如给每个进程 5ms 的执行时间, 由于中间切换时间太短, 我们感觉不到中间的切换, 让我们感觉是同时来处理多个任务.
保存现场: 进程在 CPU 上运行在时间片用完时或被中断时但是它的任务还没有完成, 这时就需要把自己的任务进度保存下来.
恢复现场: 没有执行完的进程又一次轮到它执行时, 它需要恢复到上次没有处理完的地方继续进行.
生命周期: 进程由它的父进程创建生成, 完成它的使命后由它的父进程销毁, 此为生命周期.
task struct:linux 内核存储进程信息的数据结构格式.
任务链表: task list, 多个任务的 task struct 组成的链表.
软中断: 软中断是由进程产生的.
硬中断: 硬中断是由硬件产生的, 比如, 像磁盘, 网卡, 键盘, 时钟等.
进程创建: 每一个进程都是由夫进程创建, fork(),clone()
CoW: 写时复制, 子进程在没有发生数据改变时是和它的父进程共用一个内存空间, 在需要改变数据时才会复制一份数据到另一段内存空间.
init(systemd): 初始化进程, 是所有进程的父进程. 在内核启动后生成
进程优先级: 在计算机的世界中是绝对的不公平的, 进程有优先级之分; linux 中将优先级分为 0-139 等级
1-99: 实时优先级, 数字越大优先级越高
100-139: 静态优先级, 数子越大, 优先级越高
Nice 值:-20 -- 19, 对应于 100-139, 对于普通用户只可以调低自己的优先级
过期队列: 除了 139 个优先级队列外还有与之相对应的 139 个过期队列
内核挑选进程执行的方式: 从 0-139 个队列中挑一个优先级高的执行, 如果时间片走完还进程还没有执行完就把该进程放到相应的优先级的过期队列中; 该优先级队列中的进程全部执行一次之后再把该优先级过期队列中的进程放回优先级队列, 再从次优先级队列中挑选进程执行, 直到该队列中的进程全部执行完成后再执行下一级优先级队列中的进程, 依次类推.
Big(O): 衡量算法的复杂度; 随着任务复杂度的上升, 所消耗时间的走向
LRU 算法:
每一个数据在放入内存中的时候都在在第一个, 旧的数据往下排, 如果旧数据被调用后重新放到第一个, 如果没有被用到的数据将被淘汰.
Page Frame: 页框, 把物理内存分成 N 个页框, 用于存储页面数据
线性地址空间: 进程启动时内核会分配一个虚拟内存空间, 但实际上没有那么大的内存, 进程用的时候内核实时将页框分配给进程使用.
物理地址空间: 真正的内存空间
MMU: 内存管理单元, 管理线性地址空间和物理地址空间的转换映射的分配关系
常驻内存集: 不可被交换到 swap
虚拟内存集: 可以被交换到 swap
IPC:Inter Process Communication 进程间通信
同一主机:
signal: 信号
shm:shared memory 共享内存
semerphor: 旗语
跨主机
rpc:remote procecure call 远程过程调用
socket: 套接字, linux 一切皆文件, 进程间通信时会将数据发往此文件, 与之对应的服务端也有一份套接字文件, 中间通过 tcp 等协议传输, 对方进程就可以从此文件中读取对方发送过来的数据信息, 做出相应处理后在将数据发往此文件, 再通过 tcp 传输协议将数据送回客户端, 完成一次远程调用.
进程类型:
守护进程: daemon: 在系统引导过程中启动的进程
用户进程(前台进程或批处理进程): 通过终端启动的进程, 也可把前台启动的进程送往后台, 以守护模式运行
进程状态:
运行态: running
就绪态或睡眠态: ready
可中断睡眠: interruptable
不可中断睡眠: uninterruptable
停止态: stopped
僵尸态: zombie
进程的分类:
CPU-Bound:CPU 密集型
IO-Bound:IO 密集型
二: linux 中进程管理工具详解
ps: 查看进程状态
ps 的选项风格有三种, BSD 风格: 不加 "-" 直接写选项; Unix 风格: 短选项; GUN 风格: 长选项.
BSD 风格:
a: 所有终端的进程
x: 和终端无关的进程
u: 显示进程所有者的信息
f: 显示进程之间的层次关系
z : 显示 selinux 的相关属性
k: 指定排序的项, 在项前加 "-" 表示反向排序, 如:-ni
o: 指定查看项, 多个项目用 "," 分割
user: 运行该进程的用户
pid: 进程号
%cpu: 占用 cpu 比例
%mem: 占用内存比例
vsz: 虚拟内存集
rss: 常驻内存集
tty: 终端
stat: 进程运行状态
start: 进程启动时间
time: 占用 cpu 时间片的总时长
cmd: 显示进程名
pri: 优先级
ni:nice 值
rtprio: 实时优先级
psr: 运行 cpu 编号
comm=: 显示启动该进程的命令
etime: 进程已经启动了多长时间
L: 显示 o 支持的属性
unix 风格:
-e: 显示所有进程
-f: 显示完整格式列表
-H: 以缩进方式显示进程间关系
-u username: 有效用户
-U username: 真正的用户
-g groupname: 有效组
-G groupname: 真正的组
-p PID: 显示指定 PID 的进程
--ppid PID: 显示指定 PID 的进程的子进程
--sort: 排序
-M: 显示 selinux 的相关属性
-t 终端: 显示指定终端运行的进程
-C 程序名: 查看程序运行的状态
[root@rhel6 ~]# ps aux |head -5
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
用户 进程号 CPU 占用 内存占用 虚拟内存集 常驻内存集 终端 进程运行状态 进程启动时间 占用 CPU 时间片总时长 进程名
- root 1 0.0 0.1 19356 1552 ? Ss 16:25 0:00 /sbin/init
- root 2 0.0 0.0 0 0 ? S 16:25 0:00 [kthreadd]
- root 3 0.0 0.0 0 0 ? S 16:25 0:00 [migration/0]
- root 4 0.0 0.0 0 0 ? S 16:25 0:00 [ksoftirqd/0]
ps 常用示例:
1, 查询当前系统中运行的所有进程
[root@rhel6 ~]# ps aux
2, 查看指定用户 (RUID) 的进程
[root@rhel6 ~]# ps -fU apache
UID PID PPID C STIME TTY TIME CMD
- apache 11891 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11892 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11893 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11894 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11895 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11896 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11897 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11898 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
3, 通过 pid 查询进程
[root@rhel6 ~]# ps -fp 11891
UID PID PPID C STIME TTY TIME CMD
apache 11891 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
4, 通过父进程的 pid 来查询它的所有子进程
[root@rhel6 ~]# ps -f --ppid 11889
UID PID PPID C STIME TTY TIME CMD
- apache 11891 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11892 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11893 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11894 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11895 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11896 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11897 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11898 11889 0 01:30 ? 00:00:00 /usr/sbin/httpd
5, 查看 tty 终端所属的进程
[root@rhel6 ~]# ps -ft pts/1
UID PID PPID C STIME TTY TIME CMD
root 11277 11275 0 May04 pts/1 00:00:00 -bash
root 11931 11277 0 01:40 pts/1 00:00:00 ps -ft pts/1
6, 以树状方式显示指定进程
[root@rhel6 ~]# ps -f --forest -C httpd
UID PID PPID C STIME TTY TIME CMD
- root 11889 1 0 01:30 ? 00:00:00 /usr/sbin/httpd
- apache 11891 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
- apache 11892 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
- apache 11893 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
- apache 11894 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
- apache 11895 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
- apache 11896 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
- apache 11897 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
- apache 11898 11889 0 01:30 ? 00:00:00 \_ /usr/sbin/httpd
7, 查找指定进程名所有的所属 PID
- [root@rhel6 ~]# ps -C sshd -o pid=
- 1534
- 11275
8, 检查一个进程执行了多长时间
- [root@rhel6 ~]# ps -eo comm,etime,user |grep httpd
- httpd 30:50 root
- httpd 30:50 apache
- httpd 30:50 apache
- httpd 30:50 apache
- httpd 30:50 apache
- httpd 30:50 apache
- httpd 30:50 apache
- httpd 30:50 apache
- httpd 30:50 apache
9, 查询占用物理地址最多的进程
- [root@rhel6 ~]# ps xo user,pid,rss,comm= k -rss |head
- USER PID RSS
- root 11275 4588 sshd
- root 11277 3984 bash
- root 11889 3748 httpd
- root 1615 3448 master
- root 1365 3360 cupsd
- root 1644 2540 abrtd
- root 1481 1960 automount
- root 1237 1724 rsyslogd
- root 1 1552 init
10, 使用 watch 命令实时检测 CPU 使用率
[root@rhel6 ~]# watch -n 1 'ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu | head'
pstree: 显示进程树
pidof: 查询指定进程的 PID
pgrep: 搜索指定的进程
-u uid: effective user, 生效者
-U uid: real user, 真正发起运行命令者
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示指定进程的子进程
uptime: 查看系统的基本负载状态
top: 实时监控系统状态工具
交互按键:
M: 按内存使用排序
P: 按 CPU 使用排序
l: 显示, 隐藏 top 第一行
t: 改变 / 隐藏 CPU 的显示方式
m: 改变 / 隐藏内存的显示方式
1: 单 CPU 和总 CPU
s: 改变刷新间隔, 默认 3s
k: 杀死进程
PID -- signal(15 关闭进程)
q: 退出
W: 将状态保存到~/.roprc
选项:
-d #: 指定时间间隔, 秒
-b: 显示所有进程的状态
- -n #: 刷新 #次自动退出
- [root@rhel6 ~]# top -n1 -b
top - 03:06:25 up 10:41, 1 user, load average: 0.00, 0.01, 0.05
top - 系统时间 up 启动了多长时间 用户 负载:(1,5,10)分钟的平均负载
Tasks: 132 total, 1 running, 131 sleeping, 0 stopped, 0 zombie
总进程数 正在运行进程数 睡眠进程数 停止态进程数 僵尸进程数
Cpu(s): 0.2%us, 0.5%sy, 0.0%ni, 99.2%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu(s): 用户空间使用率 系统空间使用率 nice 值 空闲率 等待率 硬中断率 软中断率 被偷走的时间(分配给虚拟机中的进程的时间片)
Mem: 1004136k total, 452340k used, 551796k free, 40868k buffers
Swap: 2097148k total, 0k used, 2097148k free, 263940k cached
总内存大小 已使用 空闲内存 缓存使用
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
- root 20 0 19356 1552 1232 S 0.0 0.2 0:00.89 init
- root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
- root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
htop(epel):top 的增强版, 界面更友好, 支持鼠标点击
iotop: 用来监视磁盘 I/O 使用状况
选项:
-o: 只看产生 IO 的进程
-b: 非交互式
- -n #: 检测 #次, 默认为一直检测
- -d #: 检测间隔 #秒
-p PID: 检测指定 PID 的进程
-u: 检测指定用户产生 IO 的情况
-P: 仅显示进程, 默认显示线程
-a: 显示累计的 IO 量
-k: 使用 KB 为单位
-t: 显示时间戳
-q 只在第一次监测时显示列名
-qq 永远不显示列名
-qqq 永远不显示 I/O 汇总
交互按键:
left 和 right 方向键: 改变排序
r: 反向排序
o: 切换至选项 - o
p: 切换至 - p 选项
a: 切换至 - a 选项
q: 退出
i: 改变线程的优先级
Total DISK READ: 673.43 M/s | Total DISK WRITE: 0.00 B/s
TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
线程 ID(按 p 可切换 PID) 优先级 用户 读速度 写速度 swap 所占率 IO 等待率 进程名
- 15330 be/4 root 673.43 M/s 0.00 B/s 0.00 % 2.07 % dd if=/dev/sda of=/dev/null
- 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init
nice -n nice 值 CMD: 指定运行时的 nice 值
renice -n nice 值 CMD: 调整运行中进程的 nice 值
vmstat: 查看虚拟内存状态
-s: 显示内存的统计数据
- [root@centos7 ~]# vmstat
- procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
- 2 0 0 574860 2080 260516 0 0 105 37 165 179 0 1 99 0 0
- procs
r: 可运行 (正运行或等待运行) 进程的个数
b: 处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory
swpd: 交换内存的使用总量
free: 空闲物理内存总量
buffer: 用于 buffer 的内存总量
cache: 用于 cache 的内存总量
swap
si: 从磁盘交换进内存的数据速率(kb/s)
so: 从内存交换至磁盘的数据速率(kb/s)
io
bi: 从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率
system
in: interrupts 中断速率, 包括时钟
cs: context switch 进程切换速率
cpu
us: 花在运行非内核代码上的时间
sy: 花在运行内核代码上的时间
id: 闲置的时间
wa: 等待 IO 的时间
st: 被虚拟机盗取的时间
iostat: 统计 CPU 和设备 IO 信息
dstat: 系统资源统计工具
-c: 显示 cpu 相关信息
-d: 显示 disk 相关信息
-g: 显示 page 相关统计数据
-m: 显示 memory 相关统计数据
-n: 显示 network 相关统计数据
-p: 显示 process 相关统计数据
-r: 显示 io 请求相关的统计数据
-s: 显示 swapped 相关的统计数据
--tcp: 显示 tcp 相关统计数据
--udp: 显示 udp 相关统计数据
--unix: 显示 unix-sockets 相关统计数据
--raw: 显示 raw 相关统计数据
--socket: 显示 socket 相关统计数据
--ipc: 显示 ipc 相关统计数据
--top-cpu: 显示最占用 CPU 的进程
--top-io: 显示最占用 io 的进程
--top-mem: 显示最占用内存的进程
--top-latency: 显示延迟最大的进程
pmap PID: 查看进程对应的内存映射 == cat /proc/PID/maps
-x: 显示详细信息
glances(epel): 调用远程主机上的系统运行状态信息
- [root@centos7 ~]# yum -q -y install glances #安装 glances 软件包
- [root@centos7 ~]# glances -s -B 192.168.0.7 & #启动服务并监听端口
- [root@centos7 ~]# glances -c 192.168.0.7 #客户端连接
释放 buff/cache 空间
echo 1> /proc/sys/vm/drop_caches
kill: 向进程发送控制信号
-n # PID: 向进程发信号
% 作业号: 结束作业
-l: 查看所有信号
常用信号: man 7 signal
1:SIGHUP 让进程重读配置文件
2:SIGINT 终止信号
3:SIGQUIT ctrl+\, 退出信号
9:SIGKILL 强制退出
15:SIGTERM 正常退出, kill 默认发送 15 信号
18:SIGCONT 继续运行
19:SIGSTOP 停止信号
pkill -n #: 向进程发送信号, 支持模式匹配, 用法和 pgrep 相似
-u uid: effective user, 生效者
-U uid: real user, 真正发起运行命令者
-t terminal: 与指定终端相关的进程
-P pid: 显示指定进程的子进程
killall -n # CMD: 向进程发送指定信号
jobs: 显示当前终端所有的作业
fg [[%]JOB_NUM]: 把指定的后台作业调回前台
bg [[%]JOB_NUM]: 让送往后台的作业在后台继续运行
当我们在执行一个时间比较长的前台任务(如: 压缩大文件, 编译内核等), 如果途中网络中断会导致我们的任务执行中断, 此时为了避免这种情况建议采取以下操作:
nohup CMD &>/dev/null 剥离与终端的关系, 如果终端关闭, 进程由 init(systemd)接管
screen: 使用 Ctrl + a,d 剥离会话,-r 恢复会话
个人学习笔记
记录于 2018.5.5 19:56
来源: https://www.cnblogs.com/L-dongf/p/8987866.html