免费智能真题库 > 历年试卷 > 软件设计师 > 2017年下半年 软件设计师 上午试卷 综合知识
  第2题      
  知识点:   高速缓存   Cache   地址映射
  关键词:   Cache   地址映射   主存        章/节:   计算机硬件基础知识       

 
在程序执行过程中,Cache与主存的地址映射是由( )完成的。
 
 
  A.  操作系统
 
  B.  程序员调度
 
  C.  硬件自动
 
  D.  用户软件
 
 
 

 
  第13题    2024年上半年  
   67%
在计算机系统中,CPU中跟踪后继指令地址的寄存器是(  )。
  第4题    2017年下半年  
   45%
内存按字节编址。若用存储容量为32Kx8bit的存储器芯片构成地址从AOOOOH到DFFFFH的内存,则至少需要( )片芯片。
  第1题    2019年下半年  
   39%
在cpu内外常需设置多级高速缓存(cache),主要目的是(1)。
   知识点讲解    
   · 高速缓存    · Cache    · 地址映射
 
       高速缓存
        高速缓存(Cache)是位于CPU和主存之间的高速存储子系统。采用高速缓存的主要目的是提高存储器的平均访问速度,使存储器的速度与CPU的速度相匹配。Cache的存在对程序员是透明的。其地址变换和数据块的替换算法均由硬件实现。通常Cache被集成到CPU内,以提高访问速度,其主要特点是容量小、速度快、成本高。
        1)Cache的组成
        Cache的组成如下图所示。Cache由两部分组成,即控制部分和缓存部分。缓存部分用来存放主存的部分复制信息。控制部分的功能是:判断CPU要访问的信息是否在Cache中,若在即为命中,若不在则没有命中。命中时直接对Cache寻址;未命中时,要按照替换原则,决定主存的一块信息放到Cache的哪一块里面。
        
        高速缓存的组成框图
        2)Cache中的地址映像方法
        因为处理机访问都是按主存地址访问的,而应从Cache中读写信息,因此这就需要地址映像,即把主存中的地址映射成Cache中的地址。地址映像的方法有3种,即直接映像、全相联映像和组相联映像。
        (1)直接映像就是主存的块与Cache中块的对应关系是固定的。主存中的块只能存放在Cache的相同块号中。因此,只要主存地址中的主存区号与Cache中的主存区号相同,则表明访问Cache命中。一旦命中,以主存地址中的区内块号立即可得到要访问的Cache中的块。这种方式的优点是地址变换很简单,缺点是灵活性差。
        (2)全相联映像允许主存的任一块可以调入Cache的任何一块的空间中。在地址变换时,利用主存地址高位表示的主存块号与Cache中的主存块号进行比较,若相同则为命中。这种方式的优点是主存的块调入Cache的位置不受限制,十分灵活;其缺点是无法从主存块号中直接获得Cache的块号,变换比较复杂,速度比较慢。
        (3)组相联映像是前面两种方式的折中。具体做法是将Cache中的块再分成组。组相联映像就是规定组采用直接映像方式而块采用全相联映像方式。这种方式下,通过直接映像方式来决定组号,在一组内再用全映像方式来决定Cache中的块号。由主存地址高位决定主存区号,与Cache中区号比较可决定是否命中。主存后面的地址即为组号,但组块号要根据全相联映像方式,由记录可以决定组内块号。
        3)替换算法
        选择替换算法的目标是使Cache获得最高的命中率。常用的替换算法有以下几种。
        (1)随机替换(RAND)算法:用随机数发生器产生一个要替换的块号,将该块替换出去。
        (2)先进先出(FIFO)算法:将最先进入的Cache信息块替换出去。
        (3)近期最少使用(LRU)算法:将近期最少使用的Cache中的信息块替换出去。这种算法比先进先出算法要好些,但此法也不能保证过去不常用的将来也不常用。
        (4)优化替换(OPT)算法:先执行一次程序,统计Cache的替换情况。有了这样的先验信息,在第二次执行该程序时便可以用最有效的方式来替换,达到最优的目的。
        4)Cache的性能分析
        若H为Cache的命中率,tc为Cache的存取时间,tm为主存的访问时间,则Cache的等效访问时间ta
        ta=Htc+(1-H)tm
        使用Cache比不使用Cache的CPU访问存储器的速度提高的倍数r可以用下式求得,即
        
 
       Cache
        Cache的功能是提高CPU数据输入输出的速率,突破所谓的“冯.诺依曼瓶颈”,即CPU与存储系统间数据传送带宽限制。高速存储器能以极高的速率进行数据的访问,但因其价格高昂,如果计算机的内存完全由这种高速存储器组成则会大大增加计算机的成本。通常在CPU和内存之间设置小容量的高速存储器Cache。Cache容量小但速度快,内存速度较低但容量大,通过优化调度算法,系统的性能会大大改善,仿佛其存储系统容量与内存相当而访问速度近似Cache。
               Cache基本原理
               使用Cache改善系统性能的依据是程序的局部性原理。依据局部性原理,把内存中访问概率高的内容存放在Cache中,当CPU需要读取数据时就首先在Cache中查找是否有所需内容,如果有,则直接从Cache中读取;若没有,再从内存中读取该数据,然后同时送往CPU和Cache。如果CPU需要访问的内容大多都能在Cache中找到(称为访问命中),则可以大大提高系统性能。
               如果以h代表对Cache的访问命中率(“1-h”称为失效率,或者称为未命中率),t1表示Cache的周期时间,t2表示内存的周期时间,以读操作为例,使用“Cache+主存储器”的系统的平均周期为t3。则:
               t3=t1×h+t2×(1-h
               系统的平均存储周期与命中率有很密切的关系,命中率的提高即使很小也能导致性能上的较大改善。
               例如,设某计算机主存的读/写时间为100ns,有一个指令和数据合一的Cache,已知该Cache的读/写时间为10ns,取指令的命中率为98%,取数的命中率为95%。在执行某类程序时,约有1/5指令需要存/取一个操作数。假设指令流水线在任何时候都不阻塞,则设置Cache后,每条指令的平均访存时间约为:
               (2%×100ns+98%×10ns)+1/5×(5%×100ns+95%×10ns)=14.7ns
               映射机制
               当CPU发出访存请求后,存储器地址先被送到Cache控制器以确定所需数据是否已在Cache中,若命中则直接对Cache进行访问。这个过程被称为Cache的地址映射(映像)。在Cache的地址映射中,主存和Cache将均分成容量相同的块(页)。常见的映射方法有直接映射、全相联映射和组相联映射。
               (1)直接映射。直接映射方式以随机存取存储器作为Cache存储器,硬件电路较简单。直接映射是一种多对一的映射关系,但一个主存块只能够复制到Cache的一个特定位置上去。
               例如,某Cache容量为16KB(即可用14位表示),每块的大小为16B(即可用4位表示),则说明其可分为1024块(可用10位表示)。则主存地址的最低4位为Cache的块内地址,然后接下来的中间10位为Cache块号。如果内存地址为1234E8F8H的话(一共32位),那么最后4位就是1000(对应十六进制数的最后一位“8”),而中间10位,则应从E8F(1110 1000 1111)中获取,得到10 1000 1111。因此,内存地址为1234E8F8H的单元装入的Cache地址为10 1000 1111 1000。
               直接映射方式的优点是比较容易实现,缺点是不够灵活,有可能使Cache的存储空间得不到充分利用。例如,假设Cache有8块,则主存的第1块与第17块同时复制到Cache的第1页,即使Cache其他页面空闲,也有一个主存页不能写入Cache。
               (2)全相联映射。全相联映射使用相联存储器组成的Cache存储器。在全相联映射方式中,主存的每一页可以映射到Cache的任一页。如果淘汰Cache中某一页的内容,则可调入任一主存页中的内容,因而较直接映射方式灵活。
               在全相联映射方式中,主存地址不能直接提取Cache页号,而是需要将主存页标记与Cache各页的标记逐个比较,直到找到标记符合的页(访问Cache命中),或者全部比较完后仍无符合的标记(访问Cache失败)。因此这种映射方式速度很慢,失掉了高速缓存的作用,这是全相联映射方式的最大缺点。如果让主存页标记与各Cache标记同时比较,则成本又太高。全相联映像方式因比较器电路难于设计和实现,只适用于小容量Cache。
               (3)组相联映射。组相联映射是直接映射和全相联映射的折中方案。它将Cache中的块再分成组,通过直接映射方式决定组号,通过全相联映射的方式决定Cache中的块号。在组相联映射方式中,主存中一个组内的块数与Cache的分组数相同。
               例如:容量为64块的Cache采用组相联方式映像,每块大小为128个字,每4块为一组。若主存容量为4096块,且以字编址,那么主存地址应该为多少位?主存区号(组号)为多少位?这样的题目,首先根据主存与Cache块的容量需一致,即每个内存块的大小也是128个字,因此共有128×4096个字(219个字),即主存地址需要19位。因为Cache分为16组,所以主存需要分为4096/16=256组,即28组,因此主存组号需8位。
               在组相联映射中,由于Cache中每组有若干可供选择的页,因而它在映像定位方面较直接映像方式灵活;每组页数有限,因此付出的代价不是很大,可以根据设计目标选择组内页数。
               淘汰算法
               当Cache产生了一次访问未命中之后,相应的数据应同时读入CPU和Cache。但是当Cache已存满数据后,新数据必须淘汰Cache中的某些旧数据。最常用的淘汰算法有随机淘汰法、先进先出法(First In and First Out, FIFO)和近期最少使用淘汰法(Least Recently Used, LRU)。其中平均命中率最高的是LRU算法。
               写操作
               因为需要保证缓存在Cache中的数据与内存中的内容一致,相对读操作而言,Cache的写操作比较复杂,常用的有以下几种方法。
               (1)写直达(write through)。当要写Cache时,数据同时写回内存,有时也称为写通。
               (2)写回(write back)。CPU修改Cache的某一行后,相应的数据并不立即写入内存单元,而是当该行从Cache中被淘汰时,才把数据写回到内存中。
               (3)标记法。对Cache中的每一个数据设置一个有效位。当数据进入Cache后,有效位置1;而当CPU要对该数据进行修改时,数据只需写入内存并同时将该有效位清0。当要从Cache中读取数据时需要测试其有效位:若为1则直接从Cache中取数,否则从内存中取数。
 
       地址映射
        如前所述,当一个任务被加载到内存后,它的各个连续的逻辑页面,被分散地存放在若干个不连续的物理页面当中。在这种情形下,为了保证程序能够正确地运行,需要把程序中使用的逻辑地址转换为内存访问时的物理地址,也就是地址映射。
        那么如何将一个逻辑地址映射为相应的物理地址呢?在页式存储管理当中,连续的逻辑地址空间被划分为一个个的逻辑页面,这些逻辑页面被装入到不同的物理页面当中。也就是说,系统是以页面为单位来进行处理的,而不是以一个个的字节为单位。因此,地址映射的基本思路是:
        .逻辑地址分析:对于给定的一个逻辑地址,找到它所在的逻辑页面,以及它在页面内的偏移地址;
        .页表查找:根据逻辑页面号,从页表中找到它所对应的物理页面号;
        .物理地址合成:根据物理页面号及页内偏移地址,确定最终的物理地址。
               逻辑地址分析
               由于页面的大小一般都是2的整数次幂,因此,人们可以很方便地进行逻辑地址的分析。具体来说,对于给定的一个逻辑地址,可以直接把它的高位部分作为逻辑页面号,把它的低位部分作为页内偏移地址。例如,假设页面的大小是4KB,即212,逻辑地址为32位。那么在一个逻辑地址当中,最低的12位就是页内偏移地址,而剩下的20位就是逻辑页面号。
               下图是逻辑地址分析的一个例子,在这个例子中,逻辑地址用十六进制形式表示。假设页面的大小为1KB,逻辑地址为0x3BAD。在这种情形下,首先把这个十六进制的地址展开为二进制的形式。然后,由于页面的大小为1KB,即2的10次方,所以这个逻辑地址的最低10位,就表示页内偏移地址,而剩下的最高6位,就表示逻辑页面号。因此,该地址的逻辑页面号是0x0E,页内偏移地址是0x03AD。
               
               逻辑地址分析的例子
               如果逻辑地址不是用十六进制,而是用十进制的形式来表示,那么有两种做法:一是先把它转换为十六进制的形式,然后重复刚才的步骤。二是采用如下的计算方法:
               逻辑页面号=逻辑地址/页面大小
               页内偏移量=逻辑地址%页面大小
               用页面大小去除逻辑地址,得到的商就是逻辑页面号;得到的余数就是页内偏移地址。例如,假设页面的大小为2KB,现在要计算逻辑地址7145的逻辑页面号和页内偏移地址。用2048去除7145,得到的商是3,余数是1001。所以这个逻辑地址的逻辑页面号是3,页内偏移地址是1001。实际上,这个算法和刚才的十六进制的方法是完全等价的。从二进制运算的角度来看,一个是右移操作,一个是除法操作。把一个整数右移N位等价于把它除以2N
               页表查找
               对于给定的一个逻辑地址,如果知道其逻辑页面号,就可以去查找页表,从中找到相应的物理页面号。
               在具体实现上,页表通常是保存在内核的地址空间中,因为它是操作系统的一个数据结构。另外,为了能够访问页表的内容,在硬件上要增加一对寄存器。一个是页表基地址寄存器,用来指向页表的起始地址;另一个是页表长度寄存器,用来指示页表的大小,即对于当前任务,它总共包含有多少个页面。操作系统在进行任务切换的时候,会去更新这两个寄存器当中的内容。
               物理地址合成
               对于给定的一个逻辑地址,如果已经知道了它所对应的物理页面号和页内偏移地址,可以采用简单的叠加算法,计算出最终的物理地址。假设物理页面号为f,页内偏移地址为offset,每个页面的大小为2n,那么相应的物理地址为:f×2n+offset。
               下图是页式存储管理当中的地址映射机制,也是以上各个步骤的一个综合。假设在程序的运行过程中,需要去访问某个内存单元,因此就给出了这个内存单元的逻辑地址。如前所述,这个逻辑地址由两部分组成,一是逻辑页面号,二是页内偏移地址。这个分析工作是由硬件自动来完成的,对用户是透明的。在页表基地址寄存器当中,存放的是当前任务的页表首地址。将这个首地址与逻辑页面号相加,就找到相应的页表项。里面存放的是这个逻辑页面所对应的物理页面号。将这个物理页面号取出来,与页内偏移地址进行组合,从而得到最终的物理地址。然后就可以用这个物理地址去访问内存。
               
               页式存储管理中的地址映射
               现有的这种地址映射方案,虽然能够实现从逻辑地址到物理地址的转换,但它有一个很大的问题。当程序运行时需要去访问某个内存单元,例如,去读写内存当中的一个数据,或是去内存取一条指令,需要访问2次内存。第一次是去访问页表,取出物理页面号;第二次才是真正去访问数据或指令。也就是说,内存的访问效率只有50%。这样,就会降低获取数据的存取速度,进而影响到整个系统的使用效率。为了解决这个问题,人们又引入了快表的概念。它的基本思路来源于对程序运行过程的一个观察结果。对于绝大多数的程序,它们在运行时倾向于集中地访问一小部分的页面。因此,对于它们的页表来说,在一定时间内,只有一小部分的页表项会被经常地访问,而其他的页表项则很少使用。根据这个观察结果,人们在MMU中增加了一种特殊的快速查找硬件:TLB(Translation Lookaside Buffer),或者叫关联存储器,用来存放那些最常用的页表项。这种硬件设备能够把逻辑页面号直接映射为相应的物理页面号,不需要再去访问内存当中的页表,这样就缩短了页表的查找时间。
               在TLB方式下,地址映射的过程略有不同。当一个逻辑地址到来时,它首先会到TLB当中去查找,看这个逻辑页面号所在的页表项是否包含在TLB当中,这个查找的速度是非常快的,因为它是以并行的方式进行。如果能够找到的话,就直接从TLB中把相应的物理页面号取出来,与页内偏移地址拼接成最终的物理地址。如果在TLB中没有找到该逻辑页面,那只能采用通常的地址映射方法,去访问内存当中的页表。接下来,硬件还会在TLB当中寻找一个空闲单元,如果没有空闲单元,就把某一个页表项驱逐出来,然后把刚刚访问过的这个页表项添加到TLB当中。这样,如果下次再来访问这个页面,就可以在TLB中找到它。
               页式存储管理方案的优点是:
               (1)没有外碎片,而且内碎片的大小不会超过页面的大小。这是因为系统是以页面来作为内存分配的基本单位,每一个页面都能够用上,不会浪费。只是在任务的某一些页面当中,可能没有装满,里面有一些内碎片。
               (2)程序不必连续存放,它可以分散地存放在内存的不同位置,从而提高了内存利用率。
               (3)便于管理。
               页式存储管理方案的缺点主要有:
               (1)程序必须全部装入内存,才能够运行。如果一个程序的规模大于当前的空闲空间的总和,那么它就无法运行。
               (2)操作系统必须为每一个任务都维护一张页表,开销比较大。简单的页表结构已经不能满足要求,必须设计出更为复杂的结构,如多级页表结构、哈希页表结构、反置页表等。
   题号导航      2017年下半年 软件设计师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第2题    在手机中做本题