【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)等基于进程的高级应用,欢迎持续关注!

相关推荐
爱学习的小囧14 分钟前
VMware ESXi 6.7U3v 新版特性、驱动集成教程和资源包、部署教程及高频问答详情
运维·服务器·虚拟化·esxi6.7·esxi蟹卡驱动
小疙瘩18 分钟前
只是记录自己发布若依分离系统到linux过程中遇到的问题
linux·运维·服务器
dldw7771 小时前
IE无法正常登录windows2000server的FTP服务器
运维·服务器·网络
我是伪码农2 小时前
外卖餐具智能推荐
linux·服务器·前端
汤愈韬2 小时前
下一代防火墙通用原理
运维·服务器·网络·security
IMPYLH2 小时前
Linux 的 od 命令
linux·运维·服务器·bash
数据雕塑家4 小时前
Linux下大文件切割与合并实战:解决FAT32文件系统传输限制
linux·运维·服务器
IMPYLH4 小时前
Linux 的 nice 命令
linux·运维·服务器·bash
yleihj5 小时前
vCenter计算机SSL证书续期
服务器·网络协议·ssl
航Hang*5 小时前
Windows Server 配置与管理——第12章:配置数字证书服务器
运维·服务器·windows