共计 4139 个字符,预计需要花费 11 分钟才能阅读完成。
在 Linux 系统中,内核的功用有:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能等,在这众多的模块中,进程管理是相对重要的一环,即使不像文件系统和网络功能那么复杂。在进程管理中,内核对进程的创建、切换、撤销和调度都有很详细的定义。
1、进程类型
守护进程 : 在系统引导过程中启动的进程,跟终端无关的进程
前台进程 : 跟终端相关,通过终端启动的进程
注意:也可把在前台启动的进程送往后台,以守护模式运行
2、进程状态
在内存中运行的进程也有着各种各样的状态
运行态 R:running
就绪态:ready
睡眠态
可中断 S:interruptable
不可中断 D:uninterruptable
停止态 T:stopped, 暂停于内存中,但不会被调度,除非手动启动
僵死态 Z:zombie,结束进程,父进程结束前,子进程不关闭
3、进程调度
调度策略:调度策略就是这样一组规则:决定什么时候以怎样的方式选择一个新进程运行。所以定义一个进程的优先级来满足这样一种策略。这个策略以 0 -139 的优先级来表示。
实时优先级:1-99
无需调整,数字越大,优先级越高
静态优先级:100-139
优先级以 Nice 值调整
Nice:-20—-19,存在于task_struct 结构体中
公式如下:
pri(new)=nice+pri(old)
调度算法:早起的 Linux 中,调度算法是根据进程的优先级选择“最佳”进程来执行,它的缺点是时间开销与“可运行进程数量”有关。某种调度算法一定满足一种函数关系,业界称为 Big O
Big O:时间复杂度,用时和规模的关系。有:
O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
4、进程管理命令之 pstree
pstree – display a tree of processes
显示进程数
5、进程管理命令之 ps
Linux 系统各进程的相关信息均保存在 /proc/PID 目录下的各文件中;
ps [OPTION]…
选项:支持两种风格
常用组合:aux
u: 以用户为中心组织进程状态信息显示
a: 与终端相关的进程;
x: 与终端无关的进程;
~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT TART TIME COMMAND
USER | 运行进程的用户 |
PID | 进程 ID |
%CPU | 占用 CPU |
%MEM | 占用内存 |
VSZ | 虚拟内存集 |
RSS | 实际内存集 |
TTY | 终端信息 |
STAT | 进程状态 |
START | 进程状态 |
TIME | 运行时间 |
COMMAND | 进程名称 |
常用组合:-ef
–e: 显示所有进程
-f: 显示完整格式程序信息
常用组合:-eFH
-F: 显示完整格式的进程信息
-H: 以进程层级格式显示进程相关信息
6、进程管理命令之 pkill
pkill [options] pattern
-u uid: effective user
-U uid: real user
-t terminal: 与指定终端相关的进程
-l: 显示进程名
-a: 显示完整格式的进程名
-P pid: 显示其父进程为此处指定的进程的进程列表
7、进程管理命令之 pidof
根据进程名获取其 PID
8、进程管理命令之top
Tasks
total | 进程总数 |
running | 运行进程数 |
sleeping | 休眠态进程数 |
stopped | 停止态进程数 |
zobie | 僵死态进程数 |
%Cpu(s)
us(user space) | 用户空间占用 CPU 百分比 |
sy(system) | 内核空间占用 CPU 百分比 注:高负载时:us:sy=7:3 |
ni(nice) | 修改 nice 值占用的 CPU 百分比 |
id(idle) | 空闲的 CPU 百分比 |
wa(wait) | 等待 IO 完成占用的 CPU 百分比 |
hi(hardware interrupt) | 硬中断占用 CPU 百分比 |
si(software interrupt) | 软中断占用 CPU 百分比 |
st(stole) | 被偷走的 CPU,比如 VMware |
buffer(缓冲) | 元数据 |
cache(缓存) | 数据 |
PID | 进程号 |
USER | 进程发起者 |
PR(priority) | 优先级 |
NI(Nice) | nice 值 |
VIRT | 虚拟内存集 |
RES | 常驻内存集 |
SHR | 共享内存集 |
S(status) | 状态 |
%CPU | CPU 占用比 |
%MEM | 内存占用比 |
TIME+ | 运行时长 |
COMMAND | 启动进程 |
对显示排序的方法:
P | 占据的 CPU 百分比 |
M | 占据内存百分比 |
T | 累积占据 CPU 时长 |
首部信息显示:
l | uptime 信息 |
t | tasks 及 cpu 信息 |
# 数字 | cpu 分别显示 |
m | memory 信息 |
s | 修改刷新时间间隔 |
Esc | 退出 |
k | 终止指定进程 |
W | 保存文件 |
q | 退出命令 |
9、进程管理命令之 h top
=
比 top 更加高级的进程管理软件
f1 帮助
f2 切换 CPU、mem、swap 显示方式
f10 退出
常用选项:
-d #: 指定延迟时间;
-u UserName: 仅显示指定用户的进程;
-s COLOMN: 以指定字段进行排序;
命令:
s: 跟踪选定进程的系统调用;
l: 显示选定进程打开的文件列表;
a:将选定的进程绑定至某指定 CPU 核心;
t: 显示进程树
注意:Fedora-EPEL 源
10、进程管理命令之vmstat
vmstat -s: 内存的汇总信息
procs | 项目 |
r | 等待运行的进程的个数,和核心数有关 |
b | 处于不可中断睡眠态的进程个数(被阻塞的队列的长度) |
swap | 项目 |
si | 从磁盘交换进内存的数据速率(kb/s) |
so | 从内存交换至磁盘的数据速率(kb/s) |
io | 项目 |
bi | 从块设备读入数据到内存的速率(kb/s) 读 |
bo | 从内存写入磁盘的速率(kb/s) 写 |
memory | 项目 |
swad | 交换内存的使用总量 |
free | 空闲物理内存总量 |
buffer | 用于 buffer 的内存总量 |
cache | 用于 cache 的内存总量 |
system | 项目 |
in: interrupts | 中断速率 |
cs: context switch | 进程切换速率 |
cpu | 项目 |
us | 用户空间占用的比例 |
sy | 内核空间占用的比例 |
id | 空闲空间占用的比例 |
wa | 等待 IO 完成所消耗的时间比例 |
st | 被虚拟化技术偷走的时间比例 |
11、进程管理命令之glances
glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [–password] [-t refresh] [-f file] [-o output]
内建命令:
a Sort processes automatically l Show/hide logs
c Sort processes by CPU% b Bytes or bits for network I/O
m Sort processes by MEM% w Delete warning logs
p Sort processes by name x Delete warning and critical logs
i Sort processes by I/O rate 1 Global CPU or per-CPU stats
d Show/hide disk I/O stats h Show/hide this help screen
f Show/hide file system stats t View network I/O as combination
n Show/hide network stats u View cumulative network I/O
s Show/hide sensors stats q Quit (Esc and Ctrl-C also work)
y Show/hide hddtemp stats
常用选项:
-b: 以 Byte 为单位显示网卡数据速率;
-d: 关闭磁盘 I / O 模块;
-f /path/to/somefile: 设定输入文件位置;
-o {HTML|CSV}:输出格式;
-m: 禁用 mount 模块
-n: 禁用网络模块
-t #: 延迟时间间隔
-1:每个 CPU 的相关数据单独显示;
C/ S 模式下运行 glances 命令:
服务模式:
glances -s -B IPADDR
IPADDR: 指明监听于本机哪个地址
客户端模式:
glances -c IPADDR
IPADDR:要连入的服务器端地址
12、进程管理命令之dstat
dstat [-afv] [options..] [delay [count]]
-c: 显示 cpu 相关信息;
-C #,#,…,total
-d: 显示 disk 相关信息;
-D total,sda,sdb,…
-g:显示 page 相关统计数据;
-m: 显示 memory 相关统计数据;
-n: 显示 network 相关统计数据;
-p: 显示 process 相关统计数据;
-r: 显示 io 请求相关的统计数据;
-s: 显示 swapped 相关的统计数据;
–top-cpu:显示最占用 CPU 的进程;
–top-io: 显示最占用 io 的进程;
–top-mem: 显示最占用内存的进程;
–top-lantency: 显示延迟最大的进程;
13、进程管理命令之 kill
kill 命令:
向进程发送控制信号,以实现对进程管理
显示当前系统可用信号:
# kill -l
# man 7 signal
常用信号:
1) SIGHUP: 无须关闭进程而让其重读配置文件;
2) SIGINT: 中止正在运行的进程;相当于 Ctrl+c;
9) SIGKILL: 杀死正在运行的进程;
15) SIGTERM:终止正在运行的进程;
18) SIGCONT:
19) SIGSTOP:
指定信号的方法:
(1) 信号的数字标识;1, 2, 9
(2) 信号完整名称;SIGHUP
(3) 信号的简写名称;HUP
向进程发信号:
kill [-SIGNAL] PID…
终止“名称”之下的所有进程:
killall [-SIGNAL] Program
14、Linux 的作业控制
前台作业:通过终端启动,且启动后一直占据终端;
后台作业:可以通过终端启动,但启动后即转入后台运行(释放终端);
如何让作业运行于后台?
(1) 运行中的作业
Ctrl+z
(2) 尚未启动的作业
# COMMAND &
此类作业虽然被送往后台运行,但其依然与终端相关;如果希望送往后台后,剥离与终端的关系:
# nohup COMMAND &
查看所有作业:
# jobs
作业控制:
# fg [[%]JOB_NUM]:把指定的后台作业调回前台;
# bg [[%]JOB_NUM]:让送往后台的作业在后台继续运行;
# kill [%JOB_NUM]:终止指定的作业;