Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1037195
  • 博文数量: 123
  • 博客积分: 1029
  • 博客等级: 准尉
  • 技术积分: 1167
  • 用 户 组: 普通用户
  • 注册时间: 2012-02-13 00:15
文章分类

全部博文(123)

文章存档

2014年(24)

2013年(45)

2012年(54)

分类: LINUX

2014-04-22 00:43:12

《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处于同一个指令周期.


例如:查看当前系统的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在各个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://www.lupaworld.com/home-space-do-blog-uid-56821-id-149605.html

TLB与cache的异同  

2008-07-09 09:36:05|  分类: ARM |  标签: |字号 

TLB:基于页表访问的特点,采用一种容量小(8~16个字),访问速度快(和通用寄存器访问速度相当)的存储器来存放页表中的地址变换条目.
cache:数据从主存到CPU之间传送的数据缓存,以块为单位(一个块大小为几个字).

无论从数据搜索方式,更新方式,分类方式,以及替换的形式,一开始很可能把这两种东西当做一样东西.

但是,他们确实是两种不同的机制:

1:控制寄存器并不相同.TLB用的是CP15的C2,C8,C10. cache用的是CP15的C1,C7,C9.
2:写入的单位大小不同.TLB只是单个的地址变换条目写入(4字节). cache是根据块的大小复制块大小的数据(有点像memcpy).虽然两者都是从内存写入各自的位置.
3:替换方式不同.虽然容量满的时候,都会发生替换,但是算法有点不同.TLB:p178(ARM体系结构与编程)根据一定的淘汰算法进行替换(既然有算法,那么应该是软件决定). cache:算法比较简单,随机替换法和轮转替换法.这两种效率都比较低下,我想主要原因是cache用的是纯硬件实现.但是还是有改进的空间,最好是根据时间戳或者使用频率决定(不能单纯地利用使用次数),要是硬件能实现,那么内存的利用率将会有大大的提高(因为是有目的的筛选). 这一点可能是TLB和cache不能融合的一个关键.
4:存储速度不同.因为用的两种不同机制,所以速度肯定会有不同.到底谁更快,没有确定结论.根据我的推测应该是TLB,首先TLB的使用更频繁,其次TLB的算法更具有优势. (要是能多出不少类似TLB的积存器,那么cache就可以被淘汰了,呵呵!)
5:数据过度方式不同. TLB:并不一定要与他打交道,可以先读取主存,然后在更新TLB,先斩后奏! cache:是主存和CPU通信的必经之路.
6:想到了再说吧!

引用自:http://brucechan1973.blog.163.com/blog/static/21280552008699365613/

cache是高速缓存,用于CPU和内存之间的缓冲;
buffer是I/O缓存,用于内存和硬盘的缓冲。

cache最初用于cpu cache, 主要原因是cpu 与memory, 由于cpu快,memory跟不上,且有些值使用次数多,所以放入cache中,主要目的是,重复使用, 并且一级\二级物理cache速度快,

buffer 主要用于disk 与 memory, 主要是保护硬盘或减少网络传输的次数(内存数据表现dataSet).当然也可以提高速度(不会立即写入硬盘或直接从硬盘中读出的数据马上显示),重复使用,最初最主要的目的是保护disk。

 
1,Buffer是缓冲区

2,Cache 是高速缓存,分library cache; data dictionary cache; database buffer cache

Buffer cache 缓冲区高速缓存,用于缓存从硬盘上读取的数据,减少磁盘I/O.

3,buffer有共享SQL区和PL/SQL区 , 数据库缓冲区高速缓存有独立的subcache
4,pool   是共享池  用于存储最近执行的语句等

5,cache:
A cache is a smaller, higher-speed component that is used to speed up the

access to commonly used  data stored in a lower-speed, higher-capacity

component.             

database buffer cache:
The database buffer cache is the portion of the SGA that holds copies of data

blocks
read from data files. All user processes concurrently (同时地,兼任地)connected

to the instance share access to the database buffer cache.

buffer cache就是以block为单位读入写出的。


缓存(cached)是把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不

要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读

取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。

缓冲(buffers)是根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和

硬盘的反复寻道,从而提高系统性能。linux有一个守护进程定期清空缓冲内容(即写如

磁盘),也可以通过sync命令手动清空缓冲。举个例子吧:我这里有一个ext2的U盘,我

往里面cp一个3M的MP3,但U盘的灯没有跳动,过了一会儿(或者手动输入sync)U盘的灯

就跳动起来了。卸载设备时会清空缓冲,所以有些时候卸载一个设备时要等上几秒钟。

修改/etc/sysctl.conf中的vm.swappiness右边的数字可以在下次开机时调节swap使用策

略。该数字范围是0~100,数字越大越倾向于使用swap。默认为60,可以改一下试试。
--
两者都是RAM中的数据。简单来说,buffer是即将要被写入磁盘的,而cache是被从磁盘中

读出来的。
buffer是由各种进程分配的,被用在如输入队列等方面,一个简单的例子如某个进程要求

有多个字段读入,在所有字段被读入完整之前,进程把先前读入的字段放在buffer中保存


cache经常被用在磁盘的I/O请求上,如果有多个进程都要访问某个文件,于是该文件便被

做成cache以方便下次被访问,这样可提供系统性能。

A buffer is something that has yet to be "written" to disk. A cache is

something that has been "read" from the disk and stored for later use.

  更详细的解释参考:Difference Between Buffer and Cache

  对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,

是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共

享内存对上面等式的影响。如果你有兴趣,请参考:What is Shared Memory?

  cache 和 buffer的区别:

  Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于

CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期, Cache中保存

着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调

用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)

和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现

在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。

  Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据

的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据

时,速度快的设备的操作进程不发生间断。

  Free中的buffer和cache:(它们都是占用内存):

  buffer : 作为buffer cache的内存,是块设备的读写缓冲区

  cache: 作为page cache的内存, 文件系统的cache

  如果 cache 的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被

cache住,那么磁盘的读IO必会非常小。

引用自:http://blog.csdn.net/wenbingcai/article/details/3941834

阅读(2038) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~