TLb和硬件Cache

转帖于

http://blog.csdn.net/hangbing0203/archive/2010/05/17/5600759.aspx


一)TLB

1)TLB的概述

TLB是一个内存管理单元用于改进虚拟地址到物理地址转换速度的缓存.

TLB是位于内存中的页表的cache,如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据.

2)tlb的原理

当cpu对数据进行读请求时,CPU根据虚拟地址(前20位)到TLB中查找.
TLB中保存着虚拟地址(前20位)和页框号的对映关系,如果匹配到虚拟地址就可以迅速找到页框号(页框号可以理解为页表项),通过页框号与虚拟地址后12位的偏移组合得到最终的物理地址.

如果没在TLB中匹配到虚拟地址,就出现TLB丢失,需要到页表中查询页表项,如果不在页表中,说明要读取的内容不在内存,需要到磁盘读取.

TLB是MMU中的一块高速缓存,也是一种Cache.

在分页机制中,TLB中的数据和页表的数据关联,不是由处理器维护,而是由OS来维护,TLB的刷新是通过装入处理器中的CR3寄存器来完成.

如果MMU发现在TLB中没有命中,它在常规的页表查找后,用找到的页表项替换TLB中的一个条目.

3)tlb的刷新原则

当进程进行上下文切换时重新设置cr3寄存器,并且刷新tlb.

有两种情况可以避免刷tlb.
 第一种情况是使用相同页表的进程切换.
 第二种情况是普通进程切换到内核线程.

lazy-tlb(懒惰模式)的技术是为了避免进程切换导致tlb被刷新.
当普通进程切换到内核线程时,系统进入lazy-tlb模式,切到普通进程时退出该模式.

 

三、TLB lazy模式
1、原理
由于TLB刷新会带来一定的性能损失,所以,需要尽量减少使用。
当内核中进行进程上下文切换时,有如下两种情况,实际上是不需要立刻进行TLB刷新的,可以避免应TLB刷新代理店额性能损失,Linux充分考虑了这些情况,可谓将
相关性能进行了充分发挥:
1)当从普通进程切换到内核线程时。由于Linux中,所有进程共享内核地址空间,内核线程并不使用用户态部分的地址空间,只使用内核部分,所以,当从普通进程切换到内核线程时,内核线程继续沿用prev进程的用户态地址空间,但是并不访问,其只访问内核部分。因此,这种情况下,实际不不需要立刻flush TLB。
2)当新切换的next进程和prev进程使用相同的页表时,比如同一进程中的线程,共享地址空间。此时也不需要进行TLB刷新。
对于上述的第2中情况,由于不会重新加载CR3,不会切换页表,自然也不会触发TLB刷新。
对于上述的第1中情况,如果不进行特殊处理,实际是会在重新加载CR3时触发TLB刷新的,从而导致性能损失。TLB lazy刷新模式即针对这种情况设计。其基本原理为:
当发生内核调度,从普通进程切换到内核线程时,则当前CPU进入TLB lazy模式,当切换到普通进程时退出lazy模式。进入TLB lazy模式后,如果其它CPU通过IPI(核间中断)通知当前CPU进行TLB flush时,在IPI的中断处理函数中,将本CPU对应的active_mm的mask中的相应位清除,因此,当其它CPU再次对该mm进行TLB flush操作时,将不会再向本CPU发送IPI,此后至本CPU退出TLB lazy模式前,本CPU将不再收到来自其它CPU的TLB flush请求,由此实现lazy,提升效率。
值得注意的是,在进入TLB lazy模式后,当第一次收到TLB flush的IPI时,本CPU重新新加载主内核页目录swapper_pg_dir到CR3中,从而将本CPU的TLB刷新一次(不包括Global项)。如此操作的目的注意是因为担心X86架构CPU的超长指令预取,预取的指令可能会访问到需要刷新的TLB entry对应的物理内存,此时如果不flush TLB,可能会出现一致性问题。Linux内核中采用这种相对比较暴力的方式避免了这种情况,虽然看似有点暴力,实则是没有更好的其他做法的无奈之举。
所以,在TLB lazy模式下,如果收到TLB flush请求,实际上还是会刷新一次,看起来好像不怎么lazy,但由于清除了active_mm中相应的cpu mask位,可以避免后续的TLB flush,实际还是有点效果的。

 

二)cache 
1)cache的概念:
cache是为了解决处理器与慢速DRAM(慢速DRAM即内存)设备之间巨大的速度差异而出现的.
cache属于硬件系统,linux不能管理cache.但会提供flush整个cache的接口.
cache分为一级cache,二级cache,三级cache等等.一级cache与cpu处于同一个指令周期.

Cache的工作原理是基于程序访问的局部性。 


例如:查看当前系统的cache.

dmidecode -t cache

# dmidecode 2.9
SMBIOS 2.6 present.

Handle 0x0700, DMI type 7, 19 bytes
Cache Information
        Socket Designation: Not Specified
        Configuration: Enabled, Not Socketed, Level 1
        Operational Mode: Write Back
        Location: Internal
        Installed Size: 128 KB
        Maximum Size: 128 KB
        Supported SRAM Types:
                Unknown
        Installed SRAM Type: Unknown
        Speed: Unknown
        Error Correction Type: Single-bit ECC
        System Type: Data
        Associativity: 8-way Set-associative

Handle 0x0701, DMI type 7, 19 bytes
Cache Information
        Socket Designation: Not Specified
        Configuration: Enabled, Not Socketed, Level 2
        Operational Mode: Write Back
        Location: Internal
        Installed Size: 1024 KB
        Maximum Size: 2048 KB
        Supported SRAM Types:
                Unknown
        Installed SRAM Type: Unknown
        Speed: Unknown
        Error Correction Type: Single-bit ECC
        System Type: Unified
        Associativity: 8-way Set-associative

Handle 0x0702, DMI type 7, 19 bytes
Cache Information
        Socket Designation: Not Specified
        Configuration: Enabled, Not Socketed, Level 3
        Operational Mode: Write Back
        Location: Internal
        Installed Size: 4096 KB
        Maximum Size: 4096 KB
        Supported SRAM Types:
                Unknown
        Installed SRAM Type: Unknown
        Speed: Unknown
        Error Correction Type: Single-bit ECC
        System Type: Unified
        Associativity: 16-way Set-associative

分别是:
1级cache:128KB
2级cache:1024KB
3级cache:4096KB

2)Cache的存取单位(Cache Line)

CPU从来不从DRAM直接读/写字节或字,从CPU到DRAM的每次读或写的第一步都要经过L1 cache,每次以整数行读或写到DRAM中.
Cache Line是cache与DRAM同步的最小单位.
典型的虚拟内存页面大小为4KB,而典型的Cache line通常的大小为32或64字节.
CPU 读/写内存都要通过Cache,如果数据不在Cache中,需要把数据以Cache Line为单位去填充到Cache,即使是读/写一个字节.
CPU 不存在直接读/写内存的情况,每次读/写内存都要经过Cache.

3)Cache的工作模式

数据回写(write-back):这是最高性能的模式,也是最典型的,在回写模式下,cache内容更改不需要每次都写回内存,直到一个新的 cache要刷新或软件要求刷新时,才写回内存.
写通过(write-through):这种模式比回写模式效率低,因为它每次强制将内容写回内存,以额外地保存cache的结果,在这种模式写耗时,而读和回写模一样快,这都为了内存与cache相一致而付出的代价.
预取 (prefectching):一些cache允许处理器对cache line进行预取,以响应读请求,这样被读取的相邻内容也同时被读出来,如果读是随机的,将会使CPU变慢,预取一般与软件进行配合以达到最高性能.


注:
大部分的cache允许软件在某个区域设置模式,一个区域可能是回写,另一个可能是预取.用户一般不能改变cache的模式, 这些通常由设备驱动程序来控制.
预取通常由软件通过所谓的cache隐函数madvise进行控制.

例如:查看当前系统的cache在哪种模式下工作

dmidecode -t cache

# dmidecode 2.9
SMBIOS 2.6 present.

Handle 0x0700, DMI type 7, 19 bytes
Cache Information
        Socket Designation: Not Specified
        Configuration: Enabled, Not Socketed, Level 1
        Operational Mode: Write Back
        Location: Internal
        Installed Size: 128 KB
        Maximum Size: 128 KB
        Supported SRAM Types:
                Unknown
        Installed SRAM Type: Unknown
        Speed: Unknown
        Error Correction Type: Single-bit ECC
        System Type: Data
        Associativity: 8-way Set-associative

Handle 0x0701, DMI type 7, 19 bytes
Cache Information
        Socket Designation: Not Specified
        Configuration: Enabled, Not Socketed, Level 2
        Operational Mode: Write Back
        Location: Internal
        Installed Size: 1024 KB
        Maximum Size: 2048 KB
        Supported SRAM Types:
                Unknown
        Installed SRAM Type: Unknown
        Speed: Unknown
        Error Correction Type: Single-bit ECC
        System Type: Unified
        Associativity: 8-way Set-associative

Handle 0x0702, DMI type 7, 19 bytes
Cache Information
        Socket Designation: Not Specified
        Configuration: Enabled, Not Socketed, Level 3
        Operational Mode: Write Back
        Location: Internal
        Installed Size: 4096 KB
        Maximum Size: 4096 KB
        Supported SRAM Types:
                Unknown
        Installed SRAM Type: Unknown
        Speed: Unknown
        Error Correction Type: Single-bit ECC
        System Type: Unified
        Associativity: 16-way Set-associative
        
结果表明都是回写,如下:
Operational Mode: Write Back


1.直接映像

  • 主存与Cache的划分:

将主存根据Cache的大小分成若干分区,Cache也分成若干个相等的块,主存的每个分区也分成与Cache相等的块。

  • 主存与Cache的映像:

主存中的每一个分区由于大小相同,可以与整个Cache相像,其中的每一块正好配对。编号不一致的块是不能相互映像的。

  • 特点:

优点:地址变换简单。缺点:每块相互对应,不够灵活。

  • 主存与Cache的地址组成:

主存:区号+块号+块内地址

Cache:块号+块内地址

2.全相联映像

  • 主存与Cache的划分:

将主存与Cache划分成若干个大小相等的块。

  • 主存与Cache的映像:

主存中每一块都可以调到Cache中的每一块。

  • 特点:

优点:访问灵活,冲突率低,只有Cache满时才会出现在冲突。缺点:地址变换比较复杂,速度相对慢。

  • 主存与Cache的地址组成:

主存:块号+块内地址

Cache:块号+块内地址

3.组相联映像

  • 主存与Cache的划分:

主存:主存根据Cache大小划分成若干个区,每个区内划分成若干个组,每个组再划分成若干个块。

Cache:划分成若干个组,每个组划分成若干个块。

  • 主存与Cache的映像:

主存的每个分区与Cache采用直接映像,主存的每个组之内采用全相联映像。

  • 特点:

融合了直接映像与全相联映像两种映像方式,结合了两者的优据点。具体实现容易,命中率与全相联映像接近。

  • 主存与Cache的地址组成:

主存:区号+组号+块号+块内地址

Cache:组号+块号+块内地址

实例分析:

1.容量为64块的Cache采用组相联方式映像,字块大小为128字节,每4块为一组,若主容量为4096块,且以字编址,那么主存地址为(____)位,主存区号为(____)位。

组相联的地址构成为:区号+组号+块号+块内地址。

主存的每个分区大小与整个Cache大小相等,故此主存需要分的区数为:4096/64=64,因为26=64,因此需要6位来表示区号。

每4块为一组,故共有组数 64/4 = 16 ,因为24=16,因此需要4位表示组号。

每组4块,故表示块号需要2位。

块内地址共128字节,27=128,所以块内地需要7位表示。

所以:主存地址的位数=6+4+2+7 = 19

主存区号的位数=6

2.某 32 位计算机的 cache 容量为 16KB,cache 块的大小为 16B,若主存与 cache 的地址映射采用直接映射方式,则主存地址为 1234E8F8(十六进制)的单元装入的 cache 地址为____。

A. 00 0100 0100 1101 (二进制)
B. 01 0010 0011 0100 (二进制)
C. 10 1000 1111 1000 (二进制)
D. 11 0100 1110 1000 (二进制)

:Cache大小为16KB,块大小为16B,所以Cache被分成16KB/16B=1024块,因210=1024故需要10位来表示块数。24=16故块内地址需要4位来表示。所以Cache的地址线位置为14位。由于采用直接映像的方式,所以主存的后14位就是要装入的到Cache中的位置。故选 C.

 

 

三)内存一致性

write back会涉及内存一致性,涉有到一系列的问题:

1)多处理要系统更新cache时,一个处理器修改了cache的内容,第二个处理器将不能访问这个cache,直到这个cache的内容被写内存.
在现代处理器中硬件已经做了精心的设计,确保这种事情不会发生,硬件负责保持cache在各个CPU之间一致.

2)外围硬件设备可以通过DMA(Direct Memory Access)访问内存,而不让处理器知道,也不会利用cache,这样在内存和cache之间就会出现不同步的情况.
管理DMA的操作是操作系统的工作,比如设备驱动程序,它将保证内存与cache的一致性.

3)当在cache中的数据比内存中的数据老时,称为stale.如果软件初始化DMA,使设备和RAM之间传递数据,那么软件必须告诉 CPU,cache中的条目必须失效.

4)当在cache中的数据比内存中的数据新时,称为dirty.在设备驱动程序允许一个设备经DMA从内存读数据时,它必须确保所有的dirty 条目写进内存.也叫做flushing或sync cache.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值