软件和硬件等效原理
任何可以利用软件实现的事情可以利用硬件来实现。反之,同样。一般来说,硬件实现的速度快得多。
计算机组成部分
用来解释和执行程序的处理器(processor);
用来存储数据和程序的存储器(memory);
与外界进行数据传输的机制(mechanism I/O system)
计算机发展历史
机械计算器、真空管计算器、晶体管计算器、集成电路计算机、超大规模集成电路计算机
摩尔定律
硅芯片的密度每18个月翻一番
Rock定律:制造半导体集成电路所需要的主要设备的成本每4年就要翻一番。
计算机分层组织架构
层次 | 名称 | 功能 |
---|---|---|
第6层 | 用户层 | 执行的各种应用程序 |
第5层 | 高级语言层 | 由各种高级编程语言组成 |
第4层 | 汇编语言层 | 包含各种类型的汇编语言,转换成机器代码 |
第3层 | 系统软件层 | 处理操作系统指令,负责多用户编程 存储器保护,过程同步等 |
第2层 | 指令集体系结构层 | 由特殊的计算机系统结构所能识别的机器语言组成, |
第1层 | 控制层 | 控制单元确保正确地译码并执行指令,并且数据传送,可以由硬连线或微编程 |
第0层 | 数字逻辑层 | 计算机系统的物理构成,各种逻辑门和引线 |
冯 诺伊曼模型
冯诺依曼发表公开了存储器的思想。
现代版本的存储程序的计算机体系结构的基本特征:
1.由三大硬件系统组成:CPU、 main-memory 、I/O
2.具有执行顺序指令的处理能力
3.在主存储器系统和CPU的控制单元之间,包含一条物理上或是逻辑上的单一通道,可以强制改变指令和执行的周期,这一通道会导致系统速度减慢,也称作冯诺依曼瓶颈。
Amdahl‘s Law
对于某种特定的系统改进,计算机系统的整体加速了取决于特定部件的加速率和该部件在系统中的使用率
MARIE:简单计算机模型
概述
CPU的基本知识和组成原理
CPU:负责提取程序指令,并对指令进行译码,然后按程序规定的顺序对正确的数据执行各种操作
CPU分成两个部分:数据通道(由存储单元和算术逻辑单元所组成的网络),这些组件通过总线(传递数据的电子 线路)连接起来,利用时钟来控制时间。
控制单元,负责对各种操作进行排序并保证各种正确的数据适时地出现在所需的地方
寄存器是一种存储二进制数据的硬件设备,位于处理器的内部。
ALU:在程序执行过程中用于进行逻辑运算和算术运算
控制单元:负责监视所有指令的执行和各种信息的传送过程。
总线
总线的速度受到总线长度和共享总线的设备数目的影响。
总线包括数据总线(data bus)、地址总线(address bus)、控制总线(control bus)和电源线
各种信息的传递发生在一个总线周期内(bus cycle),总线周期是完成信息传送所需的时钟脉冲间的时间间隔。
各种控制线都是使用异步(asynchronous)总线来负责协调计算机的各种操作,这种一部总线必须采用一种较为复杂的握手协议(handshaking protocol)来强制实现与计算机其他操作的同步。
总线仲裁机制(bus arbitration)
菊花链仲裁方式:使用权依次从最高优先级向最低优先级传递
集中式平行仲裁方式: 每个设备都有一个总线请求控制线,通过一个总线仲裁器来选择
采用自选择的分配式仲裁方式:由设备自己决定哪个设备具有使用总线的最高优先级别
采用冲突检测的分配式仲裁方式,如果有任何冲突,必须重新发出一个总线使用请求,如以太网
时钟
1Hz表示每秒1个时钟周期
机器的体系结构对计算机的性能有更大的影响。具有相同时钟速度的计算机并不表示执行指令时也会使用相同数目的时钟周期。
通常说的时钟(clock)是指系统时钟(system clock);某些总线也有时钟,通 常比CPU慢,这样就造成系统的瓶颈问题。
存储器组成和寻址方式
寻址范围:
按字节寻址和数据线没有关系,按字寻址时才考虑数据线,通过数据线来判断字长(一个字节(8bit)或者字节的偶数倍)
例如:假设cpu有20根地址线和32根数据线,试问按照字节和字寻址,寻址范围分别是多少
解: 32根数据线可以看成存储字长是32位,那么一个存储字就是4个字节
按字节寻址:20根即 2的20次方=1MB
按字寻址:20位的地址线需要拿出两条来字内寻址, 只剩2的18次方=256k
ps:如果题目只给出存储器的容量位x MB,默认为nM*8
低位交叉存储:使用地址的低位来选择存储器组
高位交叉存储:使用地址的高位置来选择存储器组(实际中使用)
MARIE
MARIE表示一个真正直观和简单的计算机体系结构,包括存储器、cpu。
体系结构
MARIE具有下列特点:
使用二进制数和补码表示法: (2s: 减1,按位取反 反之,符号不变,按位取反,加1)
存储程序和采用定长字长度
按字编址
寄存器和总线
AC | 累加器 accumulator | 用来保持CPU需要处理的数据值,是一个通用寄存器 |
---|---|---|
MAR | 存储器地址寄存器 | 保持被引用数据的存储地址 |
MBR | 存储器缓冲寄存器 | 保持刚从存储器中读取或者写入存储器的数据 |
PC | 程序计数器 | 保持程序将要执行的下一条指令的地址 |
IR | 指令寄存器 | 保持将要执行的下一条指令 |
InREG | 输入寄存器 | 保持来自输入设备的数据 |
OutREG | 输出寄存器 | 保持输出到输出设备的数据 |
指令集及其表示法(RTL)
Load X | MAR←X MBR←M[MAR] AC←MBR |
---|---|
Store X | MAR←X, MBR←AC M[MAR]←MBR |
Add X | MAR←X MBR←M[MAR] AC←AC+MBR |
Subt X | MAR←X MBR←M[MAR] AC←AC-MBR |
Input | AC←InREG |
Output | Output←AC |
Halt | STOP |
Skipcond | if IR[11-10]=00 then if AC<0 then PC←PC+1 else if IR[11-10]=01 then if AC=0 then PC←PC+1 else if IR[11-10]=10 then if AC>0 then PC←PC+1 |
Jump X | PC←X ( PC←IR[11-0] ) |
指令的执行过程
fetch-decode-execute
编译程序
编译程序的任务是使用助记符号将汇编语言转换成机器语言,即完成二进制数。
编译程序阅读的是汇编语言编写的源文件,生成由机器代码组成的目标文件。
对于采用标号编写的汇编程序,编译程序必须进行两次转换!通读程序两次,每次阅读都是从上至下:
1.第一次通读时,编译程序会建立一组符号表(symbol table)的对应关系
2.第二次通读,使用符号表来填充空白地址,并且生成相应的机器语言指令。
CPU中必须有一些控制信号连线施加到 各个数据部件,才能使CPU按正确步骤执行操作。
hardwired control( 硬连线控制 ) 速度快,修改比较困难,必须修改物理部件
microprogrammed control( 微程序控制 ). 更新比较方便,设计灵活简单,减慢运行速度,扩增成本
物理上将各控制线与实际的机器指令连接起来。指 令中不同的位通过各种数字逻辑部件组合连接在一起,用来驱动不同的控 制线。硬连线控制的优点是速度快
实际的计算机体系结构
CISC is an acronym for complex instruction set computer(复杂指令集计算机). : Intel
RISC stands for reduced instruction set computer(精简指令集计算机). :MIPS
对一些小的但是完整的指令集实行硬连线,使指令执行的速度变得非常快
存储器
层次结构(hieraechical memory)
1.基本概念
存储器的速度越快,单位信息存储的成本也就越高
命中(hit)--cpu请求的数据驻留在要访问的存储器中,一般只有在较高层才会关心所谓的命中率问题
缺失 (miss) --cpu请求的数据不在要访问的存储层
命中率(bit rate) 为命中率(miss rate) 命中时间(hit time)
缺失损失(miss penalty):cpu处理一次缺失事件所需要的事件。其中包括利用新的数据取代上层存储器中的某个数据块的事件,再加上所需数据传递给处理器所需要的附加时间。
如果数据miss,那么在向下寻找的时候,会将数据所在的整个字块的内容转移到告诉缓存中,这是利用了计算机程序的”局部性特征“
2.引用的局部性
Temporal locality Spatial locality Sequential locality
Cache Memory
计算机系统会将需要频繁使用的数据复制到高速缓存存储器中,从而加快存储器的访问速度。
映射方式
基本概念
将地址的二进制位分成不同的组,称为域,根据映射模式的不同,主存储器地址的分组可以有两个或三个field
tag field:用来标识数据块的身份 word field 字的块内地址 valid bit 验证引用高速缓存块的合法性
直接映射(Direct mapped cache)
映射方式:Y=X mod N
地址格式:
block:用来选择一个唯一的高速缓存块 tag:用来复制主存储器中的数据块(到cache中)
案例:
直接关联实现成本低,实现简单但是不够灵活,同时冲突概率大,比较适合大容量Cache
全关联高速缓存(fully assocative cache)
映射方式:允许主存中每一个字块映射到Cache中的任何一块位置上。
(当Cache查找时,所有标记都需要进行比对)
地址格式:
案例
标记和数据块一起存放在高速缓存中,当进行搜索的时候,cpu会将主存的标记域与Cache中的所有合法标记域进行比对(按内容寻址),如果比对成功,则找到,否则发生miss。如果Cache已经装满了,需要使用一种置换算法来决定从cache中丢弃的数据块(victim block),最简单的置换算法是FIFO,但较少使用,还有LRU等其他算法。
全相联映射降低了块的冲突率,提高了cache的命中率,但是增加了tag的位数,同时需要特殊的硬件支持,成本高,通常使用在小容量的Cache中。
(tag field唯一确定和标识一个数据块,增加了位数就需要更多的存储容量支持)
组关联高速缓存(set associtative cache)
映射方式:将数据块映射到由几个高速缓存块组成的某个块组中,同一个高速缓存中的所有组的大小必须相同。
地址格式
set--组域 表示主存储器中的数据块会被映射到cache中的块组
置换策略
最佳替换算法的基本思想是:替换掉在未来最长时间段内不再使用的高速缓存块
LRU 最近最少被使用:保留访问记录,需要存储空间,减慢缓存速度
FIFO 先进先出
随机选择:
有效存取时间和命中几率
EAT(effective access time):每次访问所需要的平均时间
H为命中率,Access_c是高速缓存的访问时间,Access_M是主存储器的访问时间
高速缓存的写策略
当程序的局部性不好的时候,高速缓存就会失效,导致存储器的层次结构性能很差
程序设计人员必须对高速缓存的脏块(dirty block)进行处理:
1.写通(write-through):在每次的写操作时,处理器同时更新Cache和MM,保证C和MM的内容一致,但是减慢了速度
2.回写(write-back)当缓存块作为牺牲块从cache中移除时,处理器才进行更新。
3.写一次法:与回写法基本相同,只在第一次命中时同时写入主存
为了改进cache的性能,必须提高cache的命中率。使用更好的映射算法,写操作技巧,置换算法和更好的程序编码方案以及增加cache的容量大小
虚拟存储器
虚拟存储器使用硬盘作为RAM存储器的扩充,增加了进程可以使用的有效地址空间
虚拟地址 物理地址 映射 存储碎片 缺页
页帧(page frame):由主存储器分成的相等大小的信息块或数据块
页(pages):由虚拟存储器划分成的信息块或数据块,页的大小与页帧相同
分页(paging):将一个虚拟页从硬盘复制到主存储器的某个页帧的过程
分页
按照固定大小的信息块(页帧)为各个进程分配物理存储空间,并且通过将信息写入页表的方式进行跟踪。
页面的起点、终点是固定的,因此页表简单,调入方便,主存空间浪费小,会产生碎片,但是处理 保护和共享不如段式方便
工作原理:
举例:
Q:页表是如何生成的?
使用分页的有效存取时间
处理器每次访问存储器,都必须执行两次对物理存储器的访问操作。一次引用页表,一次访问实际数据;
EAT=0.99*(200ns+200ns)+0.01(10ms)=100,396ns
EAT=1.00*(200ns+200ns)=400ns
此时有效存取时间实际上是存储器访问时间的二倍,因为页表本身存放在主存储中,所以访问页表也会耗费掉一个额外的存储器存取时间。
TLB
通过将最近的页查询数据值存放到一个被称为转换旁视缓冲器(translation look-aside buffer),可以加速页表的查询时间。每个TLB的入口目录都由一个虚拟页的页码和对应的物理页帧的帧数组成。
如果TLB命中,则页表命中;cache命中与否,与页表命中与否没有必然联系,因为是两种独立的机制
cpu执行指令进行一次存储访问操作最少访问主存几次:
1.根据虚页号查找快表,若存在,则转换成物理地址,转第二部,若不存在,则发生TLB缺失,转第三步
2.判断物理地址中的标记是否和cache中的标记相等,并且有效位是否为1,如果是,则cache命中,从cache读写数据数据,若不为1,则cache缺失,转第四步
3.当TLB缺失,根据页表基址寄存器的值和虚页号找到主存中的页表项,判断有效位是否为1,若是,则将页表项转入TLB中,并形成物理地址,转第二步;如果不是,则缺页,此时需要从磁盘读入页面,处理结束后,重新执行当前指令
4.Cache缺失时,cpu根据物理地址到主存中读一块信息到cache,进行读写操作
因此最好的情况下无需访问主存;最坏的情况下,不仅要多次访问主存,还要读写磁盘数据
分页和虚拟存储器的优缺点
在地址转换上造成重大的开销,需要消耗额外的系统资源,必须有专门的硬件和操作系统的支持。
运行的程序不再收到已有物理存储器容量大小的限制,提高了cpu的使用率和系统处理能力
从操作系统的角度看,使用固定大小的页帧和页面简化了存储器空间的分配和地址的安排问题。允许以页为基础实现特定的任务保护和共享。
分段
分段将虚拟地址空间划分为多个长度可变的逻辑单元,称之段(segment)
每个段都有一个表示该段在存储器中的位置的基地址(base address),还有一个指示段的大小的界限(bound limit)。每个程序都是由若干的段组成,每个程序也有相应的段表。
分段采用的是逻辑存储空间块,因此更容易实现存储空间的保护和共享。
分页产生内部碎片现象(处理器将一个完整的页帧配置给并不需要占用整个页帧的程序);分段会造成外部碎片
外部碎片和内部碎片的区别在于:
外部碎片,存储器上的总的空间足够分配给一个进程使用,但是空间是不连续的,使用碎片收集解决
内部碎片,无法使用多余的空间
优点:段的分界与程序的自然分界相对应,段的逻辑独立性使它易于编译、管理、修改和保护。也便于多到程序共享;某些类型的段(堆栈、队列)有动态可变长度,允许自由调度以便有效利用主存空间
缺点:给主存空间分配带来麻烦,容易留下碎片
段页式
虚拟空间被分割成一些长度可变的段,而这些段又被划分为许多固定大小的页面。
每个段都有一个页表,系统的物理地址被分为三个域,段域(指示系统对应的页),页码(进入页表的偏移量),和偏移量
这种组合方法既可以从用户的角度来实现分段管理,也可以从系统的角度来实现分页管理
兼备优点,但是在地址映射过程中需要多次查表
指令系统
基本概念
操作数和指令的长度
指令包含一个操作码和多个操作数,最常用的机器指令长度时16、32、64位,各种指令集可能在特征上存在如下差别:
操作数在cpu的存储方式、指令直接作用的操作数的数目、操作数的位置 、操作码、操作数的类型和长度
指令系统体系结构(ISA)的效能衡量标准: 占用内存空间,指令系统的复杂程度、指令的长度、指令系统中指令的总数目
指令构成的格式主要有以下两种方式:
1.固定长度:浪费存储空间,指令执行速度快,采用流水线结构的时候,性能也会更好
2.可变长度:使得译码变得复杂,但是可以节省存储空间
常见的指令格式:
-
只有操作码
-
操作码+1个地址(通常只有一个存储器地址)
-
操作码+2个地址(通常是两个寄存器地址,或者是一个寄存器地址加上一个存储器地址)
-
操作码+3个地址(通常是三个寄存器地址,或者是寄存器和存储器的某种组合形式)
基于堆栈的计算机体系结构中,大部分机器指令只包含操作码,只有某些特定指令允许访问存储器
对于要求两个操作数的操作,堆栈结构采用堆栈顶部最上面的两个元素
堆栈的这种组成结构,对于计算法采用反向波兰表示法(reverse polish notation,RPN)编写的算术表达式十分有效。
Example:
三个操作数,第一个操作数一般为目标操作数:至少一个寄存器
Mult R1,X,Y
MULT R2,W,U
ADD Z,R2,R1
两个操作数,一个寄存器
Load R1,X
MULT R1,Y
LOAD R2,W
MULT R2,U
ADD R1,R2
STORE Z,R1
一个操作数,假定一个寄存器(累加器)为目标操作数
LOAD X
MULT Y
STORE TEMP
LOAD W
MULT U
ADD TEMP
STORE Z
0个操作数
PUSH X
PUSH Y
MULT
PUSH W
PUSH U
MULT
ADD
POP Z
扩展操作码
要求尽可能多的操作码的数目,尽可能短的操作码,所设计的指令长度也比较短
基本思想:选用短操作码,当有需要的时候用某种方法来将操作码加长。
大小端的位序问题 (Endian)
小端(little endian):将最低位的字节首先存放到最低位地址,将最高位的字节放到高位地址 x86
大端(big endian): 将最高位的字节存放到低位地址,将最低位的字节放到高位地址。 UNIX、因特网
FOR example:
32位的16进制数值:12345678 (每个16位进制的数字都需要半个字节,所以一个字节保存两个数字)
编址(低-->高) | 00 | 01 | 10 | 11 |
---|---|---|---|---|
BIG ENDIAN | 12 | 34 | 56 | 78 |
LITTLE ENDIAN | 78 | 56 | 34 | 12 |
大端位序的存储方式更为自然,总是先处理最高位的字节。在存储整数和字符串时使用相同的次序,对于像素大于一个字节的数据可以直接按照大端位序机器自身体系结构的安排顺序进行处理。对于huffman和lzw的编码方式时,实际的编码字可以被当作进入到某个查询表中的一个索引来使用。
16位到32位地址的转换不需要额外的运算,高精度的算术运算在小段机器上会更快更方便,允许计算机字按照非字地址边界的方法来存储数据字,允许奇数地址的读写,使得编程更加方便。
大小端位序问题在软件应用中十分重要,任何程序在从某个文件中读写数据时,必须搞清楚所运行的计算机的字节次序。如bmp是小端的,gif是小端的,jpeg是大端的,通用软件必须要对其支持。
CPU的内部存储机制
cpu的数据存储方式是区分不同指令体系结构的最基本方法,有以下三种不同的体系结构可供选择:
1.堆栈体系结构:使用一个堆栈来执行各种指令,难以产生高效率的编码
2.累加器指令体系:将操作数隐含在累加器中,降低机器的内部复杂性,允许使用非常短的指令,对存储器访问频繁
3.通用寄存器体系结构:采用多个通用寄存器组,十分有效和高效,但是操作数都必须加以命名指定,使用寄存器结构会产生较长的指令,导致较长的取值时间和译码时间。
指令类型
寻址方式
寻址方式 | 方法 |
---|---|
立即寻址(immediate) | 指令-->数值 |
直接寻址(direct) | 指令-->操作数的有效地址(存储器)-->数值 |
寄存器寻址(register) | 指令-->操作数的有效地址(寄存器)-->数值 |
间接寻址(indirect) | 指令-->存储器地址-->操作数的有效地址(指针)-->数值 |
变址寻址(indexed) | 指令-->数值 + 变址寄存器的偏移量-->操作数的有效地址-->数值 |
基址寻址 | 指令-->数值(偏移量) + 基地址寄存器的基地址-->操作数的有效地址-->数值 |
堆栈寻址 | 堆栈顶部-->数值 |
其他的寻址方式 |
指令流水线
流水线:将取指-译码-执行周期分成一些较小的步骤,其中的某些较小步骤可以并行执行,加快执行速度
假设有一个k级流水线,时钟周期时间为t_p,并假定有n条指令,通常称为n个任务,则利用k级流水线完成n任务需要的时间为:
加速比(speedup):利用流水线后获得的速度上的提升。t_n=k*t_p,即完成一个任务的时间,因此获得的加速比:
![](https://i-blog.csdnimg.cn/blog_migrate/f609c185b7b6ecb5bb2bb9a168113b4c.png)
当n取无限大的条件时,可以得到理论上的加速比 S=k,因此最大的加速比实际上就是流水线的级数
带条件分支转移的指令流水线:并不是每一个周期都有一条指令从流水线流出
将if-else放在for循环外部效率更高,不打断for内部的流水线
if-else会打断并行流水线,若有多个分支,switch-case效率更高