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

相关推荐
面向星辰7 小时前
扣子开始节点和结束节点
java·服务器·前端
一匹电信狗7 小时前
【C++】封装红黑树实现map和set容器(详解)
服务器·c++·算法·leetcode·小程序·stl·visual studio
大锦终8 小时前
【Linux】网络层与数据链路层中重点介绍
linux·运维·服务器·网络
lht6319356128 小时前
从Windows通过XRDP远程访问和控制银河麒麟 v10服务器
linux·运维·服务器·windows
qiudaorendao9 小时前
作业11.9
linux·服务器·apache
岚天start10 小时前
解决方案—K8S集群的日志按天并按照命名空间分类定时同步到日志服务器
服务器·docker·kubernetes·shell·日志备份
顾安r10 小时前
11.10 脚本算法 五子棋 「重要」
服务器·前端·javascript·游戏·flask
gpfyyds66612 小时前
配置dns主从服务。要求从服务器能够定时从主服务器同步数据。
运维·服务器
倔强的石头10612 小时前
【Linux指南】操作系统的理解:从“内核”到“广义系统”的完整认知
linux·运维·服务器
我根本不会啊12 小时前
2025 11 09 作业
java·linux·服务器