【C/C++】进程

一、进程是什么?------ 程序的 "动态化身"

进程是程序在计算机中的一次执行过程,是操作系统资源分配和调度的基本单位。如果把程序比作存放在硬盘上的 "食谱",那么进程就是厨师按照食谱烹饪的 "动态过程"------ 它不仅包含程序代码(文本段),还涵盖运行时所需的数据(数据段、堆)、栈空间、寄存器状态、进程控制块(PCB)等核心资源。

在 Linux 系统中,所有进程都源于init进程(PID=1),通过 fork/exec 机制创建新进程,形成树形结构。使用ps -ef命令可查看系统中所有进程的 PID(进程唯一标识)、PPID(父进程 ID)、状态等关键信息,这是排查进程问题的基础操作。

二、进程的生命周期与状态转换

进程从创建到终止会经历多个状态,Linux 系统中核心状态包括 5 种:

  1. 运行态(R):进程正在 CPU 上执行,或处于就绪队列等待调度;
  1. 就绪态:进程已分配所有必要资源,只需等待 CPU 空闲即可执行;
  1. 阻塞态(D):进程因等待某类事件(如 I/O 完成、信号量)而暂停,此时即使 CPU 空闲也无法执行;
  1. 终止态(Z):进程执行完毕,但父进程未回收其资源(如 PCB),形成 "僵尸进程";
  1. 暂停态(T):进程被信号暂停(如kill -STOP PID),需通过kill -CONT PID恢复。

状态转换的核心触发事件包括:CPU 调度(R↔就绪)、I/O 请求(R→D)、信号处理(R→T)、进程退出(R→Z)等。理解状态转换是定位进程卡顿、僵尸进程等问题的关键。

三、进程管理的核心操作与实践

1. 进程创建:fork 与 exec 的协同
  • fork():通过复制父进程创建子进程,子进程与父进程共享代码段,数据段和栈空间独立(写时复制);
  • exec():替换进程的代码段和数据段,加载新程序执行,PID 保持不变。

示例代码(C 语言):

复制代码

#include <stdio.h>

#include <unistd.h>

int main() {

pid_t pid = fork(); // 创建子进程

if (pid == 0) {

execlp("ls", "ls", "-l", NULL); // 子进程执行ls命令

} else if (pid > 0) {

wait(NULL); // 父进程等待子进程结束

printf("子进程执行完毕\n");

}

return 0;

}

2. 进程通信(IPC)机制

进程拥有独立地址空间,无法直接访问彼此数据,需通过 IPC 机制实现通信:

  • 管道(Pipe):半双工通信,适用于父子进程;
  • 消息队列(Message Queue):按类型传递数据,支持非亲缘进程;
  • 共享内存(Shared Memory):最快的 IPC 方式,进程直接访问共享内存区域;
  • 信号量(Semaphore):用于同步与互斥,防止并发冲突。
3. 进程调度:抢占式与非抢占式

操作系统通过调度算法分配 CPU 资源,Linux 采用完全公平调度(CFS)

  • 为每个进程分配权重,计算虚拟运行时间;
  • 优先调度虚拟运行时间最短的进程,保证公平性;
  • 支持实时进程(SCHED_FIFO/SCHED_RR),优先级高于普通进程。

四、常见进程问题排查

  1. 僵尸进程:父进程未调用wait()回收子进程资源,可通过kill -9 父进程PID解决;
  1. 孤儿进程:父进程先于子进程退出,子进程被init进程(PID=1)收养,资源会被正常回收;
  1. 进程占用过高 CPU:使用top命令定位高 CPU 进程,结合perf工具分析代码瓶颈;
  1. 进程阻塞:通过ps -aux | grep D查看阻塞进程,排查 I/O 设备或资源依赖问题。

五、总结

进程是操作系统抽象的核心,理解其本质、生命周期、管理机制和 IPC 通信,是掌握系统编程和性能优化的基础。无论是开发多进程应用,还是排查系统故障,都需要深入理解进程的工作原理。实际开发中,需根据场景选择合适的进程创建方式和 IPC 机制,同时关注进程状态和资源占用,避免出现僵尸进程、资源泄漏等问题。

后续将进一步探讨线程、进程池、容器化(Docker)等基于进程的高级应用,欢迎持续关注!

相关推荐
遇见火星1 分钟前
Linux 如何设置开机自启:全面指南!
linux·运维·服务器·systemd
玥轩_5211 小时前
OSPF路由协议单区域配置
服务器·网络·智能路由器·交换机·ospf·动态路由
小陈phd1 小时前
大语言模型实战(五)——大模型开发范式演进:从“调用API”到“多Agent复杂目标”
服务器·microsoft·语言模型
QQ__17646198241 小时前
SSH远程时找不到模块ModuleNotFoundError
linux·服务器·ssh
CHANG_THE_WORLD2 小时前
6.2.在汇编层面,数据本身没有类型
java·服务器·汇编
wangchen_02 小时前
Linux文件描述符定时器:timerfd系列接口
linux·运维·服务器
不染尘.2 小时前
TCP客户服务器编程模型
linux·服务器·网络·网络协议·tcp/ip·计算机网络·ssh
Trouvaille ~2 小时前
【Linux】目录、路径与软硬链接:Linux文件组织的奥秘
linux·运维·服务器·chrome·文件系统·软硬链接·路径缓存
Xの哲學2 小时前
Linux AQM 深度剖析: 拥塞控制
linux·服务器·算法·架构·边缘计算
lifejump3 小时前
Pikachu | SSRF
服务器·web安全·安全性测试