一、进程本质与核心结构
进程是程序在计算机中的执行过程,操作系统为其分配内存、CPU等资源,是资源调度和分配的基本单位。与静态存储在硬盘中的程序不同,进程具有动态性,涵盖创建、调度、运行到消亡的完整生命周期。
程序是永存的代码与数据集合,而进程是暂时的执行过程。进程会经历状态变化,支持并发执行,且多个进程之间会竞争系统资源。一个程序可多次运行生成多个进程,一个进程也可关联运行一个或多个程序。
进程控制块(PCB)是描述进程的核心结构体,包含进程运行所需的所有关键信息:
- 进程标识符(PID):唯一标识进程的编号
- 系统属性:当前工作路径、用户ID(UID)、组ID、umask权限掩码(默认0002)
- 资源管理:进程打开的文件列表(默认最大1024个)、栈大小(默认8192KB即8M)等资源限制
- 运行状态:信号处理配置、CPU寄存器状态、程序计数器(PC)等
- 内存映射:虚拟地址与物理地址的映射关系,由内存管理单元(MMU)负责地址转换
二、内存空间与隔离机制
进程的内存空间划分为多个区域:
- 代码段(Code):存储程序的可执行代码,权限为只读
- 数据段(Data):存储已初始化的全局变量和静态变量
- 堆(Heap):动态内存分配区域,由程序员通过malloc、free等函数手动管理
- 栈(Stack):存储局部变量、函数参数和返回地址,默认大小为8M,遵循"先进后出"原则
- 共享/映射区(Share/map):用于进程间共享数据或映射文件内容
多进程环境中,操作系统通过两大机制保障稳定性和安全性:
- 内存隔离:借助MMU实现虚拟内存技术,每个进程拥有独立的虚拟地址空间
- 权限控制:进程访问内核资源需通过权限校验,防止未授权操作破坏系统稳定性
三、进程分类与核心功能
根据运行特性和使用场景,进程可分为三类:
- 交互式进程:运行过程中需要用户输入交互,如终端命令执行、图形界面应用
- 批处理进程:通过shell脚本批量执行预设命令,无需实时用户干预
- 守护进程:后台自动运行的进程,默认处于休眠状态,通常以"d"为后缀命名
进程的核心价值在于实现"并发"------操作系统在一个时间段内同时运行多个任务的能力。宏观上看多个进程似乎在同时运行;微观上,由于CPU资源有限,通过调度算法实现进程的快速切换。
四、进程状态与转换机制
Linux系统中进程具有以下关键状态:
- 运行态(Running,0):分为用户运行态和内核运行态,进程正在占用CPU执行指令
- 就绪态:进程已具备运行条件,等待CPU调度
- 可中断睡眠状态(Interruptible,1):进程因等待资源而睡眠,可被信号唤醒
- 不可中断睡眠状态(Uninterruptible,2):进程深度睡眠,用于关键资源等待
- 暂停状态(Stopped):进程被暂停执行,需通过特定信号恢复
- 终止态(3):进程执行完毕或异常终止
- 僵死状态(Zombie):子进程消亡后,用户内存空间释放,但内核中的PCB未被回收
状态转换规则:
- 就绪态→运行态:CPU调度器选择就绪队列中的进程分配时间片
- 运行态→就绪态:进程时间片耗尽,或有更高优先级进程进入就绪态
- 运行态→阻塞态(睡眠状态):进程等待资源,主动放弃CPU
- 阻塞态→就绪态:等待的资源满足,进程被唤醒
- 运行态→终止态:进程正常结束或异常终止
- 终止态→僵死态:子进程先于父进程消亡,PCB未被回收
五、进程调度算法
Linux采用多种调度算法:
- 时间片轮转:将CPU时间划分为固定长度的时间片,按顺序分配给就绪进程
- 短任务优先:优先调度执行时间较短的进程,减少平均等待时间
- 进程优先级:进程拥有静态优先级(PR)和动态优先级(NI)
- 完全公平调度算法(CFS):基于"完全公平"原则,动态调整调度权重
六、进程上下文切换
当一个进程的时间片耗尽或主动放弃CPU时,操作系统会触发上下文切换:
- 保存当前进程状态:将进程的PCB信息、CPU寄存器值、程序计数器(PC)、内存数据等缓存至硬盘
- 释放CPU资源:当前进程从运行态转为就绪态或阻塞态
- 加载目标进程:从硬盘读取待运行进程的缓存数据,恢复其PCB、寄存器状态
七、进程操作命令与函数
常用命令:
ps aux:显示系统中所有进程的详细信息top:实时监控进程状态,动态刷新CPU、内存使用情况kill -9 pid:强制终止指定PID的进程killall -9 进程名:强制终止所有同名进程ulimit -a:查看当前用户的进程资源限制
核心系统函数:
pid_t fork():从当前进程克隆一个子进程pid_t getpid(void):获取当前进程的PIDpid_t getppid(void):获取当前进程的父进程PIDvoid exit(int status):C库函数,终止进程时刷新缓冲区void _exit(int status):系统调用,终止进程时不刷新缓冲区pid_t wait(int *status):父进程阻塞等待任意子进程退出
八、特殊进程
僵尸进程:
- 产生原因:子进程先于父进程消亡,父进程未调用wait/waitpid回收其PCB
- 危害:僵尸进程的PCB占用内核内存,长期积累会导致内核内存不足
- 排查:通过
ps aux或top命令查看状态为"Z"的进程
孤儿进程:
- 产生原因:父进程先于子进程消亡,子进程失去父进程
- 处理机制:孤儿进程会自动被init进程(PID=1)或系统指定进程收养