计算机组成原理的一些常识

1. 基本概念


· 用数字既表示指令又表示数字是计算的基础;
· 高级编程语言允许人们按照用途来设计语言,例如Fortran是为科学计算设计的,Cobol用于商业数据处理,Lisp用于符号处理等等;高级编程语言还使得程序独立于计算机,因为编译器和汇编程序可以将高级程序翻译为任何机器的二进制指令;
· 计算机的5个经典组成部分是输入设备、输出设备、存储器、数据通路和控制器,最后的两部分有时组合在一起称为处理器。这个标准结构是独立于硬件技术的,可以将任意的计算机——过去的或现在的——划分成这5个部分;
· 硬件和软件都由多个层次组成,每一个低层对上一层掩盖细节。抽象的原则是硬件和软件设计者处理计算机系统的复杂性时都在使用的方法。抽象的层次之间的一个关键接口是指令集体系结构。这个抽象的接口使很多不同成本和性能的实现能运行相同的软件;
· 一个重要的抽象(abstraction)是硬件与低层软件之间的接口。由于它的重要性,给予了它一个特殊的名字:机器的指令集体系结构(instruction set architecture),简称体系结构,它包括程序员为使一个二进制机器语言正确运行所需要知道的所有事,包括指令、I/O设备等。这个标准化的接口允许计算机设计者脱离执行它们的硬件来讨论功能。例如脱离时钟来讨论计时功能;
· (MIPS是Microcomputer without interlocked pipeline stages的缩写,含义是无互锁流水级微处理器。)
----------------------------------------------------------------------------------------------------------------
2. 性能评价


· 单个用户关心执行时间(execution time)或称响应时间(response time),即从提交任务到任务完成所需的时间,相应地,计算中心的管理人员则关注吞吐量(throughput),即一定时间内可以完成的工作总量;
· 缩短响应时间通常意味着同时提高了吞吐率,而如果原系统任务请求数量总是超出系统吞吐能力,从而每个任务都需要排队的话,那么提高吞吐率也能够因为减少了排队时间而缩短响应时间。所以这两个指标并非相互独立的;
· 具体到计算机性能的评价中,响应时间是运行程序所需要的所有时间的总和,包括磁盘访问时间、存储器访问时间、输入输出操作时间,以及操作系统为了运行这个程序必不可少的时间开销等等;另一方面,计算机通常以分时方式运行,操作系统常常侧重于提高系统的吞吐率而不是专注于优化某个特定程序的执行时间,所以有必要特别关注CPU执行时间,以排除那些系统用于其它程序的时间或者等待I/O操作的时间;关于CPU响应时间,首先,它是一个理论上的概念,实际中无法准确测量;其次,它又分为用户CPU时间和系统CPU时间,后者是为了执行用户程序而不得不执行的一些系统操作——不过这一点很难做到精确的划分,因为常常很难说清楚某个系统操作是否是专门为某个特别的程序而执行的;关于系统CPU时间,我们常常在实际计算中忽略它,因为操作系统难以准确测量自己花费的时间,并且对同一个程序在不同操作系统上运行时,系统CPU时间很可能不同;
· CPU执行时间 = CPU时钟周期数 × 时钟周期 = 程序指令数 × 每条指令的平均时钟周期数(CPI) × 时钟周期。必须记住,对计算机性能进行评测时,唯一可靠且完备的指标是时间,因为选用不同的指令集可能使指令数下降,但同时有可能需要调整CPU结构以使得时钟周期变长,抵消了指令数减少带来的好处;同样,CPI取决于各类指令的组成情况,所以即便指令数很少,也不能断言执行之间很短;
· 同一种处理器在主频提高1倍时,相应的性能的提高往往不到1倍,其主要原因在于存储器系统的提高性能有限,所以处理器速度的提高反而使得主存瓶颈加剧;
· Amdahl定理:改进后的执行时间 = 未受改进影响的部分的执行时间 + 受改进部分的执行时间 / 改进倍数。这就是说,对某一部分进行改进后,不能期待计算机整体性能能够取得同等倍数的提升,由此产生的一个重要推论是:使最常用的部分变得更快。庆幸的是,常用的部分往往比不常用的部分更容易优化;
----------------------------------------------------------------------------------------------------------------
3. 机器语言


· 机器语言的单词称为指令,单词表称为指令集;由于所有计算机都建立在硬件技术上,而这些硬件技术又基于相似的原理,所以机器语言并非种类繁多,并且机器语言之间有很多相似性;
· 如果一个指令序列,除了结尾处再没有分支指令,除了开始再没有分支目标和分支标号,则称其为基本块(basic block),编译得最初阶段就是将程序分成基本块;
· 不调用其他过程的过程叫做叶过程。(注意和基本块的定义区分)
· 存储程序概念隐含着一种思想,即必须用一个寄存器来保存正在执行的指令的地址。由于历史原因,这个寄存器叫做程序计数器,简称PC。其实更恰当的名称是指令地址寄存器;(MIPS体系结构下,程序计数器(PC)不是一个寄存器,在一个具有流水线的CPU中,程序计数器的值在一个给定的时刻有多个可选值,但可见的只有一个。)
· 注意每个字母的大小写的ASCII值都相差32(A——65,a——97),便于大小写的检查与变换;
· 浮点数的表示分为符号位、指数和有效数位3部分;IEEE754给出了单/双精度浮点数的表示方法,分别有1个符号位 8/11 位指数位,23/52位有效数位; x = (-1)^s*2^E*F;
· 既然汇编语言是更高层软件的接口,那么汇编程序也可以处理常见机器指令的变形(例如用add语句实现move的功能),这些指令不必用硬件实现,但它们在汇编语言中简化了翻译和编程,这种指令称为伪指令;伪指令为MIPS提供了比硬件实现更丰富的汇编语言指令集,唯一的代价就是为汇编程序保留一个寄存器$at;
----------------------------------------------------------------------------------------------------------------
4. 数据通路


· 硬件设计的四项基本原则:
     简单性来自规则性;
          操作数个数不固定情况下指令所需的硬件比操作数个数固定情况下的指令所需的硬件要复杂得多.
          所有的指令都是32位长;
     越小越快;
          MIPS中寄存器只有32个.
     好的设计需要合适的折衷;
          一方面希望所有指令长度相同,另一方面又希望指令中各字段的长度对所有指令都刚好合适,这两个指标相互冲突,所以只好允许不同的指令格式,每种格式有自己的字段设置;
     加快对常见情况的处理;
          因为常数操作数频繁出现,所以在算术指令中加入常数字段,这样就比从寄存器中读取常数快得多;
· 一条算术指令能够读两个寄存器并进行运算,而数据传输指令只能读一个操作数或写一个操作数。寄存器与存储器相比,不仅访问时间短,而且吞吐率高,这是一种极难得的组合;
· 现在的计算机基于两个关键性的原则:指令以数据形式表示;程序存储在存储器中,和数据一样可以读写,这极大简化了存储器硬件和计算机系统中的软件;这些原则引出了存储( stored-program) 程序概念;
· 算术指令总是将立即数做符号位扩展,即便指令是无符号的;(无符号数指令的区别在于如果发生溢出将不引发异常);
· 多位加法器常采用超前进位单元,而不是用串行的方式产生进位值,用大量的硬件资源获得了快速进位;
· 乘除法运算单元也会使用更多的硬件以优化速度,当然即便如此,也无法和加减法效率相媲美;另外,乘法运算通常利用Booth算法,它将乘数中若干个连续的1视为一组,将乘数分解为两数之差的形式(例如 01110 = 10000 - 00010),而连续的0则无需考虑;
· 处理器一般采用流水线方式增加指令的吞吐率;设计流水线的前提是把指令划分为几个独立的工序,如取指令、指令译码、访问寄存器、算数运算、访问存储器、写回寄存器等等;流水线增加了同时执行的指令的数目以及指令开始和结束的比率。流水线并不能减少单一指令的执行时间。一个五级流水线仍然需要五个周期来完成一条指令;
· 流水线遇到的冒险(hazard), 主要分为结构冒险、控制冒险和数据冒险;结构冒险的例子是多个指令在同一时间需要访问存储器;控制冒险的例子是执行哪一条指令取决于前一条分支指令的计算结果;数据冒险的例子是一条指令的执行依赖于正在流水线中运行的另一指令的结果;
· 常见的解决冒险的方法有stall(阻塞)(例如指令与数据使用同一个存储器时,只能用硬件上的阻塞推迟下一条指令访问指令存储器进行取指令),软件nop(空指令),数据转发(从ALU计算出的结果不经过存储器、写回两个周期的等待直接传递给后面的指令),规定存储器在上升沿写入、下降沿读出等等,分支预测(统计此处分支的执行情况,猜测最可能产生的结果);
· 虽然使用硬件的方法解决冒险相关性以保证指令的正确执行可能依赖于编译器,也可能不可以依赖于编译器,但为了获得最好的效果,编译器必须了解流水线,否则,无法预料的阻塞会降低编译代码的执行效率;
----------------------------------------------------------------------------------------------------------------
5. 存储器设计


· 存储器空间分配,通常包含程序代码、静态数据、动态数据(堆/栈)、操作系统内核(含页表?)这几个部分;以4G主存(内存)为例,一种合理的方式为保留 4M, 程序代码 252M ,静态数据 64K ,动态数据 1792M, 这些2G为User使用;32位地址所提供的另外2G交给内核;
· 数据的访问通常具有时间局部性和空间局部性,前者指一个数据如果刚刚被用到的话,那么它很快会被再次用到,后者是指如果一个数据被用到的话,那么它附近的数据可能会很快被用到;根据这个原则可以建立存储器的层次结构,有若干级缓存(cache)、内存(即主存)和磁盘等构成,容量越大的存储器访问速度也越慢,但可以把最常用的数据保存在又小又快的存储器(缓存)中,这样可以在容量很大的前提下减小平均访问时间;
· 就像cache可以作为内存的缓存一样,存储器也可以作为磁盘的缓存,这项技术成为“虚拟存储器”。每当需要访问数据时,进程只需给出数据在虚拟存储器中的地址(“虚拟地址”),然后由页表的查询得到真实的物理地址,或者页表会表示数据不再内存中需要访问存储器;通过这种机制,每个进程都可以拥有一种独享内存的感觉(错觉)
· 存储器的内容被分为很多个页面,虚拟地址由虚拟页面编号与页面内偏置两部分构成,而物理地址由相应的物理页面编号和页面内偏置构成,每一个页表项由物理页面编号和一些标志位构成;页表也可能很大,所以有时需要保存在内存甚至磁盘中,而在cache中建立一部分缓存,被称为TLB(translation-lookaside buffer, 转换后援缓冲器)
· 虽然cache、TLB和虚拟存储器看起来并不相同,但它们都基于相同的原理,我们可以观察它们如何处理如下4个问题来理解:
     - 块被放在何处?
        一个位置(直接映像),多个位置(组关联)或任意位置(全关联);
     - 如何找到块?
       索引(用于直接映像cache)、有限索引(组关联cache)、全部检索(全关联cache)和专门的查找表(页表)
     - 缺失时替换那一块?
       通常是最近最少使用的块,或者随机选择;
     - 如何处理写操作?
       层次结构中的每一层可以采用直写(同时写cache和存储器)或回写(被替换时写存储器)策略;
----------------------------------------------------------------------------------------------------------------
6. 输入/输出系统


· 计算机的输入输出系统除了外部设备外还包含适配器电路和接口管理程序,其中的“接口”指适配器电路及其相应程序;
· 管理外部设备的实现方式是:虚拟化外部设备——可以让多个程序同时访问同一个外部设备资源; “驱动”外部设备——提供接口(将设备行为统一抽象为存储区空间和端口操作),分配端口地址、设置端口寄存器、管理数据传输;注意外设可以直接修改存储器但不能修改cache,所以管理外部设别时应该选择性地关闭高速缓存,否则将造成处理器和外设的通信错误;
· 驱动与CPU的通信通常由主线完成,地址、控制、数据总线分别负责设备寻址、传输使能等控制信号和实际的数据;另一方面总线又分为处理器-存储器总线、底板总线和I/O总线三类,前者长度短,速度高,常采用同步总线;I/O总线特点相反,负责主机与外设、外设与外设之间的连接;底板总线负责计算机系统和外部设备之间的通信;
· PCI(Peripheral Component Interconnect,外部设备互连)底板总线是一种现代PC机总线结构,针对Pentium以上处理器;USB(Universal Serial Bus),翻译为中文就是通用串行总线,是由Conpaq,DEC,IBM,Inter,Microsoft,NEC和Northen Telecom等公司为简化PC与外设之间的互连而共同研究开发的一种免费的标准化连接器,它支持各种PC与外设之间的连接,还可实现数字多媒体集成,主要特点是:即插即用,可热插拔。
· CPU与外设的通信通常有三种方式,轮询方式中,CPU不断发送数据,询问是否有数据到来,这种方式占用CPU时间较多,通常适用于数据频繁传输但每次数据量较少的场合,例如鼠标;第二种方式成为中断,当设备有数据需要传输时通知CPU,由CPU暂停当前进程,进入中断处理服务状态,处理结束后再恢复,这样做每次中断所需时间会比每次轮询更长,但频率较小,所以占用CPU的资源更少,典型例子是键盘;第三种方式是DMA(Direct Memory Access,直接存储器存取),当有大块数据需要集中传输时,CPU将对总线的控制权移交DMA,由后者集中进行快速数据传输,CPU则继续执行当前进程,因为常用数据均在cache或内存中,需要从硬盘中读取数据的情况很少见,所以CPU不会因DMA控制总线而受到太严重的影响,这种通信方式的典型例子是硬盘传输。
· 中断发生时,操作系统根据中断向量表选择相应的中断服务程序,进入中断服务程序前,操作系统保存当前寄存器中的参数以及接下来需要执行的指令的地址;中断程序结束后直接返回被记录的地址处;


=================================
参考材料:
David A. Patterson, John L. Hennessy, 《计算机组成和设计》,第2版;

你可能感兴趣的:(计算机组成原理的一些常识)