RSIC:精简指令集。CISC:复杂指令集 算法
RISC结构具备比较少的指令,这些指令是简单的指令(固定长度的指令和较少的寻址模式)。CISC结构具备更多的指令,更加复杂,可变长度指令和更加多的寻址方式编程
RISC具备较小的指令,硬件上相对没有那么复杂。CISC使用更加复杂的硬件来解码和分解复杂的指令。所以RISC更加侧重软件,CSIC更加侧重硬件缓存
CISC具备更加复杂的指令,所以可使用更加少的RAM来存储编程指令。相对的,RISC须要更加多的RAM来存储指令数据结构
RISC的指令一般须要一个周期完成,而CISC能够能须要多个周期才能完成,具体取决于指令的复杂性。所以在RISC中能够进行流水线化。架构
RISC经过减小每条指令的周期数来提升性能,而CISC经过减小每条程序的指令数来提升细嫩那个。CISC支持单条指令完成从内存读取,执行操做,写回内存的操做(mem2mem操做)。而RISC完成则须要三个指令。app
冯诺依曼结构中,指令和数据存储在同一个存储器中。CPU读取数据和指令使用同一条总线,具备存储数据和指令的统一缓存。dom
哈佛结构中,数据和指令是分开存储的,可使用两条不一样的总线同时访问数据和指令,指令和数据都具备单独的缓存。异步
字节顺序是指字节在内存中的存储顺序。数据在内存中一般是按照字节寻址的,可是大多数计算即一般采用32位(4个字节)存储操做数的。所以,为了将一个字节存在存储器中,由两种方式:ide
高字节存在低地址中,这称之为Big Endian函数
低字节存在低地址中,这称之为Little Endian
例如,当cpu向地址0x1000中写入0xDDCCBBAA时,两种方式就会出现差别
DRAM:Dynamic Random Access Memory。动态随机存储,数据以电荷的形式存储,每一个存储单元是由晶体管和电容组成的,数据存在电容中。DRAM是易失性设备,电容会由于漏电而流失电荷,因此须要定时刷新。
SRAM:Static Random Access Memory。静态随机存储,不须要属性,只须要电源便可,SRAM的存储单元由六个晶体管组成,所以与DRAM相比,占用面积更加多。
SRAM速度快,成本搞,经常使用于高速缓存。DRAM密度小,速度慢,经常使用于主存储器
256KB=2^8*2^10Bytes,须要18位地址线
Program Counter (PC):保存当前正在执行的指令的地址
Instruction Register (IR):保存当前正在执行的指令的寄存器。(PC所指向的地址上的值)
General Purpose Registers:通用寄存器是用于存储程序所须要的数据,通用寄存器的数量由体系结构定义,并能够由软件用于运行期间零是存储数据。
Stack Pointer Register (SP):堆栈指针寄存器用于存储压入队长的最新数据的地址。常见的用途是存储子函数调用时的返回地址。
流水线技术是在单个处理器中实现指令集并行的技术。将基本的指令周期拆分为多个阶段,无需等待每条指令完成,并行执行不一样的步骤,在一条指令结束以前开始下一条指令。流水线能投提升指令的吞吐率,可是并不能减少指令的指令时间。
pipeline hazard是指因为某些缘由下一条指令没法执行的状况。有三种类型的hazard:
Structural Hazards:因为硬件资源不足产生的。好比若是设计结构中只有一个浮点执行单元,每次执行都须要两个周期的时间,那么当程序中出现背靠背的浮点指令时会致使流水线中止。除此以外内存和缓存的访问也会致使Structural Hazards
Data Hazards:因为先后指令数据的依赖性而形成的hazard
A、RAW:先读后写register,ture data dependence
B、WAW:先写后写register,output data dependence
C、WAR:先写后读register, anti-data dependence
Control Hazards:当碰到跳转指令时,processor会stall一个cycle。 由于processor在处理指令时会分两个stage:取指令和解码指令。 当一条指令进入到解码阶段时,才会被发现须要跳转,因此在取指令阶段 的那条指令会被废掉,故浪费掉一个cycle。
Structural Hazards:将一个function unit切分红更小的stage或对设计相同功能的硬件等,总之,就是让硬件资源够用。
Data Hazards:A状况是真正的数据依赖,会产生hazard,能够用forwarding技术来减小或消除它;而B和C是在当指令顺序被compiler或者是硬件调整后才会出现的数据依赖。若是出现了B和C的状况,能够有一种技术来消除它,叫作register renaming。
Control Hazards:能够在program中加入likely()or unlikely()来帮助compiler预测taken or not taken的可能性。另外,compiler能够经过delayed-branch的技术来消除branch hazard,可是该技术不多用在很长的pipeline中。最后,能够经过硬件的技术消除Brach hazard。以上的技术都是compiler或hardware的技术,programmer能够不关心,但好的if语句应该 以下:
if(unlikely(condition))
{
概率小
}
else
{
概率大
}
注意:将概率大的语句放在not taken下面,将概率小的语句放在taken下,这样会节省4个
cycle左右(由pipeline的深度决定)。另外,还有一种写法就是将unlikely改成likely,将概率大的和概率小的对调,这种方法比第一种方法要慢或持平(至于缘由有compiler的缘由,有pipeline的缘由,因此它依赖于compiler和chip的设计)。
第一个数据须要10ns完成,此后1ns完成一个数据的处理,所以总时间位10+99=109ns
当即数寻址,操做数做为指令的一部分
add r0 r1 0x12 将r1+0x12的结果存在r1
直接寻址,操做数的地址直接出如今指令中
load r0 0x10000 将地址0x10000的数据存到r0中
寄存器寻址,操做数被存在寄存器中,寄存器的名字出如今指令中
mul r0, r1 , r2 将r1*r2的结果存在r0中
偏移量寻址,操做数的地址由一个寄存器的数据加上一个当即数的偏移量获得
load r0 r1 offset r1包含了及地址,r1+offset才是真实的地址
局域性原理:程序经常重复使用它们最近用过的数据和指令。一条普遍适用的经验规律是:一个程序90%的执行时间花费在仅10%的代码中。局域性意味着咱们能够根据一个程序最近访问的指令和数据,比较准确地预测它近期会使用哪些内容。局域性的原理也适应于数据访问,不过不像代码访问那样明显。
时间局域性是指最近访问过的内容极可能会在短时间内被再次访问。
空间局域性是指地址相互临近的项目极可能会在短期内都被用到。
Register
Cache
Main Memory/Primary Memory
Secondary Memory (Magnetic/Optical)
cache是小型的快速存储。一般在Main Memory和CPU之间,有时放置于CPU内。
每当CPU请求存储位置的内容时,都会首先检查cache中是否有此数据。若是cache中存在数据,则CPU直接从cache中获取数据。 因为不须要CPU进入该数据的Main Memory,所以速度更快。 若是缓存中不存在数据,则将一块数据从Main Memory读取到cache中,而后以字块的形式从cache中传输到CPU。
在cache中查找地址时,若缓存中包含该内存位置,称之为cache hit。若是在cache找不到,则称之为cache miss。
链表是一种将其元素存储在非连续存储位置中的数据结构,而向量是一种将元素存储在连续位置中的数据结构。 对于具备cache的设计:若是cache中存在一块数据,则极可能在cache中也存在后续的连续数据,由于一般是从主存储器到高速缓冲存储器的任何取指令 根据缓存行(一般为64或128字节)获取。 所以,在拥有cache的机器上,经过向量进行搜索将比链表进行搜索更快。
一共有三种主要的映射方法。这三种映射中,主存储器和cache都被划分为存储块(blocks of memory,也称cache line,每一个64bytes),这是映射时的最小单位。
直接映射(Direct Mapping):直接映射中,主内存和cache中始终存在一对一的映射,一组只有一个数据块。例如:在下图中,cache大小为128个块,而主内存中有4096个块。设计实现是基于模数计算获得的,i为cache的块序号,j是主内存的块编号,m是cache的行数,i = j mod m。若是块的大小为64B而地址为32为,则地址[5:0]称为字节偏移量,它说明字节在块中的位置,地址[12:6]称为组位,说明地址地址映射到哪一组,剩下的地址位做为标志位,标志说明cache映射了哪些内存中的地址。这是最简单的映射,而且能够经过内存地址能够轻松计算cache中的数据在内存中的位置,而且只须要一个标记为进行比较就能知道是否命中。这种映射的缺点是命中率低, Cache的存储空间利用率低。
全局关联映射(Fully Associate Mapping):任何的内存块都能映射到cache的任何块中,使用和上面的图同样的例子,地址[5:0],做为块内部的索引,剩下的全部位都用于和cache中的全部标记为进行比较,这须要很大的比较器。虽然这种方式命中率较高,Cache的存储空间利用率高,可是线路复杂,成本高,速度低
组关联映射(Set Associate Mapping):将cache分红u组,每组v行,主存块存放到哪一个组是固定的,至于存到该组哪一行是灵活的,即有以下函数关系:cache总行数m=u×v,组号q=j mod u组间采用直接映射,组内为全相联。例如,下图显示了128个块的相同高速缓存,这些高速缓存组织为64个集合,每一个集合具备2个块。硬件较简单,速度较快,命中率较高,可是与分组有关系。
更高关联性的cache意味着须要更加大的比较器,用于将传入的地址和标签进行对比,会致使更加大的硬件需求和功耗。
cache的索引位有4位,所以cache包含2^4=16个块,每一个块只有1byte因此不须要块内索引,剩下的16-4=12位所有做为标记位
cache的块的数量为256K/64=4096,而cache为四路关联,则组数量为4096/4=1024。64byte的cache line 须要6位进行块内索引,10位进行集合索引,剩下的32-6-10=16位做为标记为
直写式缓存方式: 当CPU要将数据写入内存时,除了更新缓冲内存上的数据外,也将数据写在SDRAM中以维持主存与缓冲内存的一致性,当要写入内存的数据多起来的话,速度天然就慢了下来.
回写式缓存方式: 当CPU要将数据写入内存时,只会先更新缓冲内存上的数据,随后再让缓冲内存在总线不塞车的时候才把数据写回SDRAM,因此速度天然快得多
回写缓存在内存带宽利用方面更好,由于仅在须要时才回写数据。 若是系统中存在多个能够缓存同一地址的cache,则维护数据一致性很是复杂,由于内存可能并不老是具备最新数据。
cache的inclusive和exclusive属性适用于具有多级缓存的设计。
当CPU试图从某地址load数据时,首先从L1 cache中查询是否命中,若是命中则把数据返回给CPU。若是L1 cache缺失,则继续从L2 cache中查找。当L2 cache命中时,数据会返回给L1 cache以及CPU。若是L2 cache也缺失,很不幸,咱们须要从主存中load数据,将数据返回给L2 cache、L1 cache及CPU。这种多级cache的工做方式称之为inclusive cache。某一地址的数据可能存在多级缓存中。
与inclusive cache对应的是exclusive cache,这种cache保证某一地址的数据缓存只会存在于多级cache其中一级。也就是说,任意地址的数据不可能同时在L1和L2 cache中缓存。
exclusive cache的优势之一是多级cache能够一块儿存储更多的数据。通常使用inclusive cache类型,每次cache miss,能够从下一级的cache中寻找,load。而exclusive cache,每次cache miss,只能去main memory中load。可是exclusive cache比较节省cache size。
如下是一些可用于替换cache line的算法
LRU(Least Recently Used):将最近最少使用的内容替换出cache
MRU (Most Recently Used):与MRU,将最近常常的内容提出cache
PLRU (Pseudo LRU):关联性很大的时候,LRU的实现成本很高。若是实际状况在丢弃任一个最近最少使用的数据就能知足,那么伪LRU算法就派上用场了,它为每个缓存数据设立一个标志位就能够工做。
LFU (Least Frequently Used):这个缓存算法使用一个计数器来记录条目被访问的频率。经过使用LFU缓存算法,最低访问数的条目首先被移除。这个方法并不常用,由于它没法对一个拥有最初高访问率以后长时间没有被访问的条目缓存负责。
Random replacement:在该算法中,不存储任何信息,而且在须要替换时选择一条随机行。
在多个处理器拥有本身的cache的共享多处理器系统中,相同数据(相同地址)的多个副本可能会同时存在于不一样的cache中。 若是容许每一个处理器自由更新cache,则可能致使内存视图不一致。 这称为高速缓存一致性问题。 例如:若是容许两个处理器将值写入同一地址,则在不一样处理器上读取同一地址可能会看到不一样的值。
Snoop based Coherence Protocol:来自处理器的数据请求将发送到共享系统一部分的全部其余处理器。 其余全部处理器都监听此请求,并查看它们是否具备数据副本并作出相应响应。 所以,每一个处理器都须要维护存储器的一致性视图。
Directory based Coherence Protocol:目录用于跟踪哪些处理器正在访问和缓存哪些地址。 发出新请求的任何处理器都将检查此目录,以了解其余代理是否有副本,而后能够向该代理发送点对点请求以获取最新的数据副本。
Snoop based Coherence | Directory based Coherence Protocol |
---|---|
对于小的系统来讲,若是带宽足够,基于监听的协议速度会更加快 | 基于目录的协议须要使用查找表,这将会致使较长的时延 |
基于监听的协议不适合大型系统,由于它须要将将每个请求信息进行广播 | 因为不须要广播,基于目录的协议更加适合大型系统 |
MESI协议时多处理器系统中最经常使用的cache一致性协议。MESI 是指4中状态的首字母。每一个Cache line有4个状态,可用2个bit表示,它们分别是:
状态 | 描述 | 监放任务 |
---|---|---|
M 修改 (Modified) | 该Cache line有效,数据被修改了,和内存中的数据不一致,数据只存在于本Cache中。 | 缓存行必须时刻监听全部试图读该缓存行相对就主存的操做,这种操做必须在缓存将该缓存行写回主存并将状态变成S(共享)状态以前被延迟执行。 |
E 独享、互斥 (Exclusive) | 该Cache line有效,数据和内存中的数据一致,数据只存在于本Cache中。 | 缓存行也必须监听其它缓存读主存中该缓存行的操做,一旦有这种操做,该缓存行须要变成S(共享)状态。 |
S 共享 (Shared) | 该Cache line有效,数据和内存中的数据一致,数据存在于不少Cache中。 | 缓存行也必须监听其它缓存使该缓存行无效或者独享该缓存行的请求,并将该缓存行变成无效(Invalid)。 |
I 无效 (Invalid) | 该Cache line无效。 | 无 |
是对于MESI协议的扩展,引入了两个新状态“F”“O”:
F (Forward): 在MOESI协议中,S状态的定义发生了细微的变化。当一个Cache行状态为S时,其包含的数据并不必定与存储器一致。若是在其余CPU的Cache中不存在状态为O的副本时,该Cache行中的数据与存储器一致;若是在其余CPU的Cache中存在状态为O的副本时,Cache行中的数据与存储器不一致。
O (Owned): O位为1表示在当前Cache 行中包含的数据是当前处理器系统最新的数据拷贝,并且在其余CPU中必定具备该Cache行的副本,其余CPU的Cache行状态为S。若是主存储器的数据在多个CPU的Cache中都具备副本时,有且仅有一个CPU的Cache行状态为O,其余CPU的Cache行状态只能为S。与MESI协议中的S状态不一样,状态为O的Cache行中的数据与存储器中的数据并不一致。
虚拟内存是一致内存管理技术,及时实际的物理内存很小,虚拟处理器也容许处理器查看地址的虚拟连续空间。操做系统管理虚拟地址空间以及从辅助设备(如磁盘)到物理主内存的内存分配。CPU中的地址转换硬件(memory management unit,MMU)将虚拟地址转换为物理地址。 此地址转换使用分页的概念,其中将连续的内存地址块(称为页)用于虚拟内存和实际物理内存之间的映射。
软件程序或进程用来访问其地址空间中存储位置的地址称为虚拟地址。 而后,操做系统连同硬件将其转换为另外一个地址,该地址可用于实际访问DRAM上的主内存位置,该地址称为物理地址。 地址转换是使用分页的概念完成的,若是主内存或DRAM没有此位置,则在OS的协助下,数据将从辅助内存(如磁盘)移至主内存。
全部虚拟内存都将虚拟地址空间划分为页,页内的虚拟内存地址是连续的。页是内存从辅助存储移动到物理内存以管理虚拟内存的最小单位。大多数计算机系统的页至少为4KB.当须要更大的实际内存是,某些结构还支持更大的页。页表用于将应用程序看到的虚拟地址转换为物理地址,是一种数据结构,用于多页状况下,在内存中虚拟地址到物理地址的映射。
TLB: Translation Lookaside Buffer。根据功能能够译为快表,直译能够翻译为旁路转换缓冲,也能够把它理解成页表缓冲。里面存放的是一些页表文件(虚拟地址到物理地址的转换表)。当处理器要在主内存寻址时,不是直接在内存的物理地址里查找的,而是经过一组虚拟地址转换到主内存的物理地址,TLB就是负责将虚拟内存地址翻译成实际的物理内存地址,而CPU寻址时会优先在TLB中进行寻址。处理器的性能就和寻址的命中率有很大的关系。
当程序访问映射到虚拟地址空间但未加载到主存储器中的内存页时,计算机硬件[内存管理单元(MMU)]会发起中断。 此中断称为页面错误。
可使用外部中断源来中断CPU上的程序执行。
中断是一个异步事件
一般由外部硬件(I / O设备或其余外围设备)生成,而且不会与指令执行边界同步。例如:键盘,存储设备或USB端口可能会发生中断。当前指令执行结束后,老是对中断进行服务,而且CPU跳转到执行中断服务程序。
异常是一个同步事件
异常当处理器在执行指令时检测到任何预约义条件时生成的同步事件。例如:当程序遇到被零除或未定义的指令时,它将生成异常。异常又分为三种类型,程序流的改变方式取决于类型:
故障:在发生故障的指令以前由处理器检测到故障并对其进行维修
陷阱:在致使陷阱的指令以后对陷阱进行维修。最多见的陷阱是用于调试的用户定义中断。
停止:停止仅用于在执行再也不继续的状况下发出严重的系统问题信号
向量中断是一种中断,终端设备使用该中断特有的代码将处理器定向到正确的中断服务程序中,该代码由中断设备与该中断一块儿发送给处理器。
而非向量中断,中断服务程序须要读取中断寄存器,解码出致使中断的中断源,而后执行特定的中断服务程序
指令缓存和预取
指令缓存和预取算法将在实际的指令解码和执行阶段以前继续提取指令,这能够较小设计中指令提取阶段的存储等待时间延迟。
分支预测和分支目标预测
分支预测基于历史指令预测是否将发生条件分支,而分支目标预测将有助于在处理器计算以前预测目标。 这能最大程度地减小指令提取停顿,由于提取算法能够根据预测保持提取指令。
Memory Mapped I/O (MMIO)是一种在CPU与I/O或外围设备之间执行输入/输出(I/O)的方法.CPU使用相同的地址总线来访问内存和I/O设备(包括I/O设备内部的寄存器或内部的任何内存)。在系统地址映射中,为I/ O设备保留了一些内存区域,而且当CPU访问该地址时,响应访问并监视该地址总线的相应I/ O设备。例如:若是CPU具备32位地址总线:它能够访问0到2\^32之间的地址,而且在该区域中,咱们能够为一个或多个I/O设备保留地址(例如0到2^10)。