一、进程的空间分配

进程建立之后,系统则要为这个进程分配相应的空间,32Linux系统中,会为每个进程分配 4G 的空 间。
4G的进程空间主要分为两部分,高位1G是内核空间,低位3G是用户空间。
用户空间又具体分为如下区间:
.stack : 存放非静态的局部变量
.heap : 动态申请的内存
.bss : 未初始化过的全局变量(包括初始化为0,未初始化过的静态变量(包括初始化为0)
.data : 初始化过并且值不为0的全局变量,初始化过的不为0静态变量
.rodata : 只读变量(字符串之类)
.text : 程序文本段(包括函数,符号常量)
Tips:
1. 当用户进程需要通过内核获取资源时,会切换到内核态运行,此时当前进程会使用内核空间的资源
2. 用户需要切换到内核态运行时,主要是通过 系统调用

二、进程的堆栈大小

<1>Linux下进程栈的默认大小是8M,可以通过 ulimit -s 查看
<2>堆的大小理论上大概等于进程虚拟空间大小-内核虚拟内存大小,Linux下,进程的高位1G留给内核, 低位3G留给用户,所以进程堆大小小于3G
<3>最大进程数
Linux下,通过 ulimit -u 查看系统的最大进程数

三.进程状态简介

一个进程的生命周期可以划分为一组状态,这些状态刻画了整个进程。进程状态即体现一个进程的生命 状态。 进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态

1. 三态模型

一个进程从创建而产生至撤销而消亡的整个生命期间,有时占有处理器执行,有时虽可运行但分不
到处理器、有时虽有空闲处理器但因等待某个事件的发生而无法执行,这一切都说明进程和程序不
相同,它是活动的且有状态变化的,这可以用一组状态加以刻画。为了便于管理进程,一般来说,
按进程在执行过程中的不同情况至少要定义三种不同的进程状态:
1)运行(running)态:进程占有处理器正在运行。
2)就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行。
3)等待(wait)态:又称为阻塞(blocked)态或睡眠(sleep)指进程不具备运行条件,正在等待某个事件的完成。
通常,一个进程在创建后将处于就绪状态。每个进程在执行过程中,任意时刻当且仅当处于上述三
种状态之一。同时,在一个进程执行过程中,它的状态将会发生改变。引起进程状态转换的具体原
因如下:
1)运行态一一等待态:等待使用资源或某事件发生,如等待外设传输;等待人工干预。
2)等待态一一就绪态:资源得到满足或某事件己经发生,如外设传输结束;人工干预完成。
3)运行态一一就绪态:运行时间片到,或出现有更高优先权进程。
4)就绪态一一运行态:CPU空闲时被调度选中一个就绪进程执行。
以“打印一份文档”的进程为例:
1. 你点击“打印”后,“打印进程”创建,进入**就绪态**等打印机空闲);
2. 打印机空闲,系统调度它开始打印,进入**运行态**;
3. 打印到一半没纸了,进程暂停,进入**等待态(阻塞)**(等你加纸);
4. 你加好纸,进程重新具备运行条件,回到**就绪态**;
5. 打印机再次调度它,又进入**运行态**直到打印完成;
6. 若打印时突然有更紧急的“打印合同”进程插队(更高优先级),当前进程会从**运行态**回到**就绪态**,等合同打完再继续。

2.五态模型

在三态(运行、就绪、等待)基础上,增加了“新建态”和“终止态”,更完整地描述进程从创建到消亡的全生命周期。
 五态定义:
1. **新建态(New)**:进程刚被创建,尚未进入系统就绪队列(还在初始化,如分配资源、建立PCB)。
2. **就绪态(Ready)**:进程已初始化完成,等待CPU调度。
3. **运行态(Running)**:进程正在占用CPU执行。
4. **等待态(Blocked)**:进程因等待事件(如缺资源)暂停,不占用CPU。
5. **终止态(Terminated)**:进程完成任务或被强制结束,资源被回收(如PCB被删除)。
引入新建态和终止态对于进程管理来说是非常有用的。新建态对应于进程刚刚被创建的状态,创建
个进程要通过两个步骤,首先,是为一个新进程创建必要的管理信息;然后,让该进程进入就绪
态。此时进程将处于新建态,它并没有被提交执行,而是在等待操作系统完成创建进程的必要操
作。必须指出的是,操作系统有时将根据系统性能或主存容量的限制推迟新建态进程的提交。
类似地,进程的终止也要通过两个步骤,首先,是等待操作系统进行善后;然后,退出主存。当一
个进程到达了自然结束点,或是出现了无法克服的错误,或是被操作系统所终结,或是被其他有终
止权的进程所终结,它将进入终止态。进入终止态的进程以后不再执行,但依然保留在操作系统中
等待善后。一旦其他进程完成了对终止态进程的信息抽取之后,操作系统将删除该进程。
例子(下载文件进程):
1. 你点击“下载”,系统创建“下载进程”——**新建态**(正在分配内存、初始化网络连接)。
2. 初始化完成,进程进入系统就绪队列——**就绪态**(等CPU调度)。
3. CPU选中它,开始下载数据——**运行态**。
4. 网络中断,进程暂停等待——**等待态**(等网络恢复)。
5. 网络恢复,回到**就绪态**(再等CPU调度)。
6. 再次被调度,继续下载直到完成——**运行态**→任务结束,进入**终止态**(释放内存、关闭网络连接)。
核心:五态模型通过“新建”和“终止”态,细化了进程“出生”和“死亡”的环节,让系统对进程的管理更精准。

3.通过用户输入来理解进程状态的变化

#include <stdio.h>
int main()
{
    int num=-1;
    printf("please input number:");
    scanf("%d",&num);
    printf("num=%d\n",num);
    return 0;
}
状态的变化过程:
TASK_RUNNING-------->TASK_INTERRUPTIBLE 等待用户输入
用户输入完成后 TASK_INTERRUPTIBLE------------->TASK_RUNNING
程序运行结束 TASK_RUNNING--------->TASK_ZOMBIE

4.经常使用的进程状态

1运行态(TASK_RUNNING) : 此时进程或者正在运行,或者准备运行,就绪或者正在进行都属于运行态
2睡眠态(TASK_SLEEP): 此时进程在等待一个事件的发生或某种系统资源
        可中断的睡眠(TASK_INTERRUPT) : 可以被信号唤醒或者等待事件或者资源就绪
        不可中断的睡眠(TASK_UNTERRUPT) : 只能等待特定的事件或者资源就绪
3停止态(TASK_STOPPED) : 进程暂停接受某种处理。例如:gdb调试断点信息处理
4僵尸态(TASK_ZOMBIE:进程已经结束但是还没有释放进程资源

5.停止态与僵尸态

补充小知识:PCB 是 Process Control Block(进程控制块) 的缩写,是操作系统中管理和控制进程的核心数据结构,可以理解为进程的 “身份证”+“状态档案”+“资源清单”。

操作系统通过 PCB 记录进程的关键信息,实现对进程的调度、状态管理、资源分配等所有操作 ——一个进程存在的唯一标志就是它的 PCB(只要 PCB 存在,进程就被系统认为 “存在”)。

PCB 主要包含这些关键信息:

  1. 进程标识符(PID):唯一标识一个进程的编号(类似身份证号),用于区分不同进程。
  2. 进程状态:记录进程当前处于运行态、就绪态、阻塞态等(对应之前讲的三态 / 五态模型)。
  3. 程序计数器(PC):记录进程下一条要执行的指令地址(CPU 切换进程时,靠它恢复执行位置)。
  4. 寄存器集合:保存进程执行时 CPU 寄存器的当前值(如累加器、栈指针等),用于进程切换时的 “上下文保存”。
  5. 内存指针:指向进程占用的内存空间(如代码段、数据段、栈段的地址范围)。
  6. 资源清单:记录进程打开的文件、占用的 I/O 设备等资源(如打开的文档、网络连接)。
  7. 优先级:决定进程被 CPU 调度的优先顺序(高优先级进程更易被选中执行)。
  8. 父子进程关系:记录该进程的父进程 PID(用于进程树管理,如 Linux 中进程的继承关系)。

僵尸态(TASK_ZOMBIE)和停止态(TASK_STOPPED)不属于通用的 “五态模型”,它们是 Linux 等特定操作系统在通用五态基础上,为满足实际管理需求(如调试、进程资源回收)新增的细化状态

1. 先明确:通用五态模型的核心范围

通用五态模型(新建→就绪→运行→阻塞→终止)是操作系统理论中的 “基础框架”,只覆盖进程从 “创建初始化” 到 “完全消亡” 的核心生命周期阶段,不包含以下两种特殊场景:

  • 进程 “已结束但资源未回收” 的中间状态(对应僵尸态);
  • 进程 “被主动暂停(如调试)” 的非核心执行状态(对应停止态)。

2. 为什么僵尸态、停止态不在五态模型中?

(1)僵尸态(TASK_ZOMBIE):五态 “终止态” 的 “特殊细分”

通用五态的 “终止态” 是理想状态—— 认为进程结束后会立即释放所有资源(包括 PCB 进程控制块)。但 Linux 中,父进程需要通过wait()系列函数 “确认” 子进程的退出状态,才能彻底回收子进程的 PCB。若父进程未及时处理,子进程就会进入 “僵尸态”

  • 此时进程已停止执行(代码跑完),但残留 PCB(记录退出状态)未释放,属于 “终止过程中的临时过渡状态”,而非五态模型中 “完全释放资源” 的终止态。
  • 通用五态模型简化了 “终止” 环节,未包含这种 “过渡性残留状态”。
(2)停止态(TASK_STOPPED):五态模型未覆盖的 “调试专属状态”

通用五态模型的状态划分,核心围绕 “进程能否被 CPU 调度运行”(就绪 / 运行)或 “是否因等资源暂停”(阻塞)。而停止态是进程被主动暂停执行的特殊场景(gdb调试断点、Ctrl+Z暂停进程),它的特点是:

  • 既不属于 “就绪态”(就绪态是 “可被调度”,停止态需手动 / 调试命令恢复,不能被 CPU 主动调度);
  • 也不属于 “阻塞态”(阻塞态是 “等资源 / 事件”,停止态是 “等调试指令”,本质是人为干预暂停)。
  • 通用五态模型面向 “常规任务执行”,未考虑 “调试” 这类特殊干预场景,因此不包含停止态。

简单说:五态是 “通用大纲”,僵尸态、停止态是 Linux 在 “大纲” 外新增的 “细节补充”。

本次总结我们对进程显然有了更加深刻的了解,下次让我们一起学习进程的相关操作!

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐