11.2 进程的结构

Windows、macOS 或 Linux 等操作系统的任务之一是控制正在运行的进程。这些进程可以是浏览器或 IDE 等 UI 应用程序,也可以是网络服务或操作系统服务等后台进程。

为了控制这些进程,操作系统提供了用于启动新进程的 API。创建进程时,操作系统会对其进行注册,以便知道哪些进程正在运行。进程被赋予了唯一的 ID (PID)。根据操作系统的不同,它们可以具有几个其他属性。

POSIX 进程具有在操作系统中注册的最小属性集:

  • 控制终端;

  • 当前工作目录;

  • 有效组 ID 和有效用户 ID;

  • 文件描述符和文件模式创建掩码;

  • 进程组 ID 和进程 ID;

  • 真实组 ID 和真实用户 ID;

  • 根目录。

你可以在 macOS 或 Linux 中通过运行 ps 命令查看运行的进程的这些属性。

参见

IEEE POSIX 标准(1003.1-2017)定义了进程和线程的接口和标准行为。

Windows 具有类似的属性列表,但设置了自己的标准。Windows 文件权限、目录结构和进程注册表与 POSIX 有很大不同。

Windows 进程由 Win32_Process 表示,其可以在 WMI、Windows Management Instrumentation 运行时或使用任务管理器查询。

在操作系统上启动一个进程后会得到:

  • 用于调用子程序的内存;

  • (参见“C 中的动态内存分配”);

  • 操作系统上文件套接字的访问途径。

当进程执行时,计算机上的 CPU 还会保留其他数据,如:

  • 一个寄存器保存了当前正在执行的指令或进程因该指令所需的其他任何数据;

  • 一个指令指针程序计数器指示了程序序列中哪条指令正在执行。

CPython 进程包括已编译的 CPython 解释器和已编译的模块。这些模块在运行时加载并通过 CPython 求值循环转换为指令:

图片内容: Process:进程, Stack:栈, Heap:堆, Process Memory:进程内存, Python Objects:Python 对象, Instructions:指令, CPython Runtime:CPython 运行时, Compiled Modules:编译模块, Files:文件, Locks:锁, Sockets:套接字

程序寄存器和程序计数器指向进程中的单个指令。这意味着在任何时候只能执行一条指令。对于 CPython 而言,这意味着在给定时间只能执行一条 Python 字节码指令。

有两种主要方法允许在进程中并行执行指令:

  1. fork 另一个进程。

  2. spawn 一个线程。

现在你已经回顾了进程的构成,可以探索 fork 和 spawn 子进程了。

Last updated