2026-06-08 / 基础知识技能

计算机为什么能跑程序:组成原理、存储、链接与并发

程序能跑起来,看似理所当然,但背后其实依赖一整套分层很清晰的硬件和系统能力。CPU、内存、存储器、链接器、进程、线程、协程、网络分层,这些概念看起来散,其实都在回答同一个问题: 程序如何被装载、执行、通信和调度 。

基础知识算法编程基础

计算机为什么能跑程序:组成原理、存储、链接与并发

程序能跑起来,看似理所当然,但背后其实依赖一整套分层很清晰的硬件和系统能力。CPU、内存、存储器、链接器、进程、线程、协程、网络分层,这些概念看起来散,其实都在回答同一个问题:程序如何被装载、执行、通信和调度

flowchart LR
    A["源代码"] --> B["编译 / 汇编 / 链接"]
    B --> C["可执行文件"]
    C --> D["装载到内存"]
    D --> E["CPU 执行"]
    E --> F["进程 / 线程 / 协程调度"]

计算机组成原理到底在说什么

计算机组成原理描述的是系统结构的逻辑实现,包括:

  • 控制器。
  • 运算器。
  • 存储器。
  • 输入设备。
  • 输出设备。

CPU 负责计算,寄存器负责极快的小规模状态,内存负责大容量临时存放,外部存储负责长期保存。

为什么要理解这些

因为程序不是“写完就自然运行”,而是要被装载进内存,交给 CPU,靠调度和存储协同执行。你写的代码性能差、内存高、I/O 慢,很多时候都不是“语言问题”,而是你没有理解这些底层约束。

CPU 主频、时钟周期和性能

CPU 主频并不等于真实性能,但它确实决定了一个很基础的速度上限。

csharp
// 程序的 CPU 执行时间 = CPU 时钟周期数 × 时钟周期时间

真正影响执行效率的,还有:

  • 指令集设计。
  • 流水线。
  • 分支预测。
  • 缓存命中。
  • 并发和调度。

存储器、缓存和内存层次

CPU 寄存器最快,但容量最小;CPU Cache 次之;内存更大但更慢;磁盘更大但更慢。

这个层次结构直接影响程序设计:

  • 数据局部性越好,越容易被缓存命中。
  • 频繁随机访问,越容易变慢。
  • 合理利用连续内存,通常更快。
flowchart TB
    A["寄存器"] --> B["CPU Cache"]
    B --> C["内存"]
    C --> D["磁盘 / 外部存储"]

为什么动态链接出现

动态链接出现的核心原因是内存复用和共享代码。多个程序如果都要使用同样的库,没必要每个进程都复制一份静态代码。

它带来的好处是:

  • 节省内存。
  • 让库独立升级更容易。
  • 减少重复装载。

但代价是:

  • 运行时依赖更复杂。
  • 版本兼容要更谨慎。

内存装载为什么复杂

程序要同时满足两件事:

  1. 加载后占用连续空间。
  2. 多个程序不能互相抢固定位置。

于是出现了分段、分页和虚拟内存等机制。它们的本质都是:让程序看到一个简单的地址世界,让操作系统在背后做复杂映射

为什么会有进程、线程和协程

程序一多,单线程就会卡住。为了提升利用率和响应能力,就需要不同粒度的执行体。

  • 进程:资源隔离更强。
  • 线程:切换更轻。
  • 协程:更轻量的并发组织方式。
flowchart LR
    A["进程"] --> B["线程"]
    B --> C["协程"]

开发场景

  • CPU 密集型任务更关心调度和并发。
  • I/O 密集型任务更关心等待和切换。
  • 多任务程序往往同时面对两类问题。

网络分层为什么重要

网络协议之所以分层,是因为每一层只解决自己那一层的问题。

  • 物理层解决比特传输。
  • 数据链路层解决局部链路。
  • 网络层解决跨网络寻址。
  • 传输层解决端到端连接和可靠性。
  • 应用层解决具体业务协议。

TCP 是传输层的代表,负责可靠传输、连接管理和拥塞控制,是很多应用系统的底座。

计算机为什么不是“单靠 CPU 就行”

因为程序真正跑起来,依赖的是一整条链:

  1. 编译、汇编、链接生成可执行文件。
  2. 装载器把它放入内存。
  3. CPU 通过时钟和指令执行它。
  4. 操作系统负责进程、线程、调度、通信。
  5. 网络协议让不同机器协作。

这条链路里任何一环出问题,程序都可能变慢、崩溃、阻塞或不可扩展。

历史演进

  • 机器语言先出现,直接面向硬件。
  • 汇编语言缓解了读写困难。
  • 高级语言让程序更接近人的思维。
  • 结构化程序设计和面向对象分别回应了规模和复杂度。
  • 操作系统、链接器、内存管理和网络分层逐步完善,程序才能在现代环境里高效运行。

最佳实践

  • 不要只学语言语法,也要懂程序如何被装载和执行。
  • 关注缓存、内存局部性和数据结构布局。
  • 理解进程、线程和协程的差异。
  • 不要把高性能只理解成“更多机器”,单机和集群的复杂度都要算进去。
  • 网络分层不是背概念,而是理解每一层解决什么问题。
计算机为什么能跑程序:组成原理、存储、链接与并发 | Remi Resume