一、进程基础概念

程序:存放在外存中的一段代码集合,是静态文件。

进程:程序动态执行的过程,包含创建、调度、消亡完整生命周期。

程序是磁盘上的文件,进程是这个文件跑起来之后的实例。

Linux 进程常用命令

命令 作用
top 按 CPU 占用率查看进程信息,可看到 PID、PPID
ps -ef 查看进程信息
pstree 查看进程父子关系树
ps -aux 查看进程运行状态
kill -9 PID 根据 PID 强制杀死进程
killall -9 进程名 根据进程名杀死进程
前后台任务操作
  1. ./a.out &:程序放到后台执行
  2. jobs:查看当前终端后台任务
  3. fg 编号:把后台任务调到前台运行
  4. ps:查看该终端下前后台任务
进程优先级
  • nice -n 优先级 进程任务:启动进程时设置优先级
  • renice -n 优先级 进程PID:修改已经运行进程的优先级

PID:进程唯一 ID;

PPID:父进程 ID。

二、进程内存空间(32 位系统)

32 位操作系统下进程拥有 0‑4G 虚拟内存空间,分为文本段、数据段、系统数据段。

  1. 文本段:存放程序指令
  2. 数据段:字符串常量、未初始化全局 / 静态变量、初始化全局 / 静态变量
  3. 系统数据段:堆区、栈区

进程内存特性

  1. 每个进程拥有独立进程空间,进程之间互相隔离
  2. 所有进程共享 0‑4G 虚拟内存地址空间
  3. CPU 对进程分时复用,通过 MMU 内存映射单元,把虚拟地址映射到物理内存。

内存布局由低地址到高地址大致:文本段 → 数据段(.data/.bss/.rodata) → 堆区 → 栈区。

三、进程调度

多个进程需要同时运行,依靠操作系统调度算法分配 CPU 时间。

常见调度算法

  1. 先来先执行,后来后执行
  2. 高优先级调度算法
  3. 时间片轮转调度算法:宏观并行,微观串行。CPU 分给每个进程一小段执行时间,叫做时间片
  4. 多级队列反馈调度算法
  5. 负载均衡调度算法

进程 7 种状态

  1. 就绪态 (R):还没被 CPU 轮到,等待调度
  2. 运行态 (R):正在被 CPU 执行
  3. 可唤醒等待态 (S):缺少资源挂起,等待期间可以被唤醒
  4. 不可唤醒等待态 (D):等待过程中不能被唤醒
  5. 停止态 (T):进程被系统暂停
  6. 僵尸态 (Z):进程代码执行完毕,但内存资源没有被回收
  7. 结束态 (X):进程结束,资源完成回收

四、进程创建相关 API

1. fork () 创建子进程

pid_t fork(void);
  • 功能:创建子进程,复制父进程地址空间
  • 返回值:
    • 父进程:返回子进程 PID
    • 子进程:返回0
    • 失败:返回‑1

fork 之后父子进程分开运行,拥有各自独立虚拟地址空间。

2. getpid() / getppid()

pid_t getpid(void);   // 获取自己进程PID
pid_t getppid(void);  // 获取父进程PID

3. exit () 结束进程

void exit(int status);
  • 功能:结束当前进程
  • 注意:
    • main 函数中exit()return效果一致
    • 普通函数内return只是结束函数;exit直接结束整个进程

五、进程消亡与僵尸进程

僵尸进程产生原因

子进程代码执行结束,但是父进程没有回收子进程资源,子进程就变成僵尸进程 (Z 状态)。

两种避免僵尸进程方案

  1. 父进程先结束:子进程变成孤儿进程,会被 init 进程收养;子进程退出时 init 自动回收资源。
  2. 父进程主动回收子进程:子进程退出,父进程调用回收接口释放子进程资源。

六、wait () 子进程资源回收

pid_t wait(int *wstatus);
  • 功能:阻塞等待,回收子进程资源,防止僵尸进程,实现任务同步
  • 参数:wstatus,保存子进程退出状态的地址
  • 返回值:成功返回被回收子进程 PID;失败返回‑1

配套宏,解析 wstatus 状态:

  1. WIFEXITED(wstatus):判断子进程是否正常退出
  2. WEXITSTATUS(wstatus):获取子进程 exit 退出返回值
  3. WIFSIGNALED(wstatus):判断子进程是否被信号杀死
  4. WTERMSIG(wstatus):获取杀死进程的信号编号

wait 是阻塞函数,如果还有子进程没结束,父进程会卡在 wait 这里等待。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐