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

相关推荐
Lenyiin3 小时前
《 Linux 点滴漫谈: 三 》掌控终端:让 Shell 成为你的系统魔杖
linux·运维·服务器·lenyiin
霖.244 小时前
Docker常见问题
服务器·docker·云原生·容器
一匹电信狗4 小时前
【MySQL】数据库表的操作
linux·运维·服务器·数据库·mysql·ubuntu·小程序
撬动未来的支点4 小时前
【Linux】Linux 零拷贝技术全景解读:从内核到硬件的性能优化之道
linux·服务器·性能优化
ajassi20004 小时前
开源 Linux 服务器与中间件(六)服务器--Lighttpd
linux·服务器·开源
milanyangbo5 小时前
从C10K到Reactor:事件驱动,如何重塑高并发服务器的网络架构
服务器·网络·后端·架构
爱吃生蚝的于勒5 小时前
【Linux】深入理解进程(一)
java·linux·运维·服务器·数据结构·c++·蓝桥杯
月球挖掘机5 小时前
华为USG防火墙之开局上网配置
服务器·网络
噔噔君5 小时前
嵌入式模组拨号获取IP地址时,设置的ippass是什么原理,起到什么作用?
服务器·网络协议·tcp/ip·ip