zoukankan      html  css  js  c++  java
  • 存储器

    存储器 - 总线:计算机内部的高速公路

    计算机组成原理目录:https://www.cnblogs.com/binarylei/p/12585607.html

    本文主要梳理计算机里不同的组件之间的通信问题,也就是总线机制。总线的设计思路,核心是为了减少多个模块之间交互的复杂性和耦合度。实际上,事件总线是一个常见的设计模式,通常事件总线也会和订阅者发布者模式结合起来,成为大型系统的各个松耦合的模块之间交互的一种主要模式。

    1. 降低复杂性:总线的设计思路来源

    计算机里其实有很多不同的硬件设备,除了 CPU 和内存之外,我们还有大量的输入输出设备。可以说,计算机上的每一个接口,键盘、鼠标、显示器、硬盘,乃至通过 USB 接口连接的各种外部设备,都对应了一个设备或者模块。

    如果各个设备相互单独通信,那么 N 个设备,系统复杂度就会变成 N2。每一个设备或者功能电路模块,都要和其他 N−1 个设备通信。为了简化系统的复杂度,我们就引入了总线,把这个 N2 的复杂度,变成一个 N 的复杂度。

    图1:总线将复杂度由 N^2 降低为 N

    说明: 总线就好像一个高速公路,设备要向 CPU 发送什么信息,不需要单独建公路,只建一条小路通向这条高速公路就好了。

    这种设计思路,在软件开发中也是非常常见的。大型系统开发的过程中,经常会用到一种叫作事件总线(Event Bus) 的设计模式。在事件总线这个设计模式里,各个模块触发对应的事件,并把事件对象发送到总线上。也就是说,每个模块都是一个发布者(Publisher)。而各个模块也会把自己注册到总线上,去监听总线上的事件,并根据事件的对象类型或者是对象内容,来决定自己是否要进行特定的处理或者响应。

    图2:事件总结的发布订阅模式

    2. 理解总线:多总线架构和三种线路

    2.1 多总线架构

    现代的 Intel CPU 的体系结构里面,通常有好几条总线。CPU 和内存以及高速缓存通信的总线,我们称之为双独立总线(Dual Independent Bus,缩写为 DIB)。这个双独立总线通常分为两部分:一个速度相对较快的本地总线(Local Bus)和一个速度相对较慢的前端总线(Front-side Bus)。

    • 本地总线:用来和高速缓存通信的。也叫作后端总线(Back-side Bus)。
    • 前端总线:用来和主内存以及输入输出设备通信的。也叫作处理器总线(Processor Bus)、内存总线(Memory Bus)。
    图3:前端总线被北桥芯片一分为三:系统总线、内存总线、I/O总线

    说明: 在上图中我们看到,北桥芯片把前端总线一分为三,变成系统总线、内存总线、I/O 总线。我们的前端总线,其实就是系统总线。CPU 里面的内存接口,直接和系统总线通信,然后系统总线再接入一个 I/O 桥接器(I/O Bridge)。这个 I/O 桥接器,一边接入了我们的内存总线,使得我们的 CPU 和内存通信;另一边接入一个 I/O 总线,用来连接 I/O 设备。

    因为不同设备之间的速度有差异,所以一台计算机里面往往会有多个总线。除了前面的三类总线外,根据不同的设备,还会分成独立的 PCI 总线、ISA 总线等等。

    图4:各种总线关系图

    2.2 三类线路

    在物理层面,其实我们完全可以把总线看作一组“电线”。不过这些电线之间也是有分工的,我们通常有三类线路。

    1. 数据线(Data Bus):用来传输实际的数据信息,也就是实际上了公交车的“人”。
    2. 地址线(Address Bus):用来确定到底把数据传输到哪里去,是内存的某个位置,还是某一个 I/O 设备。这个其实就相当于拿了个纸条,写下了上面的人要下车的站点。
    3. 控制线(Control Bus):用来控制对于总线的访问。虽然我们把总线比喻成了一辆公交车。那么有人想要做公交车的时候,需要告诉公交车司机,这个就是我们的控制信号。

    2.3 总线裁决

    我们的总线是很多个设备公用的,那多个设备都想要用总线,我们就需要有一个机制,去决定这种情况下,到底把总线给哪一个设备用。这个机制,就叫作总线裁决(Bus Arbitraction)

    3. CPU 和 I/O 设备通信

    在计算机系统里面,CPU 和 I/O 设备之间的通信,是这么来解决的。

    首先,在 I/O 设备这一侧,我们把 I/O 设备拆分成,能和 CPU 通信的接口电路,以及实际的 I/O 设备本身。接口电路里面有对应的状态寄存器、命令寄存器、数据寄存器、数据缓冲区和设备内存等等。接口电路通过总线和 CPU 通信,接收来自 CPU 的指令和数据。而接口电路中的控制电路,再解码接收到的指令,实际去操作对应的硬件设备。

    而在 CPU 这一侧,对 CPU 来说,它看到的并不是一个个特定的设备,而是一个个内存地址或者端口地址。CPU 只是向这些地址传输数据或者读取数据。所需要的指令和操作内存地址的指令其实没有什么本质差别。通过软件层面对于传输的命令数据的定义,而不是提供特殊的新的指令,来实际操作对应的 I/O 硬件。

    图5:CPU 和 I/O 设备通信

    参考:


    每天用心记录一点点。内容也许不重要,但习惯很重要!

  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/binarylei/p/12600899.html
Copyright © 2011-2022 走看看