本文已收录到 GitHub · AndroidFamily[1],有 Android 进阶知识体系,欢迎 Star。
前言
大家好,我是小彭。
在之前的文章中[2],我们聊到了计算机的冯·诺依曼计算机架构,计算机由五大部件组成。那么,计算机的五大部件是如何连接成一个整体的呢?这就需要依赖总线系统。
学习路线图:
1. 认识计算机总线系统
1.1 什么是总线?
在冯·诺依曼计算机架构中,计算机由控制器、运算器、存储器、输入设备和输出设备五个部分组成,而这五个部分必须进行 “连接” 起来相互通信才能形成一个完整的整体。总线就是连接多个计算机部件的数据通信规范。
PC 计算机主板
—— 图片引用自 Wikipedia
1.2 为什么要使用总线结构?
先解释一下为什么现代的计算机系统要采用总线结构:
- 原因 1 - 降低复杂性: 这个设计思路跟软件开发中的中介者模式是相同的。总线结构将
N-N
网型拓扑结构简化为 N-1-N
总线型结构或星型+总线型拓扑结构,不仅整体的系统结构清晰许多,可以提高系统稳定性。而且需要使用的布线数目也减少了,制造成本也更低; - 原因 2 - 促进标准化: 总线结构提供了一个标准化的数据交换方式,各个硬件按照总线的标准实现接口,而无需考虑对方接口或总线的工作原理,有利于各个部件模块化设计。
网状拓扑和总线拓扑对比
2. 总线的内部结构
总线本身的电路功能,又可以拆分成 3 部分:
- 1、地址总线(Address Bus,AB): 地址总线传输的是地址信号。地址总线是单向的,地址信息只能从主设备发往从设备。地址总线宽度也决定了一个 CPU 的寻址能力,即多大可以访问多少数据空间。举个例子,32 位地址总线可以寻址 4GB 的数据空间;
- 2、控制总线(Control Bus,CB): 控制总线传输控制或状态信号。控制总线是双向的,信号可以从主模块发往从模块,也可以从从模块发往主模块(例如 CPU 对存储器的读写控制信号,例如 I/O 设备对 CPU 中断请求信号);
- 3、数据总线(Data Bus,DB): 数据总线传输的是实际的数据信息。数据总线是双向的,数据可以从主模块发往从模块(例如 CPU 向内存的写入操作),也可以从从模块发往主模块(例如 CPU 向内存的读取操作)。
举个例子,当 CPU 要从存储器读取数据时,三类总线的工作过程概要如下:
- 1、CPU 通过地址总线发送要访问的存储单元的地址信息;
- 2、CPU 通过控制总线发送读控制信号;
- 3、存储器通过数据总线发送指定存储单元上的数据,从 CPU 的视角就是读取。
总线内部结构
3. 总线系统的架构
理解了总线的概念后,我们先来看总线系统的整体架构,现代计算机中的总线大多采用分层次多总线架构。
3.1 单总线架构和多总线架构
在早期计算机中,会使用单一总线来连接计算机的各个部件,这种结构叫单总线架构。这种结构实现简单,但缺点有 2 个:
- 缺点 1: 计算机不同组件之间的速度差较大,例如 CPU 与内存或 I/O 设备的速度差非常大,当传输数据量很大时,CPU 经常需要等待;
- 缺点 2: 所有的信号都要经过同一个共享的总线,不允许两个以上的部件同时传输信号。
单总线架构
因此,单总线系统很容易形成系统的性能瓶颈,就算是增大总线的带宽也无法从根本上解决系统性缺陷。目前,单总线结构只出现在微型计算机中。大多数现代计算机都采用了分层次多总线结构,所有的设计思路都是围绕单总线架构存在的 2 个缺点展开的:
- 应对缺点 1: 将高速部件和低速部件分为不同层级,不同层级之间使用独立的总线,减少高速部件对低速部件的等待;
- 应对缺点 2: 增加多条总线,使得数据可以同时在多个部件之间传输。
3.2 双独立总线:片内 & 片外
现代 CPU 中通常会使用高速缓存,由于 “CPU-高速缓存” 和 “CPU - 内存” 的速度差非常大,计算机系统选择在 CPU 芯片内和 CPU 芯片外使用 双独立总线(Dual Independent Bus,DIB):
- 前端总线(Front Side Bus,FSB): CPU 与外部连接的总线(即 CPU 连接北桥芯片的总线);
- 后端总线(Back Side Bus,BSB): 也叫本地总线(Local Bus)或片内总线(On-chip Bus),是 CPU 芯片内部独立使用的总线。CPU 芯片内部一个或多个核心、Cache 之间的通信将不需要占用芯片外的系统总线。
提示: 前端总线和系统总线的概念容易混淆,不同资料的说法不一。我的理解是:前端总线是 “特指” 某些 Intel CPU 架构中,CPU 芯片与外部连接的这条总线,而系统总线 “泛指” 连接计算机各个部件的所有总线。小彭在后续专栏内容都会按照此理解讨论。
前端总线和后端总线
3.3 南北桥架构
南北桥架构是 Intel 提出的总线架构,也叫 Hub 架构 。它将计算机部件分为高速部件和低速部件两类,分为北桥芯片组合和南桥芯片组,中间用两颗桥芯片连接。使用南北桥设计有 2 个优点:
- 1、缓冲功能: 南北桥芯片实现了两类总线信号速度缓冲;
- 2、桥接功能: 南北桥芯片实现了两类总线信号的转换,有利于系统升级换代。例如在升级 CPU 时,只需要改动 CPU 和北桥芯片,其它南桥部分不需要改动。
南北桥架构
- 北桥芯片(Northbridge): 北桥处理高速信号。北桥芯片连接的设备都是高速传输设备,包含 CPU、GPU、存储器与南桥的通信。北桥芯片也是 CPU 与外部连接的纽带;
- 南桥芯片(Southbridge): 南桥处理低速信号。南桥芯片连接的大多是 I/O 设备,例如 PCI 总线、USB 适配器、显卡适配器、硬盘控制器;
- 内存控制器(Memory Controller): 管理 CPU 和内存之间的总线数据传输,控制着存储器的读取和写入信号,并且定时刷新 DRAM 内的数据(DRAM 的存储单元包含电容,会自动漏电);
- 内存总线(Memory Bus): 连接北桥芯片与存储器的总线;
- DMI 总线(Direct Media Interface): 连接北桥芯片和南桥芯片的专用总线;
- I/O 总线: 连接南桥芯片与 I/O 设备的总线;
- PCI 局部总线: 连接高速 I/O 设备的标准;
- ISA 局部总线: 连接低速 I/O 设备的标准。
3.4 前端总线瓶颈
前端总线是 CPU 连接外界的唯一通道,因此前端总线的数据传输能力对于计算机系统的整体性能影响非常大。 近年来随着 CPU 主频不断提升,前端总线频率却一直跟不上后端总线频率,从而出现性能瓶颈。
为了解决这个问题,传统的南北桥架构被重新设计,北桥芯片的功能几乎都移动到 CPU 内部变成 “片上北桥”。前端总线被淘汰,CPU / 片上北桥继续使用 DMI 连接南桥或 PCH 等外部设备。
4. 总线仲裁
总线既有共享性又有独占性,听起来有点矛盾,其实是表现的时机不一样:
- 共享性: 总线的共享性是指总线对所有连接的设备共享,主从模块能通过总线传输数据。
- 独占性: 总线的独占性是指同一时刻,只允许一个部件占有总线的控制权,这个部件就是主模块,主模块可以与一个或多个从模块通信,但同一时刻只有一个主模块。
总线的独占性天然地将事务串行化: 如果多个部件同时向总线发出总线事务,总线仲裁(Bus Arbitration)单元会对竞争做出总裁,未获胜的事务只能等待获胜的事务处理完成后才能执行。当其中一个总线事务在执行时,其他总线事务都会被禁止。
5. 总结
- 1、总线就是连接多个计算机部件的数据通信规范;
- 2、总线的电路结构由地址总线、控制总线和数据总线组成。举个例子,当 CPU 要从存储器读取数据时,三类总线的工作过程概要如下:
- CPU 通过地址总线发送要访问的存储单元的地址信息;
- CPU 通过控制总线发送读控制信号;
- 存储器通过数据总线发送指定存储单元上的数据,从 CPU 的视角就是读取。
- 3、现代计算机中的总线大多采用分层次多总线架构,由片内+片外双独立总线平衡高速缓存和内存的速度差,由南北桥架构平衡高速部件和低速部件的速度差;
- 4、由于前端总线瓶颈和芯片集成度提高,南北桥架构逐渐被片上系统替代;
- 5、总线具有共享性和独占性,当多个部件同时向总线发出总线事务,总线天然地将事务串行化;
参考资料
- 深入浅出计算机组成原理(第 42 讲)[3] —— 徐文浩 著,极客时间 出品
- 计算机组成原理教程(第 3 章)[4] —— 尹艳辉 王海文 邢军 著
- 10分钟速成课 计算机科学[5] —— Carrie Anne 著
- System Bus[6] —— Wikipedia
- [Northbridge (computing)](https://en.wikipedia.org/wiki/Northbridge_(computing "Northbridge (computing)")) —— Wikipedia
- [Southbridge (computing)](https://en.wikipedia.org/wiki/Southbridge_(computing "Southbridge (computing)")) —— Wikipedia
- HyperTransport[7] —— Wikipedia
- Intel QuickPath Interconnect[8] —— Wikipedia
- [Arbiter (electronics)](https://en.wikipedia.org/wiki/Arbiter_(electronics "Arbiter (electronics)")) —— Wikipedia
参考资料
[1]
GitHub · AndroidFamily: https://github.com/pengxurui/AndroidFamily
[2]
在之前的文章中: https://juejin.cn/post/7148723199818072095
[3]
深入浅出计算机组成原理(第 42 讲): https://time.geekbang.org/column/intro/100026001
[4]
计算机组成原理教程(第 3 章): https://weread.qq.com/web/bookDetail/f38325905c81faf38e36174
[5]
10分钟速成课 计算机科学: https://www.youtube.com/watch?v=WqrNphu6HaU&list=PLdYq_l3Bzf1elCyzIfx2JgHfSMTsWbnfg&index=1
[6]
System Bus: https://en.wikipedia.org/wiki/System_bus
[7]
HyperTransport: https://en.wikipedia.org/wiki/HyperTransport
[8]
Intel QuickPath Interconnect: https://en.wikipedia.org/wiki/Intel_QuickPath_Interconnect