时间与空间的矛盾(简称时空矛盾)是推动、制约计算机体系发展的主要矛盾。理想状况下,我们希望计算机速度足够快,存储空间足够大,但是实际中两者不可能同时满足。通过以时间换空间或以空间换时间,来部分解决两者的矛盾以达到计算机系统整体的高速、有效运转。由于程序指令的时空局部性原理,使得时空转换得以有效实现。
计算机系统具体面临的主要矛盾是CPU与主存的速度和空间矛盾。前者通过多级高速缓存cache机制解决,即增加cache硬件以空间换时间解决两者的速度矛盾;后者的矛盾通过虚拟内存机制解决,即可简单理解为将硬盘空间虚拟为主存空间解决主存空间过小的问题,实则通过页、块对换以时间换空间。
在斯特灵的《操作系统精髓与设计原理》一书中谈到了进行虚拟内存和高速缓存设计所面临的的主要问题有:高速缓存大小(虚拟内存机制中,进程在主存中实际拥有的块称为驻留集或工作集)、块大小(cache机制中称为行大小。32位虚拟内存机制通常采用4kb作为一块大小)、映射函数(或映射方式,如直接映射、全相连、组相连)、替换算法(如先入先出FIFO、最近最久未使用LRU、最不经常使用NRU等)、写策略(全写法、回写法等)。
下面通过一道试题简单分析这两种机制。
- 假定一个计算机系统中有一个TLB和一个L1 Data Cache。该系统按字节编址,虚拟地址16位,物理地址12位,页大小128B,TLB为四路组相连,共有16个页表项,L1 Data Cache采用直接映射方式,块大小为4B,共16行。在系统运行到某一时刻,TLB、页表和L1 Data Cache中的部分内容如下所示:
组号 | 标记 | 页框号 | 有效位 | 标记 | 页框号 | 有效位 | 标记 | 页框号 | 有效位 | 标记 | 页框号 | 有效位 | |||
0 | 03 | * | 0 | 09 | 0D | 1 | 00 | * | 0 | 07 | 02 | 1 | |||
1 | 03 | 2D | 1 | 02 | * | 0 | 04 | * | 0 | 0A | * | 0 | |||
2 | 02 | * | 0 | 08 | * | 0 | 06 | * | 0 | 03 | * | 0 | |||
3 | 07 | * | 0 | 63 | 0D | 1 | 0A | 34 | 1 | 72 | * | 0 |
a)TLB(四路组相连):4组、16个页表项
虚页号 | 页框号 | 有效位 |
00 | 08 | 1 |
01 | 03 | 1 |
02 | 14 | 1 |
03 | 02 | 1 |
04 | * | 0 |
05 | 16 | 1 |
06 | * | 0 |
07 | 07 | 1 |
08 | 13 | 1 |
09 | 17 | 1 |
0A | 09 | 1 |
0B | * | 0 |
0C | 19 | 1 |
0D | * | 0 |
0E | 11 | 1 |
0F | 0D | 1 |
b)部分页表(开始16项)
行索引 | 标记 | 有效位 | 字节3 | 字节2 | 字节1 | 字节0 |
0 | 19 | 1 | 12 | 56 | C9 | AC |
1 | 15 | 0 | * | * | * | * |
2 | 1B | 1 | 03 | 45 | 12 | CD |
3 | 36 | 0 | * | * | * | * |
4 | 32 | 1 | 23 | 34 | C2 | 2A |
5 | 0D | 1 | 46 | 67 | 23 | 3D |
6 | * | 0 | * | * | * | * |
7 | 16 | 1 | 12 | 54 | 65 | DC |
8 | 24 | 1 | 23 | 62 | 12 | 3A |
9 | 2D | 0 | * | * | * | * |
A | 2D | 1 | 43 | 62 | 23 | C3 |
B | * | 0 | * | * | * | * |
C | 12 | 1 | 76 | 83 | 21 | 35 |
D | 16 | 1 | A3 | F4 | 23 | 11 |
E | 33 | 1 | 2D | 4A | 45 | 55 |
F | 14 | 0 | * | * | * | * |
c)L1 Data Cache :直接映射,共16行,块大小为4B
试回答下列问题:
1.虚拟地址中哪几位表示虚拟页号?哪几位表示页内偏移量?虚拟页号中哪几位表示TLB标记?哪几位表示TLB索引?
2.物理地址中哪几位表示物理页号?哪几位表示页内偏移量?
3.主存(物理)地址如何划分成标记字段、行索引字段和块内地址字段?
4.CPU从地址067AH中取出的值为多少?说明CPU读取地址067AH中内容的过程。
注意:TLB也是高速缓存cache的一种,位于CPU内,但它只缓存主存中的快表;而cache可缓存任意主存单元内容。
解:
1.虚拟地址16位,而页大小为128B,需要7位二进制位表示,故虚拟页号为高(16-7)=9表示,则低7位为页内偏移。
TLB为4路组相连,组间直接映射,组内全相连,故低7位为页内偏移,第8、9位为组号,高7位为TLB查找标记。
2.物理地址12位,低7位为页内偏移,高5位为物理页号。[通过虚拟地址的虚页号与物理地址的物理页号(页框号)的对应映射,即将虚拟地址转换为物理地址]。
3.cache的映射方式为直接映射,(块)行大小为4B,故需要低2位定位到1个字节;共有16行,故需要中间4位定位到一行;剩余的12-2-4=6位作为标记位,供查找时进行对比。
4.此时取出的地址067AH是虚拟地址,根据题意与分析,先在TLB中查快表:
067AH二进制表示为:0000 0110 0111 1010,中间2位是00,故应查TLB的第0组;又标记位是:03H,于是找到第0组的第0行,此时它的有效位是0,无效,所以继续查找主存中的页表;高7位虚拟页号是0CH,对应的页框号是19H且有效位是1,这样虚拟地址对067AH对应的物理地址是1100 1111 1010。
欲访问物理地址1100 1111 1010的主存单元,先查cache,根据3的分析,物理地址中间4位是:1110,查找到cahce的第15行,有效位是1,且标记位是33H,二进制表示为110011正是物理地址的高6位。又物理地址低2位是10,则对应的是第3个字节,内容是4A。所以,从067AH中取出的内容是4AH。
综上:
1.CPU首先得到的是虚拟地址,必须将虚拟地址转换为物理地址才能进行数据访问。这个过程先查TLB,若TLB命中,则得到了物理地址,进行步骤2;否则,继续查找主存中的页表。若仍不命中,则引发缺页中断进行调页。调页过程又可能引发驻留集页替换和页回写过程。
2.得到物理地址之后,首先访问cache,若命中,CPU直接从cache中读取相应物理地址中的内容;若不命中,则访问主存读取数据,并且更新cache,此过程又可能引发cache的行替换和回写过程。