介绍TLB之前,我们先来回顾一个操作系统里的基本概念,虚拟内存。

虚拟内存

在用户的视角里,每个进程都有自己独立的地址空间,A进程的4GB和B进程4GB是完全独立不相关的,他们看到的都是操作系统虚拟出来的地址空间。但是呢,虚拟地址最终还是要落在实际内存的物理地址上进行操作的。操作系统就会通过页表的机制来实现进程的虚拟地址到物理地址的翻译工作。其中每一页的大小都是固定的。这一段我不想介绍的太过于详细,对这个概念不熟悉的同学回去翻一下操作系统的教材。

页表管理有两个关键点,分别是页面大小和页表级数1.页面大小

在Linux下,我们通过如下命令可以查看到当前操作系统的页大小# getconf PAGE_SIZE

4096

可以看到当前我的Linux机器的页表是4KB的大小。2.页表级数页表级数越少,虚拟地址到物理地址的映射会很快,但是需要管理的页表项会很多,能支持的地址空间也有限。

相反页表级数越多,需要的存储的页表数据就会越少,而且能支持到比较大的地址空间,但是虚拟地址到物理地址的映射就会越慢。

32位系统的虚拟内存实现:二级页表

为了帮助大家回忆这段知识,我举个例子。如果想支持32位的操作系统下的4GB进程虚拟地址空间,假设页表大小为4K,则共有2的20次方页面。如果采用速度最快的1级页表,对应则需要2的20次方个页表项。一个页表项假如4字节,那么一个进程就需要(1048576*4=)4M的内存来存页表项。

如果是采用2级页表,如图1,则创建进程时只需要有一个页目录就可以了,占用(1024*4)=4KB的内存。剩下的二级页表项只有用到的时候才会再去申请。

64位系统的虚拟内存实现:四级页表

现在的操作系统需要支持的可是48位地址空间(理论上可以支持64位,但其实现在只支持到了48位,也足够用了),而且要支持成百上千的进程,如果不采用分级页表的方式,则创建进程时就需要为其维护一个2的36次方个页表项(64位Linux目前只使用了地址中的48位的,在这里面,最后12位都是页内地址,只有前36位才是用来寻找页表的), 2^36 *4Byte=32GB,这个更不能忍了。 也必须和32位系统一样,进一步提高页表的级数。

Linux在v2.6.11以后,最终采用的方案是4级页表,分别是:PGD:page Global directory(47-39), 页全局目录

PUD:Page Upper Directory(38-30),页上级目录

PMD:page middle directory(29-21),页中间目录

PTE:page table entry(20-12),页表项

这样,一个64位的虚拟空间,初始创建的时候只需要维护一个2^9 大小的一个页全局目录就够了,现在的页表数据结构被扩展到了8byte。这个页全局目录仅仅需要(2^9 *8=)4K,剩下的中间页目录、页表项只需要在使用的时候再分配就好了。Linux就是通过这种方式支持起(2^48 =)256T的进程地址空间的。

页表带来的问题

上面终于费劲扒了半天Linux虚拟内存的实现,我终于可以开始说我想说的重点了。

虽然创建一个支持256T的地址空间的进程在初始的时候只需要4K的页全局目录,但是,这也带来了额外的问题,页表是存在内存里的。那就是一次内存IO光是虚拟地址到物理地址的转换就要去内存查4次页表,再算上真正的内存访问,最坏情况下需要5次内存IO才能获取一个内存数据!!

TLB应运而生

和CPU的L1、L2、L3的缓存思想一致,既然进行地址转换需要的内存IO次数多,且耗时。那么干脆就在CPU里把页表尽可能地cache起来不就行了么,所以就有了TLB(Translation Lookaside Buffer),专门用于改进虚拟地址到物理地址转换速度的缓存。其访问速度非常快,和寄存器相当,比L1访问还快。

我本来想实际看一下TLB的信息,但翻遍了Linux的各种命令,也没有找到像sysfs这么方便查看L1、L2、L3大小的方法。仅仅提供下图供大家参考吧! (谁要是找到了查看TLB的命令,别忘了分享给飞哥啊,谢谢!)

有了TLB之后,CPU访问某个虚拟内存地址的过程如下1.CPU产生一个虚拟地址

2.MMU从TLB中获取页表,翻译成物理地址

3.MMU把物理地址发送给L1/L2/L3/内存

4.L1/L2/L3/内存将地址对应数据返回给CPU

由于第2步是类似于寄存器的访问速度,所以如果TLB能命中,则虚拟地址到物理地址的时间开销几乎可以忽略。如果想了解TLB更详细的工作机制,请参考《深入理解计算机系统-第9章虚拟内存》

工具

既然TLB缓存命中很重要,那么有什么工具能够查看你的系统里的命中率呢? 还真有# perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses -p $PID

Performance counter stats for process id '21047':

627,809 dTLB-loads

8,566 dTLB-load-misses # 1.36% of all dTLB cache hits

2,001,294 iTLB-loads

3,826 iTLB-load-misses # 0.19% of all iTLB cache hits

扩展

因为TLB并不是很大,只有4k,而且现在逻辑核又造成会有两个进程来共享。所以可能会有cache miss的情况出现。而且一旦TLB miss造成的后果可比物理地址cache miss后果要严重一些,最多可能需要进行5次内存IO才行。建议你先用上面的perf工具查看一下你的程序的TLB的miss情况,如果确实不命中率很高,那么Linux允许你使用大内存页,很多大牛包括PHP7作者鸟哥也这样建议。这样将会大大减少页表项的数量,所以自然也会降低TLB cache miss率。所要承担的代价就是会造成一定程度的内存浪费。在Linux里,大内存页默认是不开启的。

开发内功修炼之CPU篇专辑:

我的公众号是「开发内功修炼」,在这里我不是单纯介绍技术理论,也不只介绍实践经验。而是把理论与实践结合起来,用实践加深对理论的理解、用理论提高你的技术实践能力。欢迎你来关注我的公众号,也请分享给你的好友~~~

linux如何查看tlb大小,TLB缓存是个神马鬼,如何查看TLB miss?相关推荐

  1. linux系统从哪获取tlb信息,关于linux:TLB缓存是个神马鬼如何查看TLB-miss

    介绍TLB之前,咱们先来回顾一个操作系统里的基本概念,虚拟内存. 虚拟内存 在用户的视角里,每个过程都有本人独立的地址空间,A过程的4GB和B过程4GB是齐全独立不相干的,他们看到的都是操作系统虚构进 ...

  2. tlb存的什么_TLB缓存是个神马鬼,如何查看TLB miss?

    介绍TLB之前,我们先来回顾一个操作系统里的基本概念,虚拟内存. 虚拟内存 在用户的视角里,每个进程都有自己独立的地址空间,A进程的4GB和B进程4GB是完全独立不相关的,他们看到的都是操作系统虚拟出 ...

  3. Linux系统下查看目录大小

    转载:http://blog.csdn.net/iamlaosong/article/details/7085178 我们有个系统每天要下载数据,为了检查下载数据是否正常,需要查看下载数据目录大小,因 ...

  4. Linux如何查看目录大小

    du命令 参考文章:how to check directory size in Linux 用于显示目录或文件的大小. 显示当前目录文件或者文件占用空间:du 显示指定文件或文件夹的大小:du te ...

  5. python 安装PIL模块,并且查看图片大小

    文章目录 1.安装PIL(pip install Pillow) 2.使用python查看图片大小 2.1 爬取图片的响应字节,查看图片大小(个人项目需求) 2.2 使用os模块查看本地文件的大小(包 ...

  6. 神马笔记 版本2.10.0——图片查看器

    神马笔记 版本2.10.0--图片查看器 一.目标 二.下载地址 三.功能介绍 四.开发过程回顾 五.笔记元素一览 六.下一版本开发计划 七.新版本规划 八.历史版本回顾 九.帮助和反馈 十.Fina ...

  7. linux看目录用的哪个磁盘,linux查看目录大小及硬盘大小

    linux查看目录大小及硬盘大小的命令: # du -ks   ---in all # du -k     ---every last du和df命令都被用于获得文件系统大小的信息:df用于报告文件系 ...

  8. linux 文件大小_linux系统中查看目录大小的du命令常

    CentOS7.3学习笔记总结(四十六)-linux系统中查看目录大小的du命令常用方法 在windows系统中我们想查看目录或文件的大小,直接右键属性,并且还能显示别的属性,在linux系统中,一般 ...

  9. linux检查内存插槽,Linux查看内存大小和插槽

    相信大家更换自己笔记本电脑的内存时一定是得心应手,即便是一名新手也可以很轻松的动手实现,其实服务器的内存更换也很简单,关机->挪盖->按指定顺序插拔.不过这里有一个很重要的共性前提,需要清 ...

最新文章

  1. WMI技术介绍和应用——查询正在运行的线程信息
  2. Linux查看进程的线程信息
  3. cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
  4. [Windows]ping itsafe环境变量
  5. [原创]C#应用访问Microsoft SQL Server 2005分析服务
  6. 最长上升子序列—leetcode300
  7. SpringAMQP--WorkQueue模型
  8. 字符串-文本对齐方法演练
  9. java 生产者消费者_基于JAVA的生产者消费者问题
  10. servlet中getWriter和getOutputStream的区别
  11. Spark1——介绍
  12. 移动app测试的多样性_做移动APP功能测试,这些因素你得都考虑到~
  13. MSCI 成份股 清单
  14. python全栈之巅_Linux Crontab 定时任务
  15. 微信小程序的民宿客房预订uniapp小程序
  16. 如何设计一个高并发的分布式系统架构
  17. 0基础自学鸿蒙-Day_002 HelloWorld
  18. python跳出双循环break图例
  19. 拼多多 标题 html,【拼多多如何变成新用户】拼多多老用户变新用户教程_拼多多砍价网...
  20. 理解modle下的gradle

热门文章

  1. 芯片SA58672(功放芯片)
  2. 计算机控制技术课程配套教材习题解答(第1、2、3章)
  3. 微信公众平台开发最佳实践
  4. 小规模纳税人可以申请美元账户收款么?
  5. 中国大学慕课公开课-《视听语言》-学习笔记-4
  6. html怎么放边框,html怎么设置边框
  7. 怎么更改锁定计算机背景图片,电脑锁屏背景图片如何更改
  8. CC2530(SPI)驱动FLASH芯片W25Qxx
  9. 自建网站开通SSL协议
  10. 浙江大学远程教育计算机应用基础第4次,浙江大学远程教育计算机应用基础2013年秋-4.Excel知识题...