# 十一、并行和并发

第一批计算机被设计成一次做一件事。它们的很多工作都是在计算数学领域。随着时间的推移，计算机需要处理各种来源的输入，有些甚至远至遥远的星系。

其结果是，计算机应用程序现在花费大量时间等待响应，这些时间消耗或者来自总线、输入、存储单元、计算、API，或者来自远程资源。

计算领域的另一个进步是从单用户终端转向多任务操作系统。应用程序需要在后台运行，以便在网络上监听和响应，并处理鼠标光标等输入。

早在现代多核 CPU 出现之前就需要处理多任务，因此操作系统长久以来都能在多个进程之间共享系统资源。

任何操作系统的核心都是运行进程的注册表。每个进程都有一个所有者，并且进程可以请求内存或 CPU 等资源。内存分配的内容你已经在上一章中探索了。

对于 CPU，进程将以待执行的操作的形式请求 **CPU 时间**。操作系统控制着哪个进程使用 CPU。其实现方式是根据优先级来分配 CPU 时间和调度进程：

图片内容： Concurrent Model: 并发模型， Task A: 任务 A， Executing: 执行中， Waiting: 等待中， Time: 时间

一个进程可能需要同时处理多件事情。例如，如果你使用文字处理器，它需要在你打字时检查你的拼写。现代应用程序通过并发运行多个线程并处理它们自己的资源来实现这一点。

并发是处理多任务的绝佳解决方案，但 CPU 有其局限性。一些高性能计算机部署多个 CPU 或多个核来分散任务。操作系统提供了一种跨多个 CPU 调度进程的方法：

图片内容： Parallel Model: 并行模型， Task A: 任务 A， Executing: 执行中， Waiting: 等待中， Time: 时间

综上所述，计算机使用并行和并发来处理多任务处理问题：

* 要具有**并行性**，你需要多个计算单元。计算单元可以是 CPU 或核。
* 要获得**并发性**，你需要一种任务调度策略，使得空闲的任务不锁定资源。

CPython 设计的许多部分通过抽象操作系统的复杂性，为开发者提供一种简单的 API。CPython 处理并行和并发的方法也不例外。
