编程与 AI13 分钟阅读更新于 2026-08-04

进程是什么:程序运行后如何被操作系统管理

围绕进程、进程控制块、状态转换和上下文切换,解释一个程序启动后如何获得资源并被操作系统调度。

相关工具

程序文件和进程不是同一个东西

程序最初只是保存在硬盘上的静态文件。它可以是一段可执行文件,也可以是一套等待被启动的程序内容。只有当系统把它装载到内存,并让 CPU 开始执行其中的指令时,它才进入了运行过程。这个正在运行的程序,就被称为进程。

相关基础内容 将进程描述为:具有独立功能的程序,在一个数据集合上的运行过程,也是系统进行资源分配和调度的独立单位。这个定义包含两个重点:进程不是文件本身,而是程序运行起来后的动态状态;操作系统管理的也不是抽象的代码,而是这次具体运行所占用的资源。

程序文件装载到内存并由 CPU 执行后形成进程的流程图
从程序文件到进程

程序保存在硬盘上时是静态文件,被装载到内存并开始执行后才成为进程。

进程为什么需要自己的资源边界

多个程序同时运行时,系统必须知道每个程序正在使用哪些内存、文件和设备。浏览器不能随意覆盖播放器的内存,某个程序打开的文件也不能被另一个程序无条件接管。进程因此要拥有自己的地址空间和资源记录,操作系统才能进行隔离、调度和回收。

这种独立不是说进程永远不能与其他进程交流,而是说默认情况下,每个进程的运行环境有清晰边界。需要共享数据时,要通过操作系统提供的进程间通信机制;需要访问文件和设备时,也要经过受控的系统服务。边界越清楚,系统越容易判断问题属于哪个任务。

PCB 是操作系统识别进程的凭证

操作系统不能只凭程序名称管理进程,因为同一个程序可能同时启动多个实例。系统会为每个进程建立进程控制块,通常简称 PCB,用它记录这个进程的身份、状态和资源信息。资料 把 PCB 称为进程存在的唯一标识。

PCB 中通常包含进程标识符和用户标识符,也包含当前状态、优先级、内存地址空间、已打开文件、使用中的输入输出设备等信息。进程被暂停或切换时,CPU 寄存器等运行现场也要保存到与进程相关的控制信息中,之后才能从原来的位置继续。

进程控制块 PCB 记录进程身份状态资源和 CPU 现场的结构图
PCB 记录进程的关键状态

PCB 把进程身份、运行状态、资源清单和 CPU 现场组织在一起,供操作系统管理。

进程的几种基本状态

进程并不是一直处于运行状态。运行态表示它当前占用 CPU;就绪态表示它已经具备运行条件,只是在等待处理器时间;阻塞态表示它正在等待某个事件,例如磁盘读取、网络数据或其他资源完成。

进程还可能经历创建和结束状态。创建状态表示系统正在为它建立控制信息和运行环境;结束状态表示它正在退出,系统需要收回它占用的资源。对于暂时被换出物理内存的进程,还可以用挂起状态描述它当前不在内存中的情况。挂起和阻塞不是同一个概念:阻塞主要是在等事件,挂起主要是在等待重新进入内存。

状态转换由什么事件触发

就绪态的进程获得调度后会进入运行态,分配的时间片用完后又可能回到就绪态。运行中的进程如果等待输入输出或其他资源,就会进入阻塞态;当等待的事件发生,它会回到就绪队列,等待下一次调度。

一个重要的判断是:缺少 CPU 时间通常只会让运行态进入就绪态,缺少磁盘、网络或其他外部资源才会使进程阻塞。系统不能因为暂时没轮到 CPU,就把进程误认为正在等待输入输出。区分这两类等待,有助于理解系统为什么看起来“还有空闲 CPU”,某个任务却仍然没有继续。

调度器如何在多个进程之间切换

当多个进程处于就绪状态时,操作系统需要从就绪队列中选择一个,让它获得 CPU。选择依据可能涉及优先级、等待时间、时间片和系统负载。具体算法可以不同,但共同目标是让处理器保持利用率,同时避免某个任务长期得不到运行机会。

调度不是把一个程序永久交给 CPU。运行中的进程可能因为时间片用完、主动睡眠、等待资源或被更高优先级任务抢占而离开处理器。它离开时,系统要保留足够的现场信息;下一次轮到它时,才能恢复到正确的指令位置和运行状态。

上下文切换到底切换了什么

一个进程切换到另一个进程运行,就发生了上下文切换。上下文不仅包括用户空间中的虚拟内存、栈和全局变量,也包括内核空间中的内核栈、寄存器等信息。系统需要先保存当前进程的现场,再装载下一个进程的现场。

上下文切换让多个任务能够共享 CPU,但它本身也需要时间。切换越频繁,保存和恢复状态的开销越多;切换太少,又可能让交互任务等待更久。因此,操作系统需要在响应速度、吞吐量和切换成本之间寻找平衡。

操作系统在两个进程之间保存和恢复运行现场的上下文切换流程图
一次上下文切换

系统保存当前进程的运行现场,装载另一个进程的现场,再让新的进程继续执行。

进程如何被创建和结束

创建新进程时,操作系统首先为它分配独立的 PCB,再准备内存和其他运行资源,初始化状态、优先级和寄存器等信息,最后把它放入就绪队列,等待调度。进程并不是创建出来就立即占用 CPU,而是要先完成这些管理准备。

进程结束时,系统要停止它的执行,回收它拥有的内存、文件和设备资源,并从 PCB 所在队列中删除。若它还存在子进程,系统还需要处理子进程的归属。完整的结束过程很重要,否则资源记录残留,就可能出现僵尸进程或资源无法及时释放的问题。

阻塞和唤醒是一对相反动作

进程需要等待某个事件时,操作系统会保存它的运行现场,把状态改为阻塞,并把 PCB 放入对应的等待队列。这样,进程不会继续占用 CPU 空转,处理器可以交给其他就绪任务。

当等待的事件发生后,系统会在对应的阻塞队列中找到这个进程,把它移出并改为就绪状态。它并不会因为被唤醒就立刻运行,还要等待调度器再次选择。唤醒解决的是“已经可以继续”,调度解决的是“什么时候真正获得 CPU”。

用一条主线理解进程

学习进程时,可以沿着“创建、就绪、运行、等待、再次就绪、结束”这条主线观察。程序被启动后获得 PCB 和资源,进入就绪队列;调度器让它运行;它可能因为时间片结束回到就绪,也可能因为等待外部事件进入阻塞;事件完成后,它再次等待调度,最后释放资源并结束。

这条主线把进程定义、PCB、状态转换和上下文切换连接在了一起。以后看到 Linux 中的进程列表、进程状态和进程切换,不必把它们当成孤立字段,而要问:这个任务当前拥有怎样的资源,正在等待什么,下一步由哪个系统事件推动。

常见问题

程序和进程有什么区别?

程序是保存在存储设备上的静态代码和数据,进程是程序被装载到内存并开始执行后形成的运行实体。

阻塞态和就绪态有什么区别?

就绪态表示进程已经可以运行,只是在等待 CPU;阻塞态表示进程还在等待输入输出或其他外部事件,暂时不具备继续运行的条件。

上下文切换为什么会有成本?

切换时需要保存当前进程的寄存器、内核栈和地址空间等运行现场,再恢复另一个进程的现场,这些保存和恢复动作都会消耗时间。