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与内存寻址,内存读取,虚拟内存的相关原理的更多相关文章
- Linux内核源码分析 day01——内存寻址
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...
- 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 百篇博客分析OpenHarmony源码 | v14.14
百篇博客系列篇.本篇为: v14.xx 鸿蒙内核源码分析(内存汇编篇) | 谁是虚拟内存实现的基础 | 51.c.h .o 内存管理相关篇为: v11.xx 鸿蒙内核源码分析(内存分配篇) | 内存有 ...
- x64 结构体系下的内存寻址
欢迎转载,转载请注明出处:http://www.cnblogs.com/lanrenxinxin/p/4735027.html 在阅读NewBluePill源码的时候,看内存的那一块简直头疼,全是x6 ...
- Linux x86_64与i386区别之 —— 内存寻址
毫无疑问,不管是32位,还是64位处理器,所有进程(执行的程序)都必须占用一定数量的内存,它或是用来存放从磁盘载入的程序代码,或是 存放取自用户输入的数据等等.不过进程对这些内存的管理方式因内存用途不 ...
- X64下MmIsAddressValid的逆向及内存寻址解析
标 题: [原创]X64下MmIsAddressValid的逆向及内存寻址解析 作 者: 普通朋友 时 间: 2015-10-21,20:03:52 链 接: http://bbs.pediy.com ...
- Linux内存寻址
我会尽力以最简洁清晰的思路来写这篇文章. 所谓内存寻址也就是从写在指令里的地址,转化为实际物理地址的过程.因为操作系统要兼顾许多东西,所以也就变得复杂. 逻辑地址 → 线性地址 → 物理地址 逻辑地址 ...
- Linux内存寻址之分页机制
在上一篇文章Linux内存寻址之分段机制中,我们了解逻辑地址通过分段机制转换为线性地址的过程.下面,我们就来看看更加重要和复杂的分页机制. 分页机制在段机制之后进行,以完成线性—物理地址的转换过程.段 ...
- Linux内存寻址之分段机制
前言 最近在学习Linux内核,读到<深入理解Linux内核>的内存寻址一章.原本以为自己对分段分页机制已经理解了,结果发现其实是一知半解.于是,查找了很多资料,最终理顺了内存寻址的知识. ...
- 如何打开Windows Server 2003 内存寻址扩展
本文介绍了如何在系统内存大于4G的情况下,让windows2003 Advanced Server支持大内存的方法: 由于Windows2003 32bit是32位操作系统,当服务器配备内存高达4G时 ...
随机推荐
- 三网合一 中国移动铁通光猫 HG6821M 如何设置宽带自动连接
假期炎热,都说大连是海滨城市比较凉爽,但是那地方潮气太大,实在是不太好呆,于是乎我打道回府来到了内陆家中. 回到家中发现老式的光猫被替换成了 最新的 HG6821M . 按照铭牌上的说明,登录. ...
- POJ2374 Fence Obstacle Course
题意 Language:Default Fence Obstacle Course Time Limit: 3000MS Memory Limit: 65536K Total Submissions: ...
- linux mongodb replica set集群安装
RS集群中mongod的安装和单机一样,只是配置文件略有不同, 单机安装路径linux 下mongodb 3.2.5安装 下面是rs集群的配置文件: systemLog:destination: fi ...
- hasura graphql 模式拼接概念
具体的使用可以参考下面一张图 有一个术语 graphql-bindings 参考项目: https://github.com/hasura/generate-graphql-bindings http ...
- bzoj1013球形空间
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1013 根据距离式子,两个点的话,两边平方再消掉x^2之后有: a1^2 - 2*a1*x1 ...
- Spring 部署Tomcat 404 错误解决方案
将Spring项目部署到tomcat后,访问网页出现404错误 HTTP Status 404 – Not Found The origin server did not find a current ...
- Python——内置函数(待完善)
内置函数(68个),分为六大类 思维导图: 1. 迭代器/生成器相关(3个) (1)range for i in range(10): #0-9 print(i) for i in range(1,1 ...
- MyEclipse下Tomcat无法部署项目 finish按钮无法点击
问题描述:MyEclipse环境下,使用Tomcat进行项目部署时,无法部署项目,finish按钮无法点击. 问题原因:Context-root丢失 解决办法:右击项目->properties- ...
- java web jsp
一.WEB应用的目录结构 通常我们是在IDE中创建web应用程序,IDE自动为我们实现了WEB的目录结构,下面来看如何徒手创建一个WEB程序. 首先来看一下Tomcat自带的一个web应用的目录结构 ...
- Java通过匿名类来实现回调函数
在C语言中,函数名可以当做函数指针传递给形参从而实现回调 void f1() { printf("f1()\n"); } void f2() { printf("f2() ...