# 11.2 进程的结构

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

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

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

* 控制终端；
* 当前工作目录；
* 有效组 ID 和有效用户 ID；
* 文件描述符和文件模式创建掩码；
* 进程组 ID 和进程 ID；
* 真实组 ID 和真实用户 ID；
* 根目录。

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

{% hint style="info" %}
**参见**

IEEE POSIX 标准（1003.1-2017）定义了进程和线程的接口和标准行为。
{% endhint %}

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 子进程了。
