01 认识进程1.1 进程是什么原文定义进程是操作系统中一次程序执行过程是操作系统分配资源、CPU 调度的最小单位。 运行程序时内核会创建task_struct结构体PCB 进程控制块这个结构体就是进程本身进程所有信息状态、PID、内存地址等全部存在这里。 程序运行结束内核回收task_struct程序异常崩溃内核清理资源防止僵尸进程。通俗大白话打开微信、浏览器每一个正在运行的软件窗口就是进程。 操作系统给每个运行的程序单独建一张 “档案卡”task_struct卡上记录这个程序占用多少内存、CPU、现在是运行还是休眠、编号 PID 等。程序关掉档案销毁程序崩溃系统自动清理档案。运行调度原理原文CPU 采用时间片轮转调度每个进程分配固定时间片示例 5ms轮流占用 CPU用完时间片就进入就绪队列排队等待下一次调度。 示例QQ、WPS、钉钉多个进程排队轮流使用 CPU。进程四大核心特征原文 通俗解释动态性原文动态产生、动态消亡。 通俗双击软件才会出现进程关闭软件进程消失不是永久存在。并发性原文多个进程可以同时一起执行。 通俗一边放视频、一边聊微信、一边下载文件看似同时运行。独立性原文独立运行、独立分配资源有专属内存空间。 通俗微信崩溃不会让浏览器一起闪退两者内存互不干扰。异步性原文进程执行速度不可预测互相不受控。 通俗CPU 先跑微信还是先跑浏览器由系统调度决定顺序不固定。02 程序与进程的关系2.1 程序 vs 进程对比表表格对比维度程序 (Program)进程 (Process)定义磁盘上静态文件指令集合如 exe不运行不占资源程序动态运行实例占用 CPU、内存、网卡等资源有完整生命周期存在形式静态文件永久保存在硬盘动态启动创建、结束销毁内存临时存在资源占用只占硬盘存储空间不占用运行内存、CPU占用物理内存、CPU、文件句柄、端口独立虚拟地址空间状态无状态只是一堆代码拥有多种运行状态运行、休眠、暂停等状态随时变化独立性文件之间互不影响进程内存完全隔离默认不能互相读写数据必须靠特殊通信方式举例硬盘里的 chrome.exe 文件双击浏览器后打开的窗口1 个程序可以生成 N 个进程通俗总结程序 硬盘里的安装包 / 软件文件静态、死的 进程 打开软件后正在跑的程序动态、活的。2.2 程序与进程关联原文 补充进程是程序的运行实例一个程序可以对应多个进程例同时打开 3 个浏览器窗口chrome 程序只有一份但有 3 个独立进程。程序是模板进程是运行表现。同程序多进程只读代码段共享节省内存数据段、栈、堆完全独立。 补充代码不会被修改所有进程共用一份代码但变量、数据每个进程单独一份。关闭进程磁盘上的程序文件还在删除程序文件已经打开的进程能继续运行直到需要读取文件时报错。03 进程组成与运行属性3.1 进程三大组成部分1PCB 进程控制块task_struct原文操作系统管理进程的核心结构体每个进程唯一记录 PID、状态、内存、资源占用是系统识别进程的唯一依据。 通俗每个进程的身份证 档案内核靠它管理所有进程。2文本段代码段原文存放程序编译后的机器指令只读同一程序多进程共享运行期间大小固定。 通俗软件的代码指令禁止修改多个浏览器共用同一份代码省内存。3数据段细分 4 块存放运行时数据分为初始化全局数据段定义并赋值的全局变量未初始化数据段只声明不赋值的全局变量堆程序动态申请的内存malloc/new栈局部变量、函数调用信息3.2 虚拟内存与物理内存映射原文补充Linux 3G/1G 划分用户空间0~3G普通程序访问内核空间3G~4G操作系统内核使用 MMU 内存管理单元负责把程序看到的虚拟地址翻译成真实物理内存地址内存不够时会把数据放到 swap 交换分区硬盘。通俗程序看到的内存是 “假地址”MMU 做翻译内存不够就临时存硬盘。3.3 Linux 三种进程类型1. 交互进程定义终端手动启动和用户交互依赖终端前台运行。 例子ls、vim、./a.out关掉终端进程直接退出。2. 批处理进程定义无需人工交互后台批量执行优先级低脚本、定时任务。 例子批量日志清理、数据备份脚本。3. 守护进程daemon定义开机自启后台服务完全脱离终端开机启动、关机结束持续提供服务。 例子nginx、mysql、ssh、systemd。3.4 Linux 六大基础进程状态原文 通俗讲解R 运行 / 就绪态正在 CPU 上运行或排队等待 CPU 调度ps里看到 R。S 可中断睡眠进程等待事件等待输入、等待网络、等待子进程可以被信号唤醒kill、CtrlC 能打断。D 不可中断睡眠磁盘休眠等待硬件 IO读写硬盘任何信号都杀不死包括kill -9防止写入磁盘中途中断导致数据损坏。 补充长期 D 状态代表磁盘故障 / IO 卡死。T 停止态手动暂停CtrlZ、kill -19暂停可用kill -18恢复运行。Z 僵尸态程序已经执行完毕退出但父进程没有调用wait()回收它的退出信息PCB 残留占用 PID 资源。 通俗员工离职没办手续档案还留在公司。X 死亡态进程资源全部回收生命周期彻底结束瞬间状态几乎看不到。3.5 进程附加状态标记ps 输出里的后缀符号前台进程绑定当前终端l多线程进程N低优先级NI0高优先级NI0s会话首进程管理一组终端进程L持有文件 / 资源锁3.6 进程状态流转简图文字版fork()创建进程 → R 运行态时间片用完 → 进入就绪队列等待调度调用sleep()/ 等待 IO → S 可中断睡眠等待磁盘硬件 → D 不可中断睡眠SIGSTOP信号 → T 停止态SIGCONT恢复为 R进程执行exit()退出 → Z 僵尸态父进程调用wait()回收 → X 死亡态3.7 PID 进程 ID基础规则PID 是进程唯一数字编号从 1 开始系统最大进程数由kernel.pid_max控制默认 131072。 所有进程信息存在/proc/[PID]文件夹/proc/1/status查看 1 号进程详情。三大特殊 PIDPID 0idle 空闲进程 系统最底层进程CPU 无事可做时运行负责调度空闲 CPU。PID 1systemd/init 初始化进程 0 号进程创建系统初始化、启动所有服务自动回收所有孤儿进程。PID 2kthreadd 内核线程管理进程 负责创建、管理所有内核后台任务磁盘回收、内存清理等。04 进程相关命令大全原文 补充用法4.1 ps 查看进程快照静态只打印一次表格命令参数作用使用场景ps -ef-e 所有进程-f 完整格式查看系统全部进程、父子 PID 关系ps -aux-a 所有终端进程-u 用户资源-x 无终端守护进程看 CPU、内存占用百分比ps -eo pid,ppid,comm-e 全部进程-o 自定义输出字段只看需要的信息精简输出ps -l-l 长格式查看当前终端进程优先级、NI、状态4.2 top 实时进程监控动态刷新功能每秒刷新 CPU、内存、进程负载可按 M 内存 / P CPU 排序 常用操作q退出M按内存排序P按 CPU 排序。4.3 htoptop 升级版优势彩色界面、支持鼠标、直观进程树、操作快捷键更简单 补充Ubuntu 默认不预装安装命令bash运行sudo apt update sudo apt install htop4.4 kill 发送信号控制进程按 PID 操作表格命令信号编号作用kill -l无列出全部系统信号kill -2 PIDSIGINT等同于 CtrlC正常中断程序kill PIDSIGTERM(15)优雅终止允许程序保存数据、释放资源推荐优先用kill -9 PIDSIGKILL强制杀死无法拦截丢失缓存数据万不得已使用kill -19 PIDSIGSTOP暂停进程运行kill -18 PIDSIGCONT恢复暂停的进程4.5 killall 按进程名批量杀进程killall 进程名正常关闭所有同名进程killall -9 进程名强制全部杀死killall -i 进程名逐个询问确认再关闭4.6 pstree 进程树以树形展示父子进程关系直观看到谁创建了谁 示例pstree、pstree -p同时显示 PID。4.7 bg /fg 前后台任务管理jobs查看当前终端所有后台暂停任务任务编号bg 任务号把暂停的进程放到后台继续运行不占用终端输入fg 任务号后台进程切回前台占据终端可交互4.8 nice /renice 调整进程优先级优先级范围-20 ~ 19-20最高优先级优先分配 CPU仅 root 可设置0默认优先级19最低优先级nice -n 数值 命令启动程序时直接设置优先级 例nice -n 10 ./testrenice 数值 -p PID修改正在运行进程的优先级 例renice -5 -p 1234root 提升优先级05 进程的创建 fork ()5.1 fork 函数基础信息头文件c运行#include sys/types.h #include unistd.h函数原型c运行pid_t fork(void);功能复制当前父进程生成全新独立子进程。返回值重点必背返回 0数字当前是父进程返回值 子进程 PID返回 0当前是子进程返回 -1创建失败内存不足、进程数达到上限核心特性调用一次返回两次执行一行fork()代码分成两条执行流父子进程同时往下跑。5.2 父子进程内存机制写时拷贝 COW原文深度通俗讲解原文描述fork 创建子进程不会立刻完整复制内存只读时父子共享同一块物理内存任意一方修改数据才会单独拷贝一份内存给修改进程。通俗类比父子共用一本笔记物理内存只翻看不修改共用同一本 只要其中一方要写字修改系统单独复印一页给他两人各自一份互不影响。完整流程fork 后父子页表指向同一物理内存全部标记只读读变量直接共享不复制写变量修改全局 / 局部变量触发缺页异常内核分配新内存页复制原有数据给写操作进程后续修改只作用在自己的独立内存互不干扰。补充拓展代码段只读指令永久共享数据、栈、堆只有修改才拷贝大幅节省内存、加快 fork 创建速度。5.3 课后练习多进程分块拷贝文件需求fork 创建父子进程协同复制文件父进程拷贝文件前半段子进程拷贝后半段无重叠、无缺失实现思路补充原文拓展先用stat()获取源文件总大小计算分割中点父子进程分别打开文件共享文件指针会导致读写错乱lseek()精准移动读写偏移父从 0 开始子从中间位置开始读写循环判断剩余字节避免多读超出文件长度父进程使用wait()等待子进程拷贝完成防止产生僵尸进程。全文补充拓展知识点原文缺失高频考点1. 僵尸进程产生与解决产生原因子进程 exit 退出父进程未调用wait/waitpid回收。 危害长期堆积占用 PID 资源系统无法新建进程。 解决父进程结尾加wait(NULL);等待子进程回收。2. 孤儿进程父进程提前退出子进程失去父进程会被 PID1 的 systemd 收养自动回收不会变成僵尸。3. forkexec 配套使用fork 只复制进程exec 系列函数可以替换子进程为全新程序shell 执行命令底层原理bash fork 子进程子进程 exec 加载 ls/rm 等程序。4. 进程与线程区别进程有独立内存隔离性强、开销大线程共享同一进程内存开销小、无隔离。