计算机组成原理和结构

一、冯·诺依曼结构

现代计算机都采用存储程序结构,又称为冯·诺依曼结构,是1945年匈牙利籍数学家冯·诺依曼受宾夕法尼亚大学研制的ENIAC计算机结构的启发提出的,是世界上第一个完整的计算机体系结构。

冯·诺依曼结构的主要特点是:

  1. 计算机由存储器、运算器、控制器、输入设备和输出设备五部分组成,其中运算器和控制器合称为中央处理器(Central Processing Processor,简称CPU)。
  2. 存储器是按地址访问的线性编址的一维结构,每个单元的位数固定。
  3. 采用存储程序方式,即指令和数据不加区别混合存储在同一个存储器中。
  4. 控制器通过执行指令发出控制信号控制计算机的操作。指令在存储器中按其执行顺序存放,由指令计数器指明要执行的指令所在的单元地址。指令计数器一般按顺序递增,但执行顺序可按运算结果或当时的外界条件而改变。
  5. 以运算器为中心,输入输出设备与存储器之间的数据传送都经过运算器。

冯·诺依曼计算机的工作原理如下图5.1所示。
在这里插入图片描述

二、计算机的组成部件

2.1 运算器

运算器是计算机中负责计算(包括算术计算和逻辑计算等)的部件。运算器包括算术和逻辑运算部件(Arithmetic Logic Units,简称ALU)、移位部件、浮点运算部件(Floating Point Units,简称FPU)、向量运算部件、寄存器等。其中,复杂运算如乘除法、开方及浮点运算可用程序实现或由运算器实现。寄存器既可用于保存数据,也可用于保存地址。运算器还可设置条件码寄存器等专用寄存器,条件码寄存器保存当前运算结果的状态,如运算结果是正数、负数或零,是否溢出等。

运算器支持的运算类型经历了从简单到复杂的过程。最初的运算器只有简单的定点加减和基本逻辑运算,复杂运算如乘除通过加减、移位指令构成的数学库完成;后来逐渐出现硬件定点乘法器和除法器。在早期的微处理器中,浮点运算器以协处理器的形式出现在计算机中(如Intel 8087协处理器),包含二进制浮点数的加、减、乘、除等运算,现代的通用微处理器则普遍包含完整的浮点运算部件。20世纪90年代开始,微处理器中出现了单指令多数据(Single Instruction Multiple Data,简称SIMD)的向量运算器,部分处理器还实现了超越函数硬件运算单元,如sin、cos、exp、log等。部分用于银行业务处理的计算机(如IBM Power系列)还实现了十进制定、浮点数的运算器。

2.2 控制器

控制器是计算机中发出控制命令以控制计算机各部件自动、协调地工作的装置。控制器控制指令流和每条指令的执行,内含程序计数器和指令寄存器等。程序计数器存放当前执行指令的地址,指令寄存器存放当前正在执行的指令。指令通过译码产生控制信号,用于控制运算器、存储器、IO设备的工作以及后续指令的获取。这些控制信号可以用硬连线逻辑产生,也可以用微程序产生,也可以两者结合产生。为了获得高指令吞吐率,可以采用指令重叠执行的流水线技术,以及同时执行多条指令的超标量技术。当遇到执行时间较长或条件不具备的指令时,把条件具备的后续指令提前执行(称为乱序执行)可以提高流水线效率。控制器还产生一定频率的时钟脉冲,用于计算机各组成部分的同步(这块内容可看多发射动态调度流水线)。

由于控制器和运算器的紧密耦合关系,现代计算机通常把控制器和运算器集成在一起,称为中央处理器,即CPU。随着芯片集成度的不断提高,现代CPU除了含有运算器和控制器外,常常还集成了其他部件,比如高速缓存(Cache)部件、内存控制器等。

计算机执行指令一般包含以下过程(这块内容可看处理器体系结构(下)):从存储器取指令并对取回的指令进行译码,从存储器或寄存器读取指令执行需要的操作数,执行指令,把执行结果写回存储器或寄存器。上述过程称为一个指令周期。计算机不断重复指令周期直到完成程序的执行。体系结构研究的一个永恒主题就是不断加速上述指令执行周期,从而提高计算机运行程序的效率。由于控制器负责控制指令流和每条指令的执行,对提高指令执行效率起着至关重要的作用。

现代处理器的控制器都通过指令流水线技术来提高指令执行效率。指令流水线把一条指令的执行划分为若干阶段(如分为取指、译码、执行、访存、写回阶段)来减少每个时钟周期的工作量,从而提高主频;并允许多条指令的不同阶段重叠执行实现并行处理(如一条指令处于执行阶段时,另一条指令处于译码阶段)。虽然同一条指令的执行时间没有变短,但处理器在单位时间内执行的指令数增加了。

计算机中的取指部件、运算部件、访存部件都在流水线的调度下具体执行指令规定的操作。运算部件的个数和延迟,访存部件的存储层次、容量和带宽,以及取指部件的转移猜测算法等是决定微结构性能的重要因素。常见的提高流水线效率的技术包括转移预测技术、乱序执行技术、超标量(又称为多发射)技术等。

1) 转移预测技术

冯·诺依曼结构指令驱动执行的特点,使转移指令成为提高流水线效率的瓶颈。典型应用程序平均每5-10条指令中就有一条转移指令,而转移指令的后续指令需要等待转移指令执行结果确定后才能取指,导致转移指令和后续指令之间不能重叠执行,降低了流水线效率。随着主频的提高,现代处理器流水线普遍在10-20级之间,由于转移指令引起的流水线阻塞成为提高指令流水线效率的重要瓶颈。(搭配预测下一个PC一起食用)

转移预测技术可以消除转移指令引起的指令流水线阻塞。转移预测器根据当前转移指令或其他转移指令的历史行为,在转移指令的取指或译码阶段预测该转移指令的跳转方向和目标地址并进行后续指令的取指。转移指令执行后,根据已经确定的跳转方向和目标地址对预测结果进行修正。如果发生转移预测错误,还需要取消指令流水线中的后续指令。为了提高预测精度并降低预测错误时的流水线开销,现代高性能处理器采用了复杂的转移预测器。

例如,可以在取指部件中设置一位标志记录上一条转移指令的跳转方向,碰到转移指令,不用等该转移指令执行结果,就根据该标志猜测跳转方向进行取指。对于C语言中的for (i=0,i<N,i++)类的循环,这种简单的转移猜测就可以达到(N-1)/(N+1)的准确度,当N很大时准确度很高。

2) 乱序执行技术

如果指令i是条长延迟指令,如除法指令或Cache不命中的访存指令,那么在顺序指令流水线中指令i后面的指令需要在流水线中等待很长时间。乱序执行技术通过指令动态调度允许指令i后面的源操作数准备好的指令越过指令i执行(需要使用指令i的运算结果的指令由于源操作数没有准备好,不会越过指令i执行),以提高指令流水线效率。为此,在指令译码之后的读寄存器阶段,应判断指令需要的操作数是否准备好。如果操作数已经准备好,就进入执行阶段;如果操作数没有准备好,就进入称为保留站或者发射队列的队列中等待,直到操作数准备好后再进入执行阶段。为了保证执行结果符合程序规定的要求,乱序执行的指令需要有序结束。为此,执行完的指令均进入一个称为重排序缓冲(Re-Order Buffer,简称ROB)的队列,并把执行结果临时写入重命名寄存器。ROB根据指令进入流水线的次序,有序提交指令的执行结果到目标寄存器或存储器。CDC6600和IBM 360/91分别使用记分板和保留站最早实现了指令的动态调度。

就像保留站和重排序缓冲用来临时存储指令以使指令在流水线中流动更加通畅,重命名寄存器用来临时存储数据以使数据在流水线流动更加通畅。保留站、重排序缓冲、重命名寄存器都是微结构中的数据结构,程序员无法用指令来访问,是结构设计人员为了提高流水线效率而用来临时存储指令和数据的。其中,保留站把指令从有序变为无序以提高执行效率,重排序缓存把指令从无序重新变为有序以保证正确性,重命名寄存器则在乱序执行过程中临时存储数据。重命名寄存器与指令可以访问的结构寄存器(如通用寄存器、浮点寄存器)相对应。乱序执行流水线把指令执行结果写入重命名寄存器而不是结构寄存器,以避免破坏结构寄存器的内容,到顺序提交阶段再把重命名寄存器内容写入结构寄存器。两组执行不同运算但使用同一结构寄存器的指令可以使用不同的重命名寄存器,从而避免该结构寄存器成为串行化瓶颈,实现并行执行。

3) 超标量技术

工艺技术的发展使得在20世纪80年代后期出现了超标量处理器。超标量结构允许指令流水线的每一阶段同时处理多条指令。例如Alpha 21264处理器每拍可以取4条指令,发射6条指令,写回6条指令,提交11条指令。如果把单发射结构比作单车道马路,多发射结构就是多车道马路。

由于超标量结构的指令和数据通路都变宽了,使得寄存器端口、保留站端口、ROB端口、功能部件数都需要增加,例如Alpha 21264的寄存器堆有8个读端口和6个写端口,数据Cache的RAM通过倍频支持一拍两次访问。现代超标量处理器一般包含两个以上访存部件,两个以上定点运算部件以及两个以上浮点运算部件。超标量结构在指令译码或寄存器重命名时不仅要判断前后拍指令的数据相关,还需要判断同一拍中多条指令间的数据相关。

2.3 存储器

存储器存储程序和数据,又称主存储器或内存,一般用动态随机访问存储器(Dynamic Random Access Memory,简称DRAM)实现。CPU可以直接访问它,IO设备也频繁地与它交换数据。存储器的存取速度往往满足不了CPU的快速要求,容量也满足不了应用的需要,为此将存储系统分为高速缓存(Cache)、主存储器和辅助存储器三个层次。Cache存放当前CPU最频繁访问的部分主存储器内容,可以采用比DRAM速度快但容量小的静态随机访问存储器(Static Random Access Memory,简称SRAM)实现。数据和指令在Cache和主存储器之间的调动由硬件自动完成。为扩大存储器容量,使用磁盘、磁带、光盘等能存储大量数据的存储器作为辅助存储器。计算机运行时所需的应用程序、系统软件和数据等都先存放在辅助存储器中,在运行过程中分批调入主存储器。数据和指令在主存储器和辅助存储器之间的调动由操作系统完成。CPU访问存储器时,面对的是一个高速(接近于Cache的速度)、大容量(接近于辅助存储器的容量)的存储器。现代计算机中还有少量只读存储器(Read Only Memory,简称ROM)用来存放引导程序和基本输入输出系统(Basic Input Output System,简称BIOS)等。(对存储器的了解可看存储技术存储器层次结构

现代计算机访问内存时采用虚拟地址,操作系统负责维护虚拟地址和物理地址转换的页表,集成在CPU中的存储管理部件(Memory Management Unit,简称MMU)负责把虚拟地址转换为物理地址。

1) 高速缓存

随着工艺技术的发展,处理器的运算速度和内存容量按摩尔定律的预测指数增加,但内存速度提高非常缓慢,与处理器速度的提高形成了“剪刀差”。工艺技术的上述特点使得访存延迟成为以存储器为中心的冯·诺依曼结构的主要瓶颈。Cache技术利用程序访问内存的时间局部性(一个单元如果当前被访问,则近期很有可能被访问)和空间局部性(一个单元被访问后,与之相邻的单元也很有可能被访问),使用速度较快、容量较小的Cache临时保存处理器常用的数据,使得处理器的多数访存操作可以在Cache上快速进行,只有少量访问Cache不命中的访存操作才访问内存。

Cache是内存的映像,其内容是内存内容的子集,处理器访问Cache和访问内存使用相同的地址。从20世纪80年代开始,RISC处理器就开始在处理器芯片内集成KB级的小容量Cache。现代处理器则普遍在片内集成多级Cache,典型的多核处理器的每个处理器核中一级指令Cache和数据Cache各几十KB,二级Cache为几百KB,而多核共享的三级Cache为几MB到几十MB。现代处理器访问寄存器时一拍可以同时读写多个数据,访问一级Cache延迟为1-4拍,访问二级Cache延迟为10-20拍,访问三级Cache延迟为40-60拍,访问内存延迟为100-200拍。(搭配高速缓存存储器一起食用)

2) 内存

主存储器又称为内存。内存的读写速度对计算机的整体性能影响重大。为了提升处理器的访存性能,现代通用处理器都将内存控制器与CPU集成在同一芯片内,以减小平均访存延迟。

2.4 输入/输出设备

输入/输出设备(简称IO设备)实现计算机与外部世界的信息交换。传统的IO设备有键盘、鼠标、打印机和显示器等;新型的IO设备能进行语音、图像、影视的输入、输出和手写体文字输入,并支持计算机之间通过网络进行通信。磁盘等辅助存储器在计算机中也当作IO设备来管理。

处理器通过读写IO设备控制器中的寄存器来访问及控制IO设备。高速IO设备可以在处理器安排下直接与主存储器成批交换数据,称为直接存储器访问(Directly Memory Access,简称DMA)。处理器可以通过查询设备控制器状态与IO设备进行同步,也可以通过中断与IO设备进行同步。

三、计算机系统硬件结构发展

随着应用需求的变化和工艺水平的不断提升,冯·诺依曼结构中的控制器和运算器逐渐演变为计算机系统中的中央处理器部分,而输入、输出设备统一通过北桥和南桥与中央处理器连接,中央处理器中的图形处理功能则从中央处理器中分化出来形成专用的图形处理器。因此,现代计算机系统的硬件结构主要包括了中央处理器、图形处理器、北桥及南桥等部分。

中央处理器(Central Processing Unit,简称CPU)主要包含控制器和运算器,在发展的过程中不断与其他部分融合。传统意义上的中央处理器在处理器芯片中更多地体现为处理器核,现代的处理器芯片上往往集成多个处理器核。

图形处理器(Graphic Processing Unit,简称GPU)是一种面向2D和3D图形、视频、可视化计算和显示优化的处理器。作为人机交互的重要界面,GPU在计算机体系结构发展的过程中,担任了越来越重要的角色。除了对图形处理本身之外,还开始担负科学计算加速器的任务。

北桥(North Bridge)是离CPU最近的芯片,主要负责控制显卡、内存与CPU之间的数据交换,向上连接处理器,向下连接南桥。

南桥(South Bridge)主要负责硬盘、键盘以及各种对带宽要求较低的IO接口与内存、CPU之间的数据交换。

3.1 CPU-GPU-北桥-南桥四片结构

现代计算机的一种早期结构是CPU-GPU-北桥-南桥结构。在该结构中,计算机系统包含四个主要芯片,其中CPU(处理器)芯片、北桥芯片和南桥芯片一般是直接以芯片的形式安装或焊接在计算机主板上,而GPU则以显卡的形式安装在计算机主板的插槽上。

在CPU-GPU-北桥-南桥四片结构中,计算机的各个部件根据速度快慢以及与处理器交换数据的频繁程度被安排在北桥和南桥中。CPU通过处理器总线(也称系统总线)和北桥直接相连,北桥再通过南北桥总线和南桥相连,GPU一般以显卡的形式连接北桥。内存控制器集成在北桥芯片中,硬盘接口、USB接口、网络接口、音频接口以及鼠标、键盘等接口放在南桥芯片中。此外,在北桥上还会提供各种扩展接口用于其他功能卡的连接。采用该结构的微机系统如下图5.6所示。
在这里插入图片描述

3.2 CPU-北桥-南桥三片结构

现代计算机的一种典型结构是CPU-北桥-南桥结构。在该结构中,系统包含三个主要芯片,分别为CPU芯片、北桥芯片和南桥芯片。三片结构与四片结构最大的区别是,前者GPU功能被集成到北桥,即一般所说的集成显卡。

在CPU-北桥-南桥三片结构中,CPU通过处理器总线和北桥直接相连,北桥再通过南北桥总线和南桥相连。内存控制器、显示功能以及高速IO接口(如PCIE等)集成在北桥芯片中,硬盘接口、USB接口、网络接口、音频接口以及鼠标、键盘等接口部件放在南桥芯片中。随着计算机技术的发展,更多的高速接口被引入计算机体系结构中,在北桥上集成的IO接口的速率也不断提升。

采用该结构的微机系统如图5.7所示。
在这里插入图片描述

3.3 CPU-弱北桥-南桥三片结构

随着工艺和设计水平的不断提高,芯片的集成度不断提高,单一芯片中能够实现的功能越来越复杂。内存接口的带宽需求超过了处理器与北桥之间连接的处理器总线接口,导致内存的实际访问性能受限于处理器总线的性能。而伴随着处理器核计算性能的大幅提升,存储器的性能提升却显得幅度较小,这两者的差异导致计算机系统性能受到存储器系统发展的制约,这就是存储墙问题。

因此,对计算机系统性能影响显著的内存控制器开始被集成到CPU芯片中,从而大幅降低了内存访问延迟,提升了内存访问带宽,这在一定程度上缓解了存储墙问题。

于是,北桥的功能被弱化,主要集成了GPU、显示接口、高速IO接口(例如PCIE接口等)。

采用该结构的微机系统如图5.8所示。
在这里插入图片描述

3.4 CPU-南桥两片结构

在计算机系统不断发展的过程中,图形处理器性能也在飞速发展,其在系统中的作用也不断被开发出来。除了图形加速以外,对于一些科学计算类的应用,或者是一些特定的算法加速程序,图形处理器发挥着越来越大的作用,成为特定的运算加速器,其与中央处理器之间的数据共享也越来越频繁,联系越来越密切。

随着芯片集成度的进一步提高,图形处理器也开始被集成到CPU芯片中,于是,北桥存在的必要性就进一步降低,开始和南桥合二为一,形成CPU-南桥结构,如图5.9所示。

在这个结构中,CPU芯片集成处理器核、内存控制器和GPU等主要部件,对外提供显示接口、内存接口等,并通过处理器总线和南桥相连。南桥芯片则包含硬盘、USB、网络控制器以及PCIE/PCI、LPC等总线接口。由于GPU和CPU都需要大量访问内存,会带来一些访存冲突,而且相对来说,GPU对于实时性的要求更高,即访存优先级会更高一些,这在一定程度上会影响CPU的性能。实际上,处理器中集成的GPU性能相比独立显卡中的GPU性能会稍弱。

当然,也有一些两片结构是将GPU集成在南桥芯片中。这样在南桥上可以实现独立的显存供GPU使用,这在某些条件下更有利于GPU性能的发挥,且CPU升级时带来的开销会更小。
在这里插入图片描述

3.5 SoC单片结构

片上系统(System on Chip,简称SoC)是一种单片计算机系统解决方案,它在单个芯片上集成了处理器、内存控制器、GPU以及硬盘、USB、网络等IO接口,使得用户搭建计算机系统时只需要使用单个主要芯片即可,如图5.10所示。
在这里插入图片描述
目前SoC主要应用于移动处理器和工业控制领域,相比上述几种多片结构,单片SoC结构的集成度更高,功耗控制方法更加灵活,有利于系统的小型化和低功耗设计。但也因为全系统都在一个芯片上实现,导致系统的扩展性没有多片结构好,升级的开销也更大。随着技术的发展,封装基板上的互连技术不断发展和成熟。越来越多的处理器利用多片封装技术在单个芯片上集成多个硅片,以扩展芯片的计算能力或IO能力。

目前,主流商用处理器中面向中高端领域的处理器普遍采用两片结构,而面向中低端及嵌入式领域的处理器普遍采用单片结构。SoC单片结构最常见的是在手机等移动设备中。

四、处理器和IO设备间的通信

对存储器的控制是通过读写指令来完成的。存储器是存储单元阵列,对某个地址的读写不会影响其他存储单元。

而IO设备大都是具有特定功能的部件,不能当作简单的存储阵列来处理。由于IO设备的底层控制相当复杂,它们一般都是由一个设备控制器进行控制。设备控制器会提供一组寄存器接口,寄存器的内容变化会引起设备控制器执行一系列复杂的动作。设备控制器的接口寄存器也被称为IO寄存器。处理器通过读写IO寄存器来访问设备。写入这些寄存器的数据,会被设备控制器解析成命令,因此有些情况下将处理器对IO寄存器的访问称为命令字。处理器对内存和IO的访问模式有所不同,对访问的延迟和带宽需求也有较大差异。现代计算机系统的程序和数据都存放在内存中,内存访问性能直接影响处理器流水线的执行效率,也正是因为这样,才导致了各个Cache层次的出现。对处理器的内存访问来说,要求是高带宽和低延迟。IO设备一般用于外部交互,而IO操作一般会要求顺序的访问控制,从而导致执行效率低下,访问带宽低,延迟高,只能通过IO的DMA操作来提升性能。IO的DMA操作也是访问内存,因为DMA访存模式一般是大块的连续数据读写,所以对带宽的需求远高于对延迟的需求。

4.1 IO寄存器寻址

为了访问IO寄存器,处理器必须能够寻址这些寄存器。IO寄存器的寻址方式有两种:内存映射IO和特殊IO指令。

内存映射IO是把IO寄存器的地址映射到内存地址空间中,这些寄存器和内存存储单元被统一编址。读写IO地址和读写内存地址使用相同的指令来执行。处理器需要通过它所处的状态来限制应用程序可以访问的地址空间,使其不能直接访问IO地址空间,从而保证应用程序不能直接操作IO设备。与内存映射IO不同,特殊IO指令使用专用指令来执行IO操作。因此,IO地址空间可以和内存地址空间重叠,但实际指向不同的位置。操作系统可以通过禁止应用程序执行IO指令的方式来阻止应用程序直接访问IO设备。MIPS或LoongArch结构并没有特殊IO指令,通过普通的访存指令访问特定的内存地址空间进行IO访问。而X86结构使用专门的IO指令来执行IO操作。

4.2 处理器和IO设备之间的同步

处理器和IO设备之间需要协同工作,通过一系列软件程序来共同发挥设备功能。处理器和IO设备之间的同步有两种方式:查询中断

处理器通过向IO寄存器写入命令字来控制IO设备。大部分的控制操作不是通过一次寄存器写入就能完成的,处理器一般需要对IO寄存器进行多次访问,才能完成一次任务。绝大多数设备的IO寄存器不是无条件写入的,处理器在写入命令字之前,先要获取设备的当前状态,只有当设备进入特定的状态后,处理器才能执行特定的操作,这些特定的软件操作流程是在驱动程序中实现的。比如,对于一台打印机,打印机控制器会提供两个寄存器:数据寄存器和状态寄存器。数据寄存器用来存放当前需要打印的数据,状态寄存器用来指示打印机的状态,它包含两个基本位:完成位和错误位。完成位表示上一个字符打印完毕,可以打印下一个字符;错误位用来在打印机出现异常时指示出错的状态,比如卡纸或者缺纸。处理器在打印一串数据时,首先把数据写入数据寄存器,然后不断读取状态寄存器的值,当读出的完成位等于1时,才能把下一个字符写入数据寄存器。同时,处理器还需要检查错误位的值,当发生错误时,去执行对应的错误处理程序。

前面描述的打印过程就是查询方式的一个例子。当使用查询方式时,处理器向IO设备发出访问请求后,需要不断读取IO设备的状态寄存器,所以查询方式也被称为轮询。由于IO设备的速度一般都较慢,使用查询方式会浪费处理器的指令周期。而且,执行轮询的处理器无法同时执行其他工作,造成了性能的浪费。

为了解决查询方式效率较低的问题,中断方式被引入计算机系统。在中断方式下,处理器不需要轮询状态寄存器的值,而是在等待设备完成某个操作时转去执行其他进程。当设备完成某个操作后,自行产生一个中断信号来中断处理器的执行。处理器被中断后,再去读取设备的状态寄存器。中断方式将处理器从等待IO中解放了出来,大大提高了处理器的利用率,因此现代计算机的绝大部分IO设备都支持中断方式。

中断本质上是IO设备对处理器发出的一个信号,让处理器知道此时有数据传输需要或者已经发生数据传输。CPU收到中断信号后,会暂停当前CPU的执行进程,转去执行某个特定的程序。中断的一般过程为:

  1. 中断源发出中断信号到中断控制器;
  2. 中断控制器产生中断请求给CPU;
  3. CPU发出中断响应,并读取中断类型码;
  4. CPU根据中断类型码执行对应的中断服务程序;
  5. CPU从中断服务程序返回,中断结束。

中断源即中断的源头,比如用户敲击一下键盘,单击一下鼠标,或者DMA的一次传输完成了,对应的控制器会产生一个中断信号。中断信号可以是一根信号线,也可以是一个消息包。这个中断信息会传送到中断控制器中。中断控制器是负责中断汇集、记录和转发的硬件逻辑。中断控制器一般都具有可编程功能,因此被称为可编程中断控制器(Programmable Interrupt Controller,简称PIC)。

4.3 存储器和IO设备之间的数据传送

存储器和IO设备之间需要进行大量的数据传输。例如,系统在启动时,需要把操作系统代码从硬盘搬运到内存中;计算机想要输出图形时,需要把准备显示的数据从内存搬运到显示控制器中。

那么存储器和IO设备之间是如何进行数据交换的呢?

早期,存储器和IO设备之间的数据传送都是由处理器来完成的。由于存储器和IO设备之间没有直接的数据通路,当需要从存储器中搬运数据到IO设备时,处理器首先从存储器中读数据到通用寄存器中,再从通用寄存器写数据到IO设备中;当需要从IO设备搬运数据到存储器中时,处理器要先从IO设备中读数据到通用寄存器,再从通用寄存器写入内存。这种方式称为PIO(Programming Input/Output)模式。

由于IO访问的访问延迟一般较大,而且IO访问之间需要严格的顺序关系,因而PIO方式的带宽较低。PIO模式存在两种同步方式:查询方式和中断方式。虽然中断方式可以降低处理器查询的开销,但当进行大量数据传输时,PIO模式仍然需要占用大量的处理器时间。使用中断方式,每传送一定的数据后都要进入一次中断,在中断服务程序中真正用于数据传送的时间可能并不多,大量的时间被用于断点保护、中断向量查询、现场恢复、中断返回等辅助性工作。对于一些数据传送速率较快的设备,PIO方式可能会因为处理器搬运数据速度较慢而降低数据的传送速度,因此PIO方式一般用于键盘、鼠标等低速设备。

在PIO方式中,数据要经过处理器内部的通用寄存器进行中转。中转不仅影响处理器的执行,也降低了数据传送的速率。如果在存储器和IO设备之间开辟一条数据通道,专门用于数据传输,就可以将处理器从数据搬运中解放出来。这种方式就是DMA(Direct Memory Access,直接存储器访问)方式。DMA方式在存储器和外设之间开辟直接的数据传送通道,数据传送由专门的硬件来控制。控制DMA数据传送的硬件被称为DMA控制器。

使用DMA进行传输的一般过程为:

  1. 处理器为DMA请求预先分配一段地址空间。
  2. 处理器设置DMA控制器参数。这些参数包括设备标识、数据传送的方向、内存中用于数据传送的源地址或目标地址、传输的字节数量等。
  3. DMA控制器进行数据传输。DMA控制器发起对内存和设备的读写操作,控制数据传输。DMA传输相当于用IO设备直接读写内存。
  4. DMA控制器向处理器发出一个中断,通知处理器数据传送的结果(成功或者出错以及错误信息)。
  5. 处理器完成本次DMA请求,可以开始新的DMA请求。

DMA方式对于存在大量数据传输的高速设备是一个很好的选择,硬盘、网络、显示等设备普遍都采用DMA方式。一个计算机系统中通常包含多个DMA控制器,比如有特定设备专用的SATA接口DMA控制器、USB接口DMA控制器等,也有通用的DMA控制器用于可编程的源地址与目标地址之间的数据传输。

DMA控制器的功能可以很简单,也可以很复杂。例如,DMA控制器可以仅仅支持对一段连续地址空间的读写,也可以支持对多段地址空间的读写以及执行其他的IO操作。不同的IO设备的DMA行为各不相同,因此现代的IO控制器大多会实现专用的DMA控制器用于自身的数据传输。

下表举例说明了PIO和DMA两种数据传输方式的不同。
在这里插入图片描述
从 上面两个例子中可以看到,PIO方式和DMA方式处理的流程一致,区别在于:首先键盘的数据是被记录在IO设备本身的,而网卡的数据则直接由网卡写入内存之中;其次CPU处理时,对键盘是直接从IO寄存器读数据,而对网卡则直接从内存读数据。

看起来似乎差别不大。但需要考虑的是,IO访问相比内存访问慢很多,而且对于内存访问,CPU可以通过Cache、预取等方式进行加速,IO访问则缺少这种有效的优化方式。在上面的例子中,如果网卡采用PIO的方式使用CPU,对网卡的包一个字一个字地进行读访问,效率将非常低下。而对于键盘来说,一次输入仅仅只有8位数据,而且相比处理器的处理速度,键盘输入的速度相当低,采用PIO的处理方式能够很简单地完成数据输入任务。

【参考书籍】
计算机体系结构基础》第3版
深入理解计算机系统》第3版
计算机体系结构量化研究方法》第5版

  • 6
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yelvens

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值