1. 芯片体系结构
【1】CPU之间的所有数据通信必须经过和Northbridge连接的总线(FSB)
【2】所有和RAM之间的通信必须通过Northbridge
【3】RAM只有一个端口(port)
【4】CPU和外设备之间的通信(外设经Southbridge挂载)必须通过Northbridge
结构的瓶颈:
【1】外设备访问RAM需要通过CPU——解决措施:direct memory access(DMA)允许外设通过Northbridge直接与RAM通信,无需在通过CPU。带来的问题是Northbridge的带宽
【2】Northbridge与RAM之间的通信:旧的系统只有一条总线,如今可以有两条独立的总线(bus)(DDR2)是并行称为可能。 在带宽有限的情况下,怎样安排存储访问时序是提高性能的关键。
在一些昂贵的系统中,Northbridge并没有包含存储控制单元,存储控制单元独立的与Northbridge相连,如下图:
现在的存储访问模型通过同时访问不同的内存体来减小时延。
结构的瓶颈:
该体系结构的瓶颈是Northbridge的内部带宽。
另一种增加内存带宽的方法是: 将存储控制整合进CPU并在每个CPU上附加内存(基于AMD的SMP系统)。
下图为整合的存储控制:
结构带来的问题:
NUMA - Non-Uniform Memory Architecture:由于机器必须使得所有的存储对每一个处理器可见,即内存不再是统一的。处理器之间的存储访问带来的额外开销我们称之为:NUMA factors。
2.CPU Cache
由于CPU的处理速度的增长速度比RAM性能快了很多(制造快速的RAM十分的昂贵)。
在两台机器里,一个有十分快速的RAM(但容量不大)和另一个有很大容量(但速度不是很快)中选择, 当有一个大于前者RAM容量的工作集(work set)时,后者总能得到更好的性能。
解决方案:SRAM与DRAM的结合——较小容量的SRAM与较大容量的DRAM。
SRAM的控制权不是OS或用户(管理这些资源带来的开销会远远大于SRAM处理速度带来的好处),所以SRAM是由处理器直接控制和使用。SRAM作为Cache(主存部分数据的copy)来给CPU使用。(局部性是CPU Cache概念的关键)
由于工作集往往大于缓存本身,所以如何决定缓存什么可以使性能更高是很重要的策略。由于work set中所有的数据并不是在同一时间内被CPU使用,所以我们可以使用一些临时替代缓存中数据的策略——预取(prefetching)。
总览:
现在的系统一般都采用多级缓存,并且L1缓存分为L1d与L1i , 即L1 data 与 L1 instruction。
现代的多处理器CPU体系:
高速缓存的结构:
高速缓存的构造有三种形式, 分别为直接映射高速缓存、组联高速缓存、全联高速缓存。
直接映射: 2路组联: 全联:
全联高速缓存只有一个Cache set ;这类的高速缓存适用于做小的高速缓存(如TLB)。
地址解析:
那么一个地址(VA 或是 PA)应该如何被映射到Cache的结构中呢?下面是地址在Cache中的结构:
当Cache得到一个32位地址时,首先从地址抽取出Cache set 字段然后进行组索引,若索引到某一组,再在改组内的每一行(Cache line)进行Tag匹配;若匹配上,则根据Offset字段在高速缓存的缓存块里得到数据。
全联高速缓存,则不必进行组索引(因为它只有一个组),所以其解析地址时就没有Cache set 字段。
NOTE: 当处理器需要一个数据内容(假设是一个字节)时, 整个Cache line 的内容都会被缓存进L1(而不是单单的那个字节)。
写操作:
dirty cache:一条被CPU 修改过的Cache line 但是还没有和主存交互(即主存还保存的是未被修改的内容)。
两种写策略:
【1】 直写(write through):很容易理解,即每次CPU修改 Cache内容时,Cache 都立即与主存交互(即任意时刻主存与Cache都是同步的)。明显的缺点是浪费资源。
【2】 回写 ( write back ):当Cache 内容变化后, 处理器并不立即修改主存,而仅仅是将该Cache line 标记为dirty。当该Cache line 要从Cache中丢弃时(Cache 不命中引发的替换或其他情况),dirty 标记将通知处理器根据该Cache line 的内容修改主存。
回写策略带来的问题: 很显然回写策略相比于直写有更好的性能,但同时, 在多处理器体系结构中,同步将会成为一个问题:若一个字节的数据所有的Cache line 已经被P1(处理器1) 标记成了dirty,而刚好P2 要读取该字节,则该读操作不能简单的从主存中获取该字节内容。
NOTE: 参考多处理器CPU体系结构(上图),不同处理器之间,尽管high level的缓存也是不共享缓存的。
write combining:允许总线上的数据临时的存储在WCB(write combine buffer)中,合并成一个数据块后传输。
多处理器支持:
上面已经提出了问题所在, 若是仅仅在不同处理器之间的缓存提供直接访问是不现实的(NOT fast enough)。
解决方法:当一个处理器需要一个被标记为dirty的数据时,就将该数据传输到另一个处理器。那么,处理器怎么知道该内容在另一个处理器中被标记成了dirty? 由于处理器对Cache 的处理大部分是读操作, 这就使当写操作发生后进行广播的策略变得可行。 MESI (Modified, Exclusive, Shared, Invalid) protocol。
3.VM
虚拟存储器是硬件异常、硬件地址翻译、主存、磁盘文件、和内核软件的完美交互。它为每个进程提供一个大的、一致的、私有的地址空间。
一个简单的虚拟寻址系统如下:
VM系统将虚拟存储器分割为虚拟页(VP)的大小固定的块来处理。同样的物理存储器也被分割为同样固定大小的块(PP)。
地址解析:在32位系统中, 32位的地址被分为几个字段(由于有多级页表),一个是页表目录,另一个是Offset。页表目录指向一个存储在主存内的记录(page table),真实的物理地址就由该记录值和Offset组成。
多级页表:在现代机器中大部分使用的是4级页表。 使用多级页表的原因与在Cache设计中存在直接映射、组联、全联高速缓存的道理类似,即为了协调在某一级页表中索引的时间。
TLB:
由于那些页表记录都存储于主存中,所以Cache中可以直接缓存页表记录,当命中时,物理地址就是该记录与Offset的组合。可是尽管使用L1 Cache处理的速度仍不够快。于是就有了TLB。TLB本身就是个基层在CPU芯片上的高速缓存。既然TLB是高速缓存,那么其地址也和其他Cache一样的解析。
NOTE:TLB是高相联(associativity)性的高速缓存,在早期时是全联高速缓存。
4.NUMA