Colderleo's blog Colderleo's blog
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)

Colder Leo

热爱代码的打工人
首页
Linux
C++
Python
前端
工具软件
mysql
索引
关于
GitHub (opens new window)
  • 常见程序性能开销cost、latency延迟耗时的经验值
  • 面试常见问题
  • 静态链接-动态链接-elf详解-elfloader
  • 动态库和静态库的依赖问题
  • glibc和ld的编译调试-为某程序单独设置ld
  • dl_iterate_phdr遍历linkmap头、获取so加载地址
  • shell、bash语法和脚本模板
  • so文件查找路径
  • 逻辑地址-线性地址or虚拟地址-物理地址
  • 通过ELF读取当前进程的符号表并获取符号的版本信息
  • 虚拟内存,cache,TLB,页表
  • 用户内存空间分布和mmap
  • numa网卡绑定
  • 隔核绑核、服务器优化
  • popen底层原理和仿照实现-execl
  • tmux用法
  • ASLR机制
  • 程序后台运行、恢复前台nohup
  • 大页内存huge_page
  • 用perf查看page-fault
  • Bash设置显示全部路径
  • 查看socket fd状态,设置nonblock
  • cout输出到屏幕的过程
  • 多进程写同一文件-write原子性-log日志
  • vim用法
  • epoll用法
  • signal信号、软中断、硬中断、alarm
  • 内核模块
  • 读写锁之pthread_rwlock和内核rwlock自旋读写锁
  • systemtap
  • xargs、awk用法
  • openssl libssl.so.10.so缺失问题
  • netstat用法
  • fork函数
  • tcp延迟确认ack
  • 90.centos7上一次std-string编译错误定位
  • docker用法
  • find用法
  • dmesg
  • gcc编译用法
  • avx-sse切换惩罚
  • Centos7防火墙
  • chmod用法
  • kernel-devel安装版本
  • Linux-Centos7系统安装、网络设置、常见报错
  • linux下g++编译c++文件
  • MegaCli 安装及使用
  • mysql
  • mysql忘记密码修改方法
  • set用法
  • crontab
  • ssh传文件scp
  • ssh连接
  • tcpdump、tshark、tcpreplay用法
  • ubantu root登录以及创建新用户
  • ubuntu安装g++和gdb
  • uClibc编译失败解决方法
  • win10安装WSL open-ssh
  • yum升级git
  • 比较so文件版本-md5sum
  • 查看磁盘信息
  • 合并两个硬盘,挂载到一个文件夹下
  • 软件安装目录usr-local-src
  • 下载centos历史版本
  • sh脚本转可执行文件、加密
  • Linux
gaoliu
2021-10-06

虚拟内存,cache,TLB,页表

# 页表,TLB

参考: https://baike.baidu.com/item/%E9%A1%B5%E8%A1%A8/679625?fr=aladdin

cpu访问内存的时候,需要知道其物理地址(注意是内存的物理地址,跟硬盘没关系)。

MMU(Memory Management Unit,内存管理单元)通过查页表,将==逻辑地址(虚拟地址)== 转换为 ==物理地址==将虚拟地址转换为物理地址。

转换过程中会先查TLB(translation lookaside buffer,一个小容量高速页表),没有的话再去查页表。

# cache、内存、虚拟内存

参考: https://blog.csdn.net/Com_ma/article/details/78145333

cache就是高速内存,可以有多级cache。

虚拟内存是为了防止内存不够用,从硬盘上分割出一些空间给内存扩展使用,可以看做低速内存。注意==虚拟内存跟虚拟地址是两回事==

访问内存时,需要有一个物理地址,根据这个物理地址,先去cache中找,没有再去内存中找。

cache和主存(就是内存)之间有地址的映射关系,但是它们的地址都是物理地址,而不是逻辑地址。因此访问时要先从虚拟地址转换为物理地址。

# TLB,内存的关系

cpu访问数据时,==先将逻辑地址转换为物理地址,再根据物理地址访问cache或者内存。==

CPU首先得到的是虚拟地址,要经过地址翻译成物理地址才能进行数据访问,这个过程要检查TLB(翻译后备缓冲器),如果命中,会得到其物理地址;如果没命中,那么通过查页表得到物理地址;如果查页表没查到,就会通过请页机制(缺页异常)从硬盘中加载页到内存。

得到物理地址之后,先去cache中访问,如果有就取到,本次访问结束。如果没有就取内存中取,并更新cache。

也可以参考这个文章,里面有图解: https://cloud.tencent.com/developer/article/1459252

# 某篇论文

https://segmentfault.com/a/1190000018551515?utm_medium=referral&utm_source=tuicool 讲了Intel中cpu访问数据,TLB miss,cache等详细的测试和分析。(CPU & Memory, Part 2: CPU caches)

虚拟地址不是唯一的:

一个虚拟地址在不同时间可以指向不同的物理地址。 不同进程的相同的地址也可能指向不同的物理地址。

虚拟地址必须在Memory Management Unit(MMU)的帮助下才能翻译成物理地址。不过这个步骤是很耗时的(注:前面提到的TLB cache缓存的是虚拟->物理地址的翻译结果)。

# 面试题1

  • 以你的经验或者估计,在Intel或者你了解的CPU上,一次TLB Miss大概需要消耗多少个CPU Cycle?

看上面的论文可能是二三百个吧。

# 面试题2

  • 对于CPU来说,一次TLB miss和一次Last Level Cache Miss 哪个的开销一般会更大一些?

TLB miss开销更大。参考: 链接:https://www.jianshu.com/p/dc4b5562aad2

那么TLB和Cache有什么关系呢?可以说TLB命中是Cache命中的基本条件。TLB不命中,会更新TLB项,这个代价非常大,Cache命中的好处基本都没有了。

编辑 (opens new window)
上次更新: 2021/10/11, 12:43:58
通过ELF读取当前进程的符号表并获取符号的版本信息
用户内存空间分布和mmap

← 通过ELF读取当前进程的符号表并获取符号的版本信息 用户内存空间分布和mmap→

最近更新
01
通过模板实现结构体成员拷贝-按成员名匹配
05-07
02
c++17通过模板获取类成员的个数
05-01
03
avx-sse切换惩罚
04-30
更多文章>
Theme by Vdoing | Copyright © 2019-2023 Colder Leo | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×