TLB(Translation Lookaside Buffer)转换检测缓冲区是一个内存管理单元,用于改进虚拟地址到物理地址转换速度的缓存。
TLB是一个小的,虚拟寻址的缓存,其中每一行都保存着一个由单个PTE(Page Table Entry,页表项)组成的块。如果没有TLB,则每次取数据都需要两次访问内存,即查页表获得物理地址和取数据。

关于TLB与cache-CPU缓存的关系,TLB介于CPU与cache之间,是内存的管理单元,用于程序从逻辑地址访问实际内存地址的页表缓存。

当程序或cpu要读取数据,CPU会根据程序提供的逻辑地址的前20位映射码到TLB中查询,TLB中保存所有已运行程序的前20位逻辑地址的映射码,查到(命中)根据前20位映射码直接访问实际内存地址。查不到(不命中)CPU会到CPU缓存(cache)中查询,没有CPU会重新加载(实际内存)所有逻辑地址的映射码(一些程序停止响应后过一会又响应),后直接读取硬盘上数据,同时将逻辑地址映射信息保存回TLB(刷新TLB)。TLB归系统(OS)在内存中创建、管理,也算是一种缓存,软缓存。CPU cache是加快CPU与内存之间数据交换的缓存,归CPU管理,是一种硬件缓存。

当CPU访问程序时,内存读取速度很快,将CPU需要的数据块(实际内存地址)读取保存在内存中,内存空间有限,符合软件编写规则的程序都只能保存很小的数据块在内存中,并且内存中这些数据块只有被CPU全部处理完,内存才会加载下一个数据块。CPU要一点一点的处理这些内存中的数据块,当CPU处理完这个数据块需等待内存加载下一个数据块。(也可以说内存停止慢慢等CPU处理完。)这就造成了数据处理的停顿(虽然这点时间可能就是几毫秒),为了保持数据处理的连贯性、持续性,CPU
cache应运而生。内存中要处理或优先处理的数据块先被CPU cache加载,不再影响内存的运作,CPU优先从CPU
cache中加载处理数据。CPU
cache起了缓冲、缓存作用。(这只是CPU运行的大方向的理论,实际IU与AU对缓存还有不同的处理,并且像IU酷睿与新的I系列CPU在缓存、内置内存控制器等多有改进,但无论怎样这大方向的理论没变!同频率不同价的CPU多是砍CPU
cache大小或指令来区分,资金不是太紧张的同学还是选同频大缓存的CPU为好。同类型相比I3与I3,别拿I3与I5比。。。。)

如上,CPU、CPU
cache或内存都会分优先级来加载处理数据,一些暂时不用的数据,内存会自动卸载数据到虚拟内存中,同时映射地址供以后直接调用。没有启用虚拟内存,内存会直接卸载暂时不用的数据,用时再从硬盘上读取。大家注意到,直接以后从硬盘上读取还是卸载数据到虚拟内存中,好像都一样,都要从硬盘上读取。实际使用时是不一样的,调用虚拟内存,实际内存只要通过映射码直接读取。调用硬盘上数据有一个加载、选择需要数据块的时间(虽然这点时间可能还是几毫秒)。到此其实虚拟内存更像实际内存的缓存(但不是必须的),虚拟内存的作用更像TLB。所以偶一直建议大家启用虚拟内存。对于一些大容量内存的同学,也要尽量启用虚拟内存。不是关闭虚拟内存,系统就会运行更快。这是一个网路上流传甚广的歧义解读。

关闭虚拟内存让程序在实际内存中运行,需要几个前提条件,需要x64系统,只有x64系统才能更有效的管理、分配更多的内存地址。像一些x86系统开启或支持4G以上内存都是障眼法的过眼瘾,x86系统本身的内核出于稳定性的要求已经屏蔽了内存地址的扩展。(无论微软还是Linux都一样,不要听一些神人的通灵神释,如果Linux等x86内核本身支持Linux还出什么x64系统。)x86伺服器系统也是如此,只能看到更多的内存存在,(针对x86伺服器系统以前有几个专门优化的程序可以使用3g内存,现在基本已经绝种了)如我们都知道银行有许多毛爷爷,但你能把银行的钱拿来就用吗!第二个先决条件就是软件本身要支持、启用内存地址扩展,也就是x64位程序并编译到了可以启用更多的内存地址扩展,有些程序(偶就不说软件名了)只是包了x64皮的x86程序。。。。。

x86程序以Windows系统下为例为了最大兼容性先天就限制了内存地址的调用(“符合软件编写规则的程序都只能保存很小的数据块在内存中”),如xxx不能读、xxx不能写的报错就是内存地址不能供软件调用,x64程序内存地址还是有限制但通过内存地址扩展可使用更多内存,如PS
x64版软件可以使用128G以上内存容量。

内存无论有多大,都会在开机时被系统初始化,分配好数据空间(实际内存地址)。内存像一栋楼,楼中有许多房间,x86程序无论怎样只能住小房间,x64程序可以住大房间,像PS等x64程序可以包下整个单元。无论x86还是x64程序房间住满了可以将一些暂时不用的放到下房(或叫小仓房)虚拟内存中,如没有多出的只能先丢掉了

TLB与内存寻址,内存读取,虚拟内存的相关原理的更多相关文章

  1. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  2. 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 百篇博客分析OpenHarmony源码 | v14.14

    百篇博客系列篇.本篇为: v14.xx 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有 ...

  3. x64 结构体系下的内存寻址

    欢迎转载,转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/4735027.html 在阅读NewBluePill源码的时候,看内存的那一块简直头疼,全是x6 ...

  4. Linux x86_64与i386区别之 —— 内存寻址

    毫无疑问,不管是32位,还是64位处理器,所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是 存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不 ...

  5. X64下MmIsAddressValid的逆向及内存寻址解析

    标 题: [原创]X64下MmIsAddressValid的逆向及内存寻址解析 作 者: 普通朋友 时 间: 2015-10-21,20:03:52 链 接: http://bbs.pediy.com ...

  6. Linux内存寻址

    我会尽力以最简洁清晰的思路来写这篇文章. 所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程.因为操作系统要兼顾许多东西,所以也就变得复杂. 逻辑地址 → 线性地址 → 物理地址 逻辑地址 ...

  7. Linux内存寻址之分页机制

    在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...

  8. Linux内存寻址之分段机制

    前言 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...

  9. 如何打开Windows Server 2003 内存寻址扩展

    本文介绍了如何在系统内存大于4G的情况下,让windows2003 Advanced Server支持大内存的方法: 由于Windows2003 32bit是32位操作系统,当服务器配备内存高达4G时 ...

随机推荐

  1. GPU Memory Usage占满而GPU-Util却为0的调试

    最近使用github上的一个开源项目训练基于CNN的翻译模型,使用THEANO_FLAGS='floatX=float32,device=gpu2,lib.cnmem=1' python run_nn ...

  2. JS 实战2(邮箱选人功能)

    点击选人打开新的窗口,新窗口中选取之后点击确定将所选内容传给原窗口,并关闭当前窗口 <%@ Page Language="C#" AutoEventWireup=" ...

  3. MemSQL start[c]up Round 1 B题

    题目链接 http://codeforces.com/contest/325/problem/B 第一遍写了暴搜,果断TLE 然后上了二分,结果120组数据只有第40组过不了,我就写了奇怪的东西... ...

  4. 第2本MATLAB书

    前面看的<DSP using MATLAB>后面还有两章,其内容太难了,看不下去,暂时放放: 因为工作中需要MATLAB和电磁场的相关知识,从网上找了本 初步翻了翻,里面有代码有图片,英文 ...

  5. 【传输协议】HttpClient基本使用

    最近工作中是做了一个handoop的hdfs系统的文件浏览器的功能,是利用webhdfs提供的rest api来访问hdfs来与hdfs进行交互的,其中大量使用HttpClient,之前一直很忙,没什 ...

  6. 抽取JDBCTemplate

    抽取JDBCTemplate 为了解决DAO实现类中代码的重复问题,另外使得代码更通用,所以抽取一个公共的模板,使其更具有通用性. DAO实现类的代码 public class StudentDAOI ...

  7. minio 集群搭建

      具体实际的取舍可以参考官方文档,我使用的是4 node 4 driver 模式 环境机器说明 192.168.31.2 192.168.31.3 192.168.31.4 192.168.31.5 ...

  8. C#模板引擎 DotLiquid

    DotLiquid 是一个简单.快速和安全的模板引擎,移植自 Ruby 的 Liquid 标签. 示例模板: <p>{{ user.name }} has to do:</p> ...

  9. 在IE7+ 中弹出窗口并关闭本身窗口的脚本(备忘)

    window.onload =function(){ window.open("http://www.126.com"); window.opener=null; window.o ...

  10. hackerrank Week of Code 31

    https://www.hackerrank.com/contests/w31/challenges Beautiful Word 模拟 Accurate Sorting 检查每个数字距离原位是否都不 ...