《计算机是如何工作的》读书笔记
1 Part 1: What Makes a Computer a Computer
1.1 Chapter 1: The Ghostly LEGO’s of Computering
1.1.1 How Waves Take The Universe on a Joy Ride(关于波)
-
什么是波?
- 在一个介质中,如果有一个扰动,那么此扰动就会在此介质中传递出去,就形成了波,也就是说波是扰动的传递。
- 机械波 / 力学波(见下)需要一个震源,就是扰动发生的源头,往往是有力作用,或者有能量发生。
- 既然有源头,那么扰动的发生必然有先后(扰动也可以理解为介质中分子的振动),离震源近的先发生扰动,远的后发生扰动。
- 某一物理量的扰动或振动在空间逐点传递时形成的运动称为波。
- 介质把扰动传播出去,不是介质本身传播出去(人们往往把作为现象的“波”与承载该“波”的“介质”(或场)混为一体,统称为波)。例如,水波不是水的波,是水在传递一个对水的扰动。
- 质把扰动传递出去,也是把能量传递出去。
- 波还可以把信息传递出去。
-
机械波(Mechanical Wave)
机械波(英语:Mechanical wave,又译为力学波)是机械振动在空间中的传播现象,是波的一种。机械波的特点是必须透过介质才能传播。
-
电磁波(Electromagnetic Wave)
电磁波是指同相振荡且互相垂直的电场与磁场,在空间中以波的形式传递能量和动量,其传播方向垂直于电场与磁场的振荡方向。
-
电场与磁场相互激发产生。
-
不需要介质就可以传播,可在真空中传播。
-
电磁波是横波,电场方向与磁场方向相互垂直,又都垂直于传播方向。
-
电场震动创建磁场,磁场震动有创建电场,互相激发。
-
举例:光、红外线、电台、X光、伽马射线等。
-
1.1.2 How Information Rides the Waves(波如何传递信息)
-
使用波最简单的信息传递方式,开与关,有与无,例如摩斯码。
-
摩斯码使用编码来传递信息,例如滴滴滴代表S。
-
摩斯码和早期调制解调器,用短与长的电流脉冲,表示二进制码,例如摩斯码中的短滴与长哒,其组合代表不同的字母。(注意此时波的频率与幅度都没有变化)
-
- 通过波的开与关可以传递信息。
- 早期调制解调器遇到了瓶颈,关于如何快速准确的开或关。
- 这种方式通过使用不同的频率与幅度的组合,来解决这一问题。
-
-
二者都可用于通过无线电波或电路传递信息。
-
调制是指可以将信号的频谱搬移到任意位置,从而有利于信号的传送,并且使频谱资源得到充分利用。例如,天线尺寸为信号的十分之一或更大些,信号才能有效的被辐射。然而,对于语音信号来说,相应的天线尺寸要在几十公里以上,但实际上不可能实现。因此,这时就需要调制过程将信号频谱搬移到较高的频率范围。如果不进行调制就把信号直接辐射出去,那么各电台所发出信号的频率就会相同。此外,调制作用的实质就是使相同频率范围的信号分别依托于不同频率的载波上,接收机就可以分离出所需的频率信号,不致互相干扰。这也是在同一信道中实现多路复用的基础。
- 往池塘里扔一块石头,会形成波,假如这是我们用于传输信息的波,我们把其称为载波,我们测量载波的波长、频率、波峰、波谷。
- 再继续扔几块石头,会形成新的波,同时与载波相遇,通过复杂的数学运算,可以移除载波的影响,只保留我们要传递的信息,这就是调制。
-
例如用无线电波传递声音信号,无线电波就是我们的载波。我们把声音信号产生的波(此波我们已知其所有信息),即输入信号混入载波进行调制。当接受设备,接到调制过后的信号,其通过计算,移除载波,只保留我们的输入信号,也就是一段声音,把这段声音复现出来,即完成了信号的传输。
-
1.1.3 How Electromagnetism Is the Ghost in the Machine(电磁如何成为机器中的幽灵)
-
这一部分主要关于电磁感应。(终于有个熟悉一点的东西了😂)
-
电生磁,磁生电。(磁场与电场确实是同一种场)
-
电流:
- 原子核带正电,电子带负电,电子围绕原子核运动。
- 如果一种物质的原子核,对电子的引力小,那么这就是导体。
- 这种情况下,会出现电子的运动,即从一个原子核附近,跳到另一个原子核附近。
- 这种电子的运动,就是电流。
-
电流的参数:
- 电压:电的力有多大。
- 电流:电的量有多大。
- 电阻:电流通过的阻力有多大。
- 低电压+低电阻产生的电流,可能等于高电压+高电阻。
- 电阻极大的物体叫绝缘体,在不同情况下电阻变化的物体叫半导体。
-
电流的磁效应:电流会产生垂直于电流方向的磁场。
-
电磁感应:
电磁感应(英语:Electromagnetic induction),是指放在变化磁通量中的导体,会产生电动势。此电动势称为感应电动势或感生电动势,若将此导体闭合成一回路,则该电动势会驱使电子流动,形成感应电流(感生电流)。
1.1.4 How We Control Electricity(如何控制电)
-
转子(rotor)在定子(stator magnet)里转动,做 切割磁感线运动,产生电流。
-
电流要经过变压器(transformer),降低电压才能用。
-
电容器(capacitor)
-
一般由两个导体,中间夹一个绝缘体组成。
-
充电,就是给一个电源,那么负极负电子就会跑起来,然后就形成一边都是负电,一边都是正电。
-
放电,两边接起来就放电了。
-
1.1.5 How Computers Create Our World Using Numbers
-
评估世界的两种方式:模拟与数字
-
连续变化的就是模拟,非连续的就是数字,所以数字信号需要采样。
-
模拟数字转换器(ADC):是用于将模拟形式的连续信号转换为数字形式的离散信号的一类设备。
-
数字模拟转换器(DAC):是一种将数字信号转换为模拟信号(以电流、电压或电荷的形式)的设备。
1.2 Chapter 2: How Computers Remember
-
现代处理器里面,都是晶体管(transistor)。晶体管的组合可以实现逻辑门,再组合可以实现半加法器(half adders)与全加法器(full adders)。
参考
1.2.1 How a Little Transistor Does Big Jobs
-
晶体二极管(这一小节内容看参考视频就可以理解了)
1.2.2 Writing Data to RAM
-
书里讲的比较笼统,实际上想细致的搞清楚这个问题并不简单。可以先看Crash Course Computer Science笔记的相关部分帮助理解。
-
当需要向内存(RAM)写数据的时候,软件或者程序,结合操作系统,向地址线,发出一阵电流。
-
地址线,是连接CPU与RAM的电路(蚀刻在RAM芯片上的一小股微观导电物质,这里其实涉及了集成电路的知识)。地址线,一端连接CPU,一端连接RAM芯片上可以储存数据的存储单元(存储单元实质是一个由若干个晶体管构成的小部件)。
-
电流脉冲,开启或关闭了连接着RAM芯片上存储单元的数据线的晶体管(实质是开启数据线的读写控制),晶体管本质上就是微观的电子开关。
-
晶体管打开之后,另一个电流脉冲,会发到数据线(传输数据的电路),代表了二进制的数据1。0和1就是原生的机器语言,也是计算机操作数据的基本单元。
-
RAM储存单元里,有一个电容器,这就是用来储存数据的。电容器有没有电,表示有没有数据。有电是1,没电是0。
-
数据线的电流脉冲对RAM的电容器进行充电,RAM的电容器把这个点保存起来,则写入了数据。
-
RAM芯片需要不时的充电,因为电容器会自动缓慢放电。这也是内存断电丢数据的原因,一断电所以电容器都放电了。
1.2.3 Reading Data from RAM
-
需要从内存(RAM)读数据的时候,正好与写数据反过来。
-
同样,也会发出一阵电流,沿地址线,开启或关闭了连接着RAM芯片上存储单元的数据线的晶体管(开启读写控制的读)。
-
电容器会向数据线放电,如果有电的话。
-
有电就是1,没电就是0。
-
SDRAM(Synchronous Dynamic Random Access Memory),在传统DRAM的基础上,对输入输出进行与CPU的时钟同步,提高效率。
-
双倍数据率(DDR – Double Data Rate):
-
原来的SDRAM,每个CPU时钟周期,传输1个数据。
-
DDR - SDRAM,每个CPU时钟周期,传输2个数据,上升沿一个,下降沿一个。
-
1.2.4 How Flash Memory Remembers When the Switch Is Off
- 闪存,其实就是SSD(Solid State Drive),本质无区别,都是闪存颗粒进行存储,区别在于控制单元不同。
- RAM关机无数据,手机和U盘断电有数据,如何做到的?
- 不用看书,直接看这个视频即可,非常清晰。U盘的存储原理是什么?闪存是怎么存数据的?
1.3 Chapter 3: How a Little Microprocessor Does Big Things
1.3.1 How a Processor Tracks Numbers
- 这一节内容可以先看Crash Course Computer Science笔记的相关部分帮助理解。
- 寄存器(Register),是CPU中用来临时储存数据的一块由晶体管构成的部分。CPU的运算逻辑单元(ALU)是用来进行数学运算的部分,控制单元(Control Unit)是管理指令与从寄存器里取数据的部分。
- 控制单元(Control Unit)指导程序指令的获取与执行。它用电信号,获取(fetch)每条指令,然后解码(decode)指令,再向运算逻辑单元(ALU)发出一条电信号,告诉ALU执行(execute)何种操作。
- 每个时钟周期(CPU完成一个最基础动作所需的时间),CPU通过发送或者不发送电流脉冲来读或写数据。没有标签来区分这些读到的数据所代表的意思,是指令、数据、还是结果值。这些数据所代表的意义,取决于控制单元(Control Unit)用哪个寄存器(Register)去储存它们。
- 地址寄存器(Address Register)收集了RAM中,或者高速缓存(Cache)中的地址内容,如果预测需要这些地址内容的话,会有指令预取(prefetch)操作。
- 当处理器从内存中读到内容时,它会告诉数据总线(data bus)把这些数据放到内存数据寄存器(memory data register)。当处理器需要向内存写数据的时候,它把数据放在内存数据寄存器(memory data register),然后数据总线(data bus)获取到这些数据,并传输到内存去。
- 程序计数寄存器(program counter register)保存着,处理器要获取的下一个值的内存地址。当数据被获取了,处理器将程序计数寄存器(program counter register)的内容 + 1,指向下一条程序的地址。计算机通过把程序的第一个值放到程序计数寄存器(program counter register)中,来启动一个程序。
- 处理器把操作执行的结果,放到多个累加寄存器(accumulation register)中。
1.3.2 How a Processor Does Math
-
Crash Course Computer Science笔记的相关部分1和Crash Course Computer Science笔记的相关部分2可以帮助理解。
-
计算机储存与操作的所有信息,本质都是二进制数字。
-
晶体管开关,用于操作二进制数字,因为其开启与关闭的两种状态,正好对应二进制的0和1。晶体管打开,无电流通过,表示0,晶体管关闭,有电流通过,表示1。
-
通过一个晶体管的电流,可以控制另一个晶体管,这种布局叫门。
1.3.3 How a Processor Moves Data
-
处理器与其集成的高速缓存,共享相同的计算机的信息接口。程序代码或由该代码操作的数据以PC的最大总线速度进出芯片。计算机的大部分结构都是为了缓解总线的瓶颈而设计的。计算机的大部分结构都是为了缓解总线的瓶颈,尽量减少时钟周期的时间–计算机可以做任何事情的最小时间–在处理器没有完成操作的情况下流逝。【不是很好理解】
-
当数据从BIU(Bus Interface Unit)进入处理器,BIU会把信息复制一份给到直接放置在处理器核心内的,离CPU最近的数据缓存中。BIU将程序代码发送到1级指令缓存(Level 1 Instruction Cache),或称I-缓存,并将代码使用的数据发送到另一个1级缓存(Level 1 Data Cache),即数据缓存(D-缓存)。
-
当取/解码单元从I-缓存中获取指令时,BTB(branch target buffer)将每条指令与单独的预留缓冲器中的记录进行比较。BTB将每条指令与单独预留的缓冲器中的记录进行比较,看是否有任何指令曾被之前被使用过。BTB特别关注那些涉及到分支的指令,如果BTB找到一个分支指令,它就会根据过去的经验预测程序将采取哪条路径。预测的准确率超过90%。
-
当取/解码单元按照BTB预测的顺序提取指令时,三个并行工作的解码器将更复杂的指令分解成μops,即更小的微操作(micro-operations)。调度/执行单元处理几个μops的速度比处理一条高级指令的速度快。
-
解码单元将所有的μops发送到指令池,也称为重排序缓冲器(reorder buffer)。它包含两个算术逻辑单元(ALU),处理所有涉及整数的计算。ALU使用一个有头有尾的循环缓冲器,它包含了按BTB预测的需要顺序排列的μops。
-
调度/执行单元检查缓冲区中的每一个μop,看它是否有处理它所需要的所有信息,当它发现一个μop可以处理时,该单元就执行它,把结果存储在微操作本身中,并标记为完成。
-
如果一个μop需要来自内存的数据,执行单元会跳过它,处理器会首先在附近的L1高速缓存中寻找信息。如果数据不在那里,处理器就会检查下一级的高速缓存,在这种情况下就是L2。缓存的大小和组织根据具体的处理器设计而变化,但每一级缓存的容量和从其获取数据所需的时间都在增加。
-
在获取信息时,执行单元并没有闲着,而是继续检查缓冲区中的每一个μop,寻找可以执行的信息。这被称为推测性执行(speculative execution),因为循环缓冲区中的微操作的顺序是基于BTB的分支预测。该单元最多同时执行五个微操作。当执行单元到达缓冲区的末端时,它又从头开始,重新检查所有的μops,看是否有任何最终收到它们需要执行的数据。
-
如果一个操作涉及到浮点数,如3.14或0.33333,ALU会将工作移交给浮点数学单元,该单元包含旨在快速操作浮点数的处理工具。
-
当一个被延迟的μop最终被处理时,执行单元将其结果与BTB预测的结果进行比较。在预测失败的情况下,一个叫做JEU(jump execution unit)的组件将结束标记从最后一个μop排到预测错误的μop上。这表明结束标记后面的所有微操作都应该被忽略,可以被新的微操作覆盖。BTB被告知其预测是不正确的,该信息成为其未来预测的一部分。
-
同时,退役单元(retirement unit)也在检查循环缓冲区(circular buffer)。它首先检查缓冲区头部的μop是否已经被执行。如果还没有,退休单元继续检查它,直到它被处理。然后,退役单元检查第二和第三个μop。如果它们已经被执行,该单元将所有三个结果(一次最多发送3个)发送到存储缓冲区(store buffer)。在那里,预测单元(prediction unit)最后一次检查它们,然后将它们发送到系统RAM中的适当位置。
1.3.4 How Multi-Core Processors Work
-
具体设计各不相同,但一个典型的四核处理器将四个执行核心组合在一个芯片上,或硅芯片上。其他设计将其核心分散在两个芯片上。无论如何,这些相同的内核是任何微处理器的核心,是执行软件指令的繁重工作的部分。照片中核心上方颜色狂乱的区域是支持电路的。
-
为了获得多处理器计算机可能带来的速度和其他优势,在其上运行的操作系统(operating system)必须被设计成能够识别个人电脑有多核处理器,能够区分它们,并知道如何处理超线程(hyperthreading)等操作。同样,软件应用程序、游戏和实用程序也需要重写以使用多核。这样的软件被称为线程化,或多线程化(multi-threaded)。比方说,添加一列四位数的软件可以把工作分成四个线程。添加1位数、10位数、100位数和1000位数。这些子任务中的每一个都被引导到不同的核心。
-
当子任务退出核心时,操作系统将线程合并为一个数字,并将该操作发送到其中一个核心执行。
-
如果应用软件不具备在多核中工作的条件,操作系统仍然可以利用它们。它选择其中一个核心来运行软件,并在该核心和程序之间建立绑定。然后,它在其余核心和各种任务之间建立绑定。第二个核心可以处理后台操作,如磁盘优化;第三个核心可以监督下载;第四个核心可以渲染从互联网上传输的视频。这些操作和它们的完成时间都不会受到其他核心正在进行的处理的影响。
-
操作系统将该操作与去往其他内核的请求一起放入一个时间错开(time-staggered queue)的队列。每个操作都在计算机时钟的不同时间段进入各自的核心,因此它们不太可能相互碰撞或在它们相互访问的区域造成交通堵塞。
-
每个处理器核心并不是完全独立的。它们可能共享资源,如片上图形处理器、内存缓存(如图所示),以及更多。操作系统可以决定每个内核如何分享这些资源的访问。例如,如果只有一个内核处于活动状态,操作系统会动态地将更多的共享缓存分配给该内核。
1.3.5 How Desktop CPUs Keep It Complex
-
台式计算机所面临的挑战–发放公司的工资单,为新工厂绘制蓝图–需要解决大量复杂的计算问题。这就是为什么以英特尔的X86系列为模型的日常台式机处理器使用复杂指令集计算(CISC–complex instruction set computing)。它使用复杂的、交织在一起的指令来咬掉可管理的问题,它解决了这些问题,并返回到一个仍在不断变化的解决方案。
-
内置在CISC微处理器的只读内存,是一个大的指令集合,此集合包含了若干必须被执行的字命令来完成一个单一的操作,例如如两个数字相乘或移动文字。当软件提出要求时。程序向处理器发送命令的名称,以及它所需要的任何其他信息,如两个相乘的数字在内存中的地址。
-
因为CISC指令的大小不尽相同,微处理器会检查该指令需要多少字节的处理空间,然后预留出这么多的内部存储器。还有几种不同的方法可以加载和存储命令,处理器必须确定加载和存储每个命令的正确方法。这两项初步任务都会增加执行时间。
-
处理器将软件要求的命令发送到解码单元,解码单元将复杂的命令翻译成微码(microcode),即一系列较小的指令,由纳米处理器(nanoprocessor)执行,这就像处理器中的一个处理器。
-
有了多核处理器,可以同时执行一条以上的指令,当每个处理器核心完成其指令时,结果就会统一起来。
-
纳米处理器通过电路执行每条微码指令,由于指令在完全执行之前可能需要通过不同的步骤,所以电路很复杂。为了避免CISC处理中典型的热量和功耗的增加,一些X86处理器在过渡性CISC层下实施RISC方法。
1.3.6 How Mobile CPUs Keep It Simple
-
移动设备从事的工作是拨打电话、显示网页、玩愤怒的小鸟,就计算而言,这些工作很简单。所以它们使用更简单的系统来执行代码:简化指令集计算(RISC–reduced instruction set computing)。它处理的指令已经被分解成可咀嚼的碎片,在吐出结果之前,它迅速咬碎这些碎片,在这个过程中使用更少的电力,产生更少的热量。RISC是75%的移动产品(包括从平板电脑到智能手机到数码相机的所有产品)中普遍采用的ARM架构的许多变种的基础。
-
内置在RISC处理器中的命令功能由几个小的、不连续的指令组成,只执行一个工作。应用程序告诉处理器要执行哪种小型指令的组合,以完成一个更大的操作。
-
所有的RISC指令都是相同的大小,而且只有一种方式可以加载和存储它们。因为每个命令已经是一种微码的形式,RISC处理器不需要通过解码单元传递指令的额外步骤来将它们转化为更简单的微码。这让处理器加载命令执行的速度比CISC处理器快。
-
在RISC应用程序的编译过程中,编译器决定哪些命令将不依赖于其他命令的结果。因为这些命令不需要等待其他命令,所以处理器可以同时并行地执行几个命令。
-
因为RISC处理器处理的是更简单的命令,它的电路可以保持简单。RISC指令在较短的电路上通过较少的晶体管,因此指令执行得更快。其结果是,每条指令往往只需要一个CPU时钟周期。完成一个完整操作所需的周期数取决于构成该操作的小指令的数量,但一般来说,它将比CISC处理器快。
1.4 Chapter 4: How Motherboards Conduct a Symphony of Data
- 主板的几个元件:
- 电阻。
- 电容器。
- 微芯片。
- 电路导线。
1.4.1 How a Motherboard Brings It All Together
-
主板(The Motherboard):顾名思义,主板是构成计算机的所有芯片和电路中的一个统一元素。设备通过主板的电路相互通信,它们也从主板上获取电源。主板有不同的外形尺寸,使其与不同尺寸和风格的计算机机箱相匹配。它们也有不同的插座、插槽和连接器,决定了你的电脑可以使用哪些类型的小工具。
-
供电接口(Power Supply Connections):你的计算机的电源通过这个连接器向主板提供电源,然后主板根据需要将电源分配给系统的其他部分。这个基本的ATX式电源连接器是主板设计的主流,尽管随着时间的推移,它已经从一个20针的连接器发展到使用24针的连接器。
-
电池(Battery):向BIOS芯片供电,储存配置设置以及系统日期和时间。
-
BIOS(Basic Input/Output System):当你打开电脑时,这是第一个启动的组件,提供足够的代码来唤醒其他硬件。它还包含支持特定类型的处理器、驱动器和其他功能的代码,可能偶尔需要更新。
-
SATA接口(SATA Connectors):每个连接器,或头,都是为串行ATA硬盘设计的,提供硬盘和光驱的数据传输。
-
80端口显示(Port 80 Display):一个两位数的显示屏提供了用于排除故障的PC的代码。不是所有的主板上都有这些显示。
-
芯片组(Chipset):芯片组,直到最近还基于南北两个芯片的理念,在决定PC的性能和能力方面仅次于处理器。大多数现代设计将南北功能结合到一个芯片中,有些功能甚至转移到CPU的封装中,这取决于具体的主板和CPU组合。你可以在下一个章节中了解更多关于这些功能的信息。
-
前面板连接器(Front Panel Connectors):从这些地方引出的电线通向PC的前面,用于开/关开关、复位开关、电源灯和硬盘灯。
-
扩展槽(Expansion Slots):这些插槽允许你插入称为扩展卡的特殊电路板。多年来,插槽的设计已经发生了变化。传统的PCI插槽曾经是最常见的,并且仍然出现在一些设计上。它被用于不需要大量或快速数据传输的功能。
因为所有的设备都在相同的总线上,它们都在数据和控制总线上接收相同的信号。存储器控制器、扩展卡和总线上的其他输入/输出设备不断地监测命令线。例如,当一个信号出现在写命令线上时,所有的输入/输出设备都会识别这个命令。这些设备受到写命令的提醒,将注意力转向地址线。如果这些线上指定的地址不是一个设备所使用的地址,它就会忽略数据线上发送的信号。
如果地址线上的信号与适配卡使用的地址相匹配,适配卡就会接受地址线上发送的数据,并使用这些数据来完成写命令。
PCI-Express插槽最有名的是与强大的显卡配对,将视频、游戏等推到计算机的显示屏上。它们有多种尺寸,是适用于各种扩展板类型的万能插槽,而不仅仅是图形。这里较短的是x1 PCI-E插槽,是所有PCI Express插槽的共同点。为了更快地处理图形和声音数据,PCI-E插槽可以扩展到x4、x8,或者这里显示的x16插槽,这里的数字代表x1 PCI-E插槽速度的倍数。它们移动数据的能力由其名称中的乘数因子表示。
-
外设端口(Ports):输入/输出面板上有PC背面和正面的各种端口,用于与外部设备通信。在这里你可以找到USB接口、视频接口(如DVI和HDMI)、eSATA接口,以及大量的音频输入/输出端口。
-
总线(Bus):为了向任何其他主板组件发送数据,即写操作,微处理器或其他组件提高了构成地址总线的24条线路组合的电压。这条线的组合是内部总线上某物的唯一地址,如内存中的某个位置;位于主板上的某个组件,如插入主板附加槽的扩展卡;或一个设备,如外部总线上的磁盘驱动器,也叫扩展总线。
处理器把它要写的数据放在一组电路线上,即数据总线,通过提高一些电压来代表1,而让其他电压保持不变来代表0。其他线路用于传递普通特定命令的控制信号,如内存和每个输入/输出设备的读和写命令。
-
CPU套接口(CPU Socket):这决定了主板使用哪种微处理器,或CPU。绝大多数主板都是为英特尔或AMD的处理器而设计的。主板并不适用同一公司的所有CPU。插座和主板是为特定系列的微处理器设计的,具有特定的尺寸、形状和针脚数量。
-
内存插槽(Memory Slots):内存插槽通常是一块板子上有两个或四个,通常用颜色编码,告诉你在哪里放置匹配的内存卡(称为双通道)。现代主板使用基于DDR(双数据率)技术的内存–D3是目前的标准,DDR4即将问世。
1.4.2 How the Chipset Directs Traffic
-
个人电脑已经变得如此复杂,即使是最新的、强大的处理器也无法独自完成管理数据流的全部工作。CPU已经得到了位于主板附近的芯片组的帮助。直到最近,传统上芯片由两个微芯片组成,通常被称为北桥()和南桥(),它们作为CPU的管理员,或首席执行官。芯片组在CPU和其他芯片之间架起了逻辑和物理的桥梁,一直在观察和控制特定组件的输入和输出。芯片组的具体功能在不断变化。在大多数现代设计中,桥接器已被放入一个芯片中,甚至CPU的封装现在也回收了一些功能【这句不知道啥意思,可能指现在CPU把一部分以前由芯片组完成的工作做了?】。但在所有情况下,桥接器决定了什么样的内存、处理器和其他组件可以与该特定主板一起工作。在这里,我们坚持使用传统的南北分布,因为它更容易说明所有这些功能。
-
你可以分辨出北桥,因为它尽可能地靠近其他三个得到芯片特别关注的部件:CPU、内存和图形端口。你不会认为几英寸的差异会很重要,但是当你以纳秒–十亿分之一秒–来计算时,即使是很小的差异也它们也会感觉到。
-
北桥的一个关键机制是内存控制器,在许多设计中,它现在位于CPU本身。该控制器不断更新内存模块(RAM)中的单元。每个带有电荷的单元代表一个比特。由于电荷一产生就开始消散(即放电),北桥的内存控制器无休止地、每秒数千次地读取数以百万计的单元并写回它所读取的数值(即RAM的不断刷新)。
-
当CPU需要来自RAM的数据时,它向内存控制器发出请求。反过来,控制器将请求发送给内存,并告诉CPU处理器必须等待多长时间才能通过称为前端总线(FSB)的快速连接读取内存。
-
虽然你可以使用单独的声卡来产生你的计算机的音频,但芯片组几乎总是处理基本的声音功能,在这方面它通常做得很好。虽然你可以购买和安装独立的音频卡,以获得更好的音频质量,但只有音乐家和其他声音工程类型,以及你真正的高级发烧友,通常会从它们身上受益。
-
北桥也是与其他对速度至关重要的组件的联络人:视频卡。(一些芯片组,甚至是CPU,都内置了视频、声音和其他功能,但基于芯片上的视频通常不如专用扩展卡快)。
-
南桥主要处理系统上各种输入/输出(I/O)设备之间的流量路由,这些设备的速度对整体性能并不重要,如磁盘驱动器(包括RAID驱动器阵列)、光驱、PCI-Express设备、旧的PCI总线、以及USB、以太网和音频端口。它还负责不太突出的输入/输出,如实时时钟、中断控制器和电源管理。计算机其余的慢动作–键盘、串行端口和鼠标–由一个单独的设备处理,称为超级输入/输出的SIO(super input/output)。
-
在双芯片设计中,如图所示,北桥的剩余连接是到南桥。
-
芯片组中疯狂的电子通信,虽然没有CPU中的速度快,但也产生了足够的热量,需要某种冷却设备,如风扇或散热片,以阻止芯片过热。
1.4.3 How PCI-Express Breaks the Bus Barrier
-
应用,如流媒体视频和照片编辑,对PC移动大量的数据提出了很高的要求。直到最近,我们的PC被过时的总线–外围元件互连(PCI–peripheral components interconnect)和加速图形端口(AGP–accelerated graphics port)–在组件之间拖动的数据拖垮了。即使是其中最快的AGP,每秒能喷出2.134千兆字节的数据,也无法跟上实时摄影动画的要求,这些动画需要每秒通过电路推送60次或更多的数百万像素的颜色值。
解决方案是一个同时使用并行和串行传输的总线架构。它被称为PCI-Express,或PCI-E。
-
PCI-Express总线将其处理的所有数据分成若干部分,并将这些部分包裹在一个数据包中。
该数据包包括其他二进制代码,用于识别信息的来源、方向、在所有其他正在发送的数据包中的顺序,以及循环冗余检查(CRC–cyclic redundancy check)的结果。CRC是一种数学运算,作为数据的一个指纹。
-
与老式的PCI总线一样,主板的芯片组在外围设备之间进行数据保护。在传统的(过时的)南北设计中,南桥继续其相对没那么重要的工作,将数据输送到棘手的硬盘、USB连接和传统的PCI卡。但是,有了PCI-Express,它还将数据包输送给组件,如视频卡,这些组件是数据速度狂人。它通过为每个组件使用专用的串行电路,同时进行来回传输,以及为其串行信号提供并行路线来做到这一点。
-
芯片组通过两条线串行发送数据包。另一对线路负责向相反方向发送数据包。这两对线合在一起,被称为一个通道(lane)。每对线中的一条线携带原始信号。另一条线携带信号的负像;每个0变成1,每个1变成0。这些通道的布置使任何影响一条线路的电噪声或静电也应影响另一条线路。
-
当数据包到达目的地时,接收器将负的数据包恢复到正的版本。同样的操作还能逆转由电干扰引入的任何垃圾信号的值。总线将两个成对的数据包结合起来,原始数据包中的任何干扰都被其在匹配数据包中的负像所抵消。
-
它还会对数据包进行相同的CRC操作,并将其结果与之前捆绑在数据包中的循环冗余检查(CRC)进行比较。如果循环冗余检查(CRC)不同,总线就命令重新发送该数据包。因为每个数据包中的数据序列都包含在数据包中,所以总线不必等待纠正后的数据包。它可以继续接受其他数据包,并在纠正后的数据到达时将其塞入适当的位置。
-
在减去数据包打包的开销后,基本的PCI-Express插槽的峰值额定带宽为每秒250兆字节。但PCI-E是可扩展的(scalable)。将两个或更多的通道用于向单个组件发送数据,称为通道绑定(channel bonding),每增加一个通道,带宽就会增加。PCI-E在每个通道的每个方向上以每秒250MB的速度传输数据。由于最多有32条通道,PCI-E允许在每个方向上的总合并传输率为每秒8GB。这使得单个通道的带宽几乎是老式PCI的两倍。你可以通过比较插槽的长度来识别带宽增加的扩展插槽。基本的PCI-E插槽(1X)大约是24.5毫米长。其他插槽每增加13.5毫米,就代表其带宽又增加了250MB。
-
在老式的PCI总线中,所有设备共享相同的并行电路,并接收相同的数据。这些数据包括一个标识符,说明这些信号的目的地是哪个设备。所有其他设备只是忽略它们。但是,就像电话线上的电话用户一样,当一些其他设备垄断了连接时,组件就不能接收数据。PCI-E中的链接是点对点(point-to-point)的。芯片组使用一个横梁开关,将传入的信号从一个点到另一个点,沿着专用于特定组件的电路线传输。数据同时进入几个组件。这就像在一个私人的单线电话上交谈。
2 Part 2: Software —The Computer’s Own Poetry
2.1 Chapter 5: How Words Are Stitched into Programs
2.1.1 How a Program is a Roadmap
2.1.2 How Software Interpreters Generate Action
-
一些软件语言就像全球会议上的世界领袖。在他们中的一个人说了一两句话后,每个人都必须等待,而不同的口译员将领导人的话翻译成每个听众所理解的语言。如果听众有意见要提出,也必须通过翻译。
像这样操作的软件语言被称为解释型软件,这并不令人惊讶。它们需要帮助来获得命令,这些命令是用人类可以熟练掌握的高级语言写成的,被翻译成只有处理器可以阅读的低级机器语言。Java、Python、Ruby、HTML、古老的BASIC以及脚本或批处理语言都是解释型语言。尽管解释型程序的运行速度不如下一页的编译型程序快,但它们更善于处理那些在程序运行前可能还没有的数据。这些程序的主要优点是,只写一次的程序代码可以在不同类型的计算机上使用,借助于中间的解释器,将代码转换为最终需要的机器语言,用于特定的硬件,无论是台式机、平板电脑,还是智能手机。
-
当你启动一个纯解释程序时,它的解释器,特别是为它所运行的设备而设计的解释器,会在内存中建立一个小区域,在那里放置程序的名称和当前的偏移量(offset),这是一个解释器用来跟踪它在代码中的位置的书签。
-
当解释器读取程序的每一行时,它将该行的第一个字与有效命令的列表进行比较。它还可能存储一个变量、一个字或用于存储一些临时数据的数字,例如一段在程序中稍后将被引用的数据或编号。
-
为了在早期RAM紧张的计算机中使用更少的内存,程序员设计了一些方法来避免重复相同的频繁使用的指令。每次需要一条指令时,解释器都会保存一个指令指针,用来确定该指令在内存中的位置,此指令指针以子程序调用(subroutine call)的形式执行。同一个子程序(指令的指针)可能在代码中的几个不同点被调用,但该指令本身只需要被包含一次(加载一次?)。
-
解释器使用一个寄存器来记录它在程序中的当前位置,然后在子程序调用所指向的内存位置读取并执行指令。当指令完成后,解释器返回到它离开的地方执行代码。
-
一些版本的解释器在将代码发送到微处理器执行之前,会对部分代码进行编译。提前编译(AOT)将原始代码翻译成普通操作的字节码。然后,正如其名称所暗示的,及时编译器将字节码转换为程序所运行的任何设备(PC、智能手机、平板电脑)的适当机器语言。
-
解释器使用各种捷径来使代码更短或更快地执行。一种常见的方法是创建只有一个字节长的令牌,这些令牌指向一个跳转或索引表,该索引表列出了要找到该标记代表的数据或代码的内存位置。为了使索引表更有效,一些程序使用了一种称为Huffman线程的方案,它使用不同长度的令牌。更频繁的调用被赋予缩短的令牌。这种方法允许将大量的数据转换为令牌,而不增加代码的大小。令牌线程代码的长度通常是不使用令牌的代码的一半到四分之三,而不使用令牌的代码是编译程序的四分之一到八分之一。
2.1.3 How a Compiler Churns out Software
-
前面插图中的解释器和编译器都是将人类理解的程序源代码,如BASIC或C+,翻译成计算机理解的机器语言的软件程序。编译器和解释器的区别在于此。解释器在每次运行源程序时逐行翻译源代码;编译器将整个源代码翻译成可执行文件,特定类型的计算机,如PC或Mac,无需解释器即可运行。大多数商业销售或下载的程序都是编译的。
-
编译过程从编译器程序的一部分开始,称为词法分析器(lexer)。它一次读取整个源代码中的一个字符,并执行一个称为词法分析(lexical analysis)的过程。当它读取字符时,词法分析器试图将它们组合成它所理解的保留字(reserved words)——计算机命令或标点符号。词法分析器摒弃空格、回车以及程序员为解释代码中的某些部分应该做什么而包含的注释。
-
当词典遇到一个保留词或标点符号时,它会生成一个代码令牌(code token)。token就像一个缩写,简洁地代表更多信息。
-
当词典发现一串不构成保留字的字符时,词典认为这些字符代表了一个变量(variable)。它为该变量在一个标识符表(identifier table)中分配了一个位置,该标识符表跟踪程序中每个变量的名称和内容。然后,词法分析器生成一个变量令牌(variable token),指向该变量在标识表中的位置。当词法分析器发现一串数字字符时,词法分析器将该字符串转换成整数,并产生一个整数令牌(integer token)来代表它。
-
词汇分析的结果是一个令牌流,代表程序中所有重要的命令、变量和数字。
-
编译器的第二部分,称为解析器(parser),进行句法分析(syntactic analysis),对词法分析器创建的令牌流进行评估。解析器将每个令牌转换成语法树(syntax tree)上的一个节点(node),代表程序的逻辑流程。
-
树上的每个节点代表一个程序操作,产生的数据或指令被传递给它上面的节点。该节点反过来执行另一个操作,并将结果传递给它上面的节点。当解析器完成后,编译器已将整个程序转换为代表程序结构的树。最上面的节点被称为程序(program),向其传递结果的节点是例程1(routine 1)、例程2(routine 2),以此类推,一直到树底的非常具体的节点。
-
编译器的第三部分称为代码生成器(code generator),它通过语法树工作,产生每个节点的机器代码段。对于树上的每个节点,生成器将机器代码的模板与分配给该节点的操作相匹配。
-
生成器用每个节点中的值和变量来填补每个模板中的空白。在每个模板被填充后,它被添加到构成程序的机器语言和数值的二进制数字串中。
-
在最终状态下,优化器(optimizer)检查由代码生成器产生的代码,寻找冗余。优化器(optimizer)消除了任何产生与前一操作相同结果的操作,使编译器产生的程序更小、更快。
2.2 Chapter 6: How Applications Work So You Can Play
2.2.1 How Text SHOUTS and Whispers
- 行内格式化(In-line Formatting):最古老的格式化形式,至今仍在WordPerfect和网页中使用,在单词或句子中间放置不可见的格式化标记,以改变字体、粗体和浅色等属性、字体大小,甚至可以将其隐藏。WordPerfect有一个揭示这些代码的功能,这个页面上最初写的第一段看起来是这样的。
- 样式(Styles):行内格式化和程序(如Microsoft Word)在面对页面时使用的一个快捷方式是样式。样式是一个作者全部使用的格式化属性的集合。通过将字体、大小、属性、行距和其他格式纳入一个集合,并给它一个名称,所有这些格式都可以通过从菜单中选择该样式来一次性应用。样式还可以通过编辑样式的内容,轻松改变整个文档的外观,然后在使用该样式的地方应用。
- 文本映射(Text Mapping):在电脑上,你可以删除、插入、移动和重写文字,直到截止日期。但是,举例来说,当你把一个段落移到不同的页面时,它其实并没有被移动。计算机文件是由一串连续的比特组成的。在一个地方取出比特插入其他地方将需要重写整个文件。相反,文本编辑器会记录文件中受修改影响的地方,并将任何新的、移动的或插入的文本写到文件的末尾,同时用一个标记说明每个文本的位置。当需要打印时,软件就会按照这个地图把所有的文字放在正确的顺序上。
- Word处理文本的方式:
- Microsoft Word使用一个表格集合来跟踪所有的格式化信息。其中一个表跟踪章节属性,如出现在每页顶部的标题、标签设置,以及页面方向是纵向(垂直)还是横向(水平)。
- 第二个表格跟踪应用于段落的格式化属性,如边距设置、第一行缩进和行距。
- 第三个表格跟踪应用于单个字符的格式化属性,如字体和大小、加粗、斜体和下划线。
- 在部分、段落和字符表中的指针,指向应使用一个或多个属性的文本部分。
- 当你输入或滚动文档时,文字处理器从RAM中读取更多的文本和格式化代码,并将自己的命令发送给Windows,后者将这些命令传递给显示驱动程序,这是控制你的特定显示适配器卡的代码集合。最后,该卡向显示器发送电信号,根据需要打开和关闭像素,以显示文字、图形或文件的任何其他部分。当文字处理器发送要打印的文本时,打印机驱动程序执行类似的功能,将文本和格式转换为所有打印机创建的点的模式,无论是点阵、喷墨还是激光。