Linux/C++ 多进程篇
前言
你有没有想过,为什么你的程序只能一件事一件事地处理?就像一个忙碌的服务员,面对众多顾客,却只能一次服务一个人,其他人只能排队等待。
但在现实生活中,我们常常需要同时处理多件事情:
浏览器同时加载多个网页 服务器同时响应成百上千的客户端请求 视频播放器在播放视频的同时,还能下载后续内容
这背后,靠的就是程序的'分身术'——多进程编程。今天,我们从最底层的内存世界出发,揭开 C++ 多进程'分身术'的神秘面纱。
多进程理论基础
一、为什么要引入多进程
想象一下,你是一个人(单进程),正在厨房里做饭(处理业务)。
- 现状:你切菜、炒菜、洗碗一把抓。
- 风险:如果你不小心切到了手(程序崩溃/段错误),或者被一道复杂的菜难住死住了(死循环),整个厨房就瘫痪了,客人吃不上饭,甚至房子都可能着火(服务宕机)。
这时候,'分身术'出现了。
你喊了一声'变!',瞬间变出了另一个你(子进程)。
- 老大(父进程):负责站在门口迎客、指挥调度、监控老二的状态。
- 老二(子进程):专门负责进厨房炒菜。
核心收益:
如果老二在厨房里被油烫伤了(子进程崩溃),老大毫发无损!老大可以立刻再变出一个'老三'继续炒菜,客人甚至感觉不到中间停顿了。
这就是多进程存在的第一原动力:隔离与容错。
二、多进程相关概念
- 进程是程序的一次执行过程,有一定的生命周期,包含了创建态、就绪态、执行态、挂起态、死亡态
- 进程是计算机资源分配的基本单位,系统会给每个进程分配 0--4G 的虚拟内存,其中 0--3G 是用户空间,3--4G 是内核空间
其中多个进程中 0--3G 的用户空间是相互独立的,但是,3--4G 的内核空间是相互共享的
用户空间细分为:栈区、堆区、静态区
- 进程的调度机制:时间片轮询上下文切换机制
我们可以看到下图中,我们的 CPU 不停的向我们运行队列中的程序分配时间片,让程序轮流来完成任务,这就是我们的时间片轮询上下文切换机制。

- 并发和并行的区别
并发:针对于单核 CPU 系统在处理多个任务时,使用相关的调度机制,实现多个任务进行细化时间片轮询时,在宏观上感觉是多个任务同时执行的操作,同一时刻,只有一个任务在被 CPU 处理
并行:是针对于多核 CPU 而言,处理多个任务时,同一时间,每个 CPU 处理的任务之间是并行的,实现的是真正意义上多个任务同时执行的
三、进程的内存管理
此处我们就用一图来带大家快速了解我们进程中的内存管理。



















