程序是存储在文件中的可执行代码和数据。进程则是活动的执行上下文:它包含已映射代码、内存、凭据、打开的文件描述符、信号状态、调度信息和一个或多个线程。同一个程序可以有许多相互独立的进程实例。
进程 · 第 3 课
进程详情
学习哪些状态和资源把运行中的进程与存储在磁盘上的程序区分开来。
程序实例和 PID
例如,在两个终端中不带操作数启动 cat。每个实例都会等待输入并拥有自己的进程 ID:
$ pgrep -a cat
18420 cat
18457 cat
两个进程执行同一个程序,但可以拥有不同的输入流、内存内容、凭据、工作目录和生命周期。PID 每次只标识一个活动进程,进程退出后可以重复使用。
同一程序的两个运行实例有什么区别?
内核跟踪的状态
内核维护调度和控制每个进程所需的信息,包括:
- 进程和父进程标识符
- 用户和组凭据
- 虚拟内存映射
- 打开的文件描述符和当前目录
- 信号处置和待处理信号
- 调度策略、优先级和执行状态
- CPU 时间等计量数据
某些底层资源可以共享。相关进程可以共享映射内存,一个进程中的线程也共享地址空间和许多进程范围资源。因此,进程提供隔离边界,但并不表示每个字节或内核对象在物理上都私有。
哪个组件维护 Linux 进程的调度和凭据状态?
CPU 调度和内存
可运行线程会争用 CPU 时间。内核调度器根据调度类别、优先级、CPU 亲和性、负载和策略,选择哪个线程在哪个 CPU 上运行。这并不保证每个进程获得相等份额。
每个进程通常看到一个虚拟地址空间。内核和硬件会把虚拟地址映射到物理内存或其他后备存储、实施保护,并在适当时共享页面。因此,ps 或 top 中的内存数值不一定是唯一归属于该进程的物理 RAM 量。
Linux 调度器选择什么?
进程退出和资源清理
进程退出时,内核会释放其大多数私有资源、关闭剩余描述符,并为父进程记录终止信息。父进程取回退出状态前,少量进程表记录可以作为僵尸进程保留。因此,“进程已经执行完毕”和“进程表中的所有痕迹都已消失”并不总是同时发生。
为什么已退出进程可能短暂地作为僵尸进程保留?
使用管理和监控 Linux 进程实验启动多个实例并比较 PID 和状态。Linux top 命令实验提供不断变化的调度和资源指标视图。
课程已完成
你已完成 进程详情
现在,你可以把进程描述为不只是一个程序文件。
区分存储的可执行代码和活动进程实例。
识别内核跟踪的状态和资源。
把调度与可运行线程联系起来,而不是相等份额。
认识到退出状态会保留到父进程收集它为止。