进程、性能管理和任务计划
什么是进程
- 进程(Process):运行中的程序的一个实例(或副本),是被载入内存的一个指令集合,是系统资源分配的基本单位。
- 进程ID(PID):唯一标记各个进程。
- 权限继承:UID(用户ID)、GID(组ID)和SELinux语境决定进程对文件系统的存取权限,通常从执行进程的用户继承。
- 生命周期:从创建到终止。
进程创建
- init/systemd:第一个进程(根进程)。CentOS 7+ 中命名为
systemd。
- 父子关系:进程由其父进程通过
fork() 等机制创建,形成父子关系。
- Copy-On-Write(COW):优化技术,减少进程创建时的内存使用。
- 进程资源:内存、栈、文件描述符(fd)。
进程与线程
进程(Process)
- 定义:具有一定独立功能的程序在数据集上的动态执行过程,是操作系统资源分配和调度的独立单位。
- 组成:
- 程序:描述进程功能的指令集。
- 数据集合:程序执行所需的数据和工作区。
- 进程控制块(PCB):包含进程描述和控制信息,是进程存在的唯一标志。
- 特征:
- 动态性:临时存在,有生命周期。
- 并发性:可与其他进程并发执行。
- 独立性:资源分配和调度的独立单位。
- 结构性:由程序、数据集合和PCB组成。
线程(Threads)
- 定义:程序执行流的最小单元,处理器调度和分派的基本单位。
- 与进程的关系:
- 一个进程包含一个或多个线程。
- 线程共享进程的内存空间(代码段、数据集、堆等)及进程级资源(如打开的文件)。
- 线程组成:线程ID、指令指针(PC)、寄存器、堆栈。
进程 vs 线程
| 特性 |
进程 |
线程 |
| 资源分配 |
操作系统分配资源的最小单位 |
CPU调度的最小单位 |
| 组成 |
包含一个或多个线程 |
进程中的代码执行路线 |
| 内存共享 |
相互独立 |
共享进程内存空间 |
| 可见性 |
对其他进程可见 |
同一进程内线程可见 |
查看线程信息
- 线程状态:
cat /proc/PID/status
- 二进制文件:
ll /proc/PID/exe
- 打开的文件:
/proc/PID/fd/
/proc 目录详解
| 路径 |
描述 |
/proc/PID/exe |
符号链接,指向启动该进程的可执行文件。 |
/proc/PID/status |
包含进程详细状态(PID、PPID、状态、优先级等)。 |
/proc/PID/fd/ |
包含与该进程相关的文件描述符(符号链接形式指向文件或资源)。 |
并行与并发
- 并发:轮流执行(单核CPU处理多任务)。
- 并行:同时执行(多核CPU同时处理任务)。
进程结构
- 任务队列:内核将进程存放在双向循环链表中,链表项为
task_struct(进程控制块,PCB)。
- PCB 包含信息:
- 进程ID、用户ID、组ID
- 程序计数器
- 进程状态(就绪、运行、阻塞)
- CPU寄存器值
- 虚拟地址空间信息
- 控制终端信息
- 当前工作目录
- 文件描述符表
- 资源使用上限(可通过
ulimit -a 查看)
进程相关概念
内存管理
- Page Frame:存储页面数据的页框(默认4KB)。
- MMU:内存管理单元,负责虚拟地址到物理地址的转换。
- TLB:翻译后备缓冲区,缓存虚拟地址与物理地址的映射关系。
用户与内核空间
- 用户空间:应用程序运行区域。
- 内核空间:操作系统核心代码运行区域。
进程内存布局
| 段 |
用途 |
| 代码段 |
存放可执行指令(只读)。 |
| 数据段 |
存放已初始化的全局变量和静态变量。 |
| BSS段 |
存放未初始化的全局变量(加载时初始化为零)。 |
| 堆(Heap) |
动态分配的内存(如 malloc 分配)。 |
| 栈(Stack) |
存放局部变量、函数调用信息(参数、返回地址等)。 |
| 队列 |
先进先出(FIFO)数据结构。 |
内存问题
| 问题类型 |
定义 |
| 内存泄漏 |
程序申请内存后未释放(malloc/new 未配对 free/delete)。 |
| 内存溢出 |
向申请的内存空间写入超过其大小的数据(缓冲区溢出)。 |
| 内存不足 |
程序无法申请到足够内存(OOM)。 |
Linux 内核参数设置
# 禁止内存过度提交
echo 2 > /proc/sys/vm/overcommit_memory
# 设置物理RAM的过度提交比例(80%)
echo 80 > /proc/sys/vm/overcommit_ratio
# 禁止OOM时重启系统
echo 0 > /proc/sys/vm/panic_on_oom
进程状态
基本状态及转换
- 创建状态:申请空白PCB并填写信息。
- 就绪状态:已分配资源,等待CPU调度。
- 执行状态:正在运行。
- 阻塞状态:等待事件(如I/O操作)。
- 终止状态:进程结束。
- 睡眠态:
- 可中断睡眠(
S):可被信号唤醒。
- 不可中断睡眠(
D):等待I/O完成,不可中断。
- 停止态:暂停执行(
T)。
- 僵死态(Zombie):进程已终止,但父进程未回收资源(
Z)。
状态转换规则
- 运行 → 就绪:时间片用完或更高优先级进程抢占。
- 就绪 → 运行:调度器分配CPU。
- 运行 → 阻塞:等待事件(如I/O请求)。
- 阻塞 → 就绪:等待事件发生。
- 不可能转换:阻塞 → 运行、就绪 → 阻塞。
ps -ef 输出属性
| 字段 |
说明 |
| PID |
进程ID。 |
| UID |
启动进程的用户ID。 |
| PPID |
父进程ID。 |
| VSZ |
虚拟内存大小(KB)。 |
| RSS |
常驻内存集大小(KB)。 |
| STAT |
进程状态(R运行、S睡眠、D不可中断睡眠等)。 |
| NI |
Nice值(优先级调整值)。 |
| PRI |
优先级(数值越小优先级越高)。 |
| RTPRIO |
实时优先级。 |
| PSR |
最后运行的CPU编号。 |
LRU算法
- 定义:最近最少使用(Least Recently Used),缓存淘汰策略。
- 原理:优先淘汰最久未使用的数据。
- 操作:
Get:存在则移至链表头部。
Put:插入新数据到头部;超容时淘汰尾部数据。
- 复杂度:
O(1)(哈希表+双向链表)。
- 应用场景:页面缓存、图片缓存、数据库查询缓存。
IPC进程间通信
| 类型 |
机制 |
| 同一主机 |
管道、共享内存、信号量、消息队列。 |
| 不同主机 |
Socket(IP+端口号)。 |
| 远程过程调用 |
RPC(如gRPC)。 |
进程优先级
分类
| 类型 |
范围 |
调度算法 |
| 实时优先级 |
0–99 |
实时调度算法。 |
| 普通优先级 |
100–139 |
完全公平调度算法。 |
修改优先级
# 启动时设置Nice值
nice -n 10 command
# 调整运行中进程的Nice值
renice 5 -p PID
进程管理与性能工具
进程树(pstree)
pstree -a -p # 显示完整命令行和PID
ps命令
ps -elf # 长格式显示进程信息
ps -eo pid,ni,comm # 自定义输出字段
ps -aux # 显示所有用户进程(含无控制终端的进程)
prtstat
prtstat -r PID # 打印指定进程的统计信息
pgrep/pidof
pgrep -l nginx # 查找进程并显示名称
pidof nginx # 查找进程ID
uptime
uptime -p # 易读格式显示运行时间
mpstat
mpstat -P ALL 1 # 监控所有CPU核心(每秒刷新)
top快捷键
| 快捷键 |
功能 |
P |
按CPU使用率排序。 |
M |
按内存使用量排序。 |
k |
终止进程。 |
r |
调整进程优先级。 |
c |
切换显示命令名/完整命令行。 |
free
free -h # 人性化显示内存使用
缓冲(Buffer) vs 缓存(Cache)
| 特性 |
Buffer |
Cache |
| 用途 |
临时存储待写入磁盘的数据。 |
存储从磁盘读取的数据副本。 |
| 目标 |
优化写入性能(合并I/O)。 |
加速重复读取。 |
| 生命周期 |
数据写入磁盘后释放。 |
长期保留直到内存不足。 |
清除缓存
sync # 同步数据到磁盘
echo 3 > /proc/sys/vm/drop_caches # 清除页面/目录项/索引节点缓存
pmap
pmap -x PID # 查看进程内存映射
vmstat
vmstat 1 5 # 每秒输出1次,共5次
iostat
iostat -x -k # 扩展统计+KB单位显示
网络监控工具
| 工具 |
功能 |
| iftop |
实时流量监控(按连接排序)。 |
| nload |
简洁的实时带宽监控。 |
| NetHogs |
按进程显示网络流量。 |
| iptraf-ng |
综合IP流量统计(TCP/UDP/ICMP)。 |
| dstat |
多功能资源统计(CPU/内存/磁盘/网络)。 |
ss命令
ss -t -a # 显示所有TCP连接
任务计划
at命令(一次性任务)
echo "tar -zcf /backup.tgz /home" | at 02:00 # 凌晨2点备份
atq # 查看任务
atrm 1 # 删除任务ID=1
cron服务(周期性任务)
crontab -e # 编辑计划任务
crontab格式:
* * * * * command
┬ ┬ ┬ ┬ ┬
│ │ │ │ └─ 星期 (0–7, 0和7均为周日)
│ │ │ └─── 月 (1–12)
│ │ └───── 日 (1–31)
│ └─────── 时 (0–23)
└───────── 分 (0–59)
特殊字符串:
@reboot:系统启动时运行。
@daily:每天午夜运行。
@hourly:每小时运行。
crontab -l # 查看当前任务
crontab -r # 删除所有任务