zoukankan      html  css  js  c++  java
  • TLB与cache的深入分析[转]

    一)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模式,切 到普通进程时退出该模式.

    二)cache


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

    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


    三)内存一致性

    内存一致性涉有到一系列的问题:

    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.

    转自:http://blog.csdn.net/hangbing0203/article/details/5600759

  • 相关阅读:
    Linux命令未找到(command not found),误删Linux path原始路径
    Linux安装JDK1.8
    Python批量修改文件夹内所有json文件中部分内容
    [转]jQuery插件开发精品教程,让你的jQuery提升一个台阶
    使用apache的ab对页面进行压力测试
    http_load压力测试
    php json_encode数据格式化2种格式[]和{}
    PHP接收JSON格式的数据
    新浪短链接API接口示例
    一个提示样式
  • 原文地址:https://www.cnblogs.com/viviancc/p/2660780.html
Copyright © 2011-2022 走看看