论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
物联网
›
物联网
›
利用系统:内存管理计谋
利用系统:内存管理计谋
祗疼妳一个
金牌会员
|
2024-8-22 08:16:10
|
显示全部楼层
|
阅读模式
楼主
主题
985
|
帖子
985
|
积分
2957
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
外部碎片
当应用程序启动时,由利用系统负责给该应用程序分配其内存空间,假设此时启动了三个应用程序,利用系统分别给其分配了100m,10m和50m的内存,内存环境如下图
此时如果程序B下线,程序A和程序C之间便会空出10m内存,此时如果没有10m以下的应用启动来添补这部分内存,那么这部分内存资源便会被浪费。
这便是内存的外部碎片问题,为了解决内存的外部碎片问题,利用系统利用页式内存管理方式,尽可能减少外部碎片的巨细(无法完全清除),通过将内存分为巨细同等的内存页,将一个应用程序拆开,存储在不同页中,当下电脑64位和32位就是根据分页巨细不同界说的(分别时8k和4k)。
页式存储
利用系统将内存分配8k或4k巨细的内存页,我们这里称其位物理内存页,当一个应用程序启动时,利用系统将不会在刻意的给其分配连续的内存空间,而是随机分配给应用程序不一定是连续的内存页。
通过这样利用,外部碎片的问题是解决了,不过散落在内存各处的应用程序碎片,cpu实行时该怎样探求呢?利用系统提供了页表布局。
起首,应用程序内部利用一种虚拟地点。虚拟地点是连续的,其中高位表现当前物理内存页的页号,而低位则表现当前物理内存也中,当前地点距离当前物理内存页的物理页框号(物理内存页的第一行的真实物理地点)的偏移量。而页表内部则是记录页号和物理页框号的位置。
当cpu实行当前应用程序的机器码时,起首它会根据连续的虚拟地点去页表中查找真实的物理内存页,再通过低位去找到物理内存页的对应偏移量的真实物理地点。
通过这种方式,将应用程序所需内存拆分为8k巨细,分配给内存中8k巨细的页,然后通过页表记录虚拟地点和真实物理地点之见的映射关系,可以很好的解决外部碎片问题,外部碎片最大不会超过8k。不过内存可以分为大量8k巨细的物理内存页,通过页表记录这些大量的内存页,也必要大量的内存控制,这些内存空间也注定会超过8k,以是纵然是页表,也必要进行分页,这就是多级页表。
多级页表将页表拆分为多个8k巨细,分配8k物理内存页,在由另一个页表记录当前页表的虚拟地点和真实物理地点的关系,通过一个利用系统,必要三四级页表,才能记录全部页表信息。
动态内存分配及页表生成
利用系统会分配给一个应用程序固定的内存巨细,纵然是页式内存管理下也不例外。但一个应用程序通常不会完全利用利用系统分配的内存,当利用系统为应用程序没有利用的内存分配物理内存页时,便会造成内存浪费。
为了解决这个问题,利用系统接纳不给应用程序未利用的空间分配物理内存页,甚至页表的初始状态只有第一级的页表,页表内部也只有虚拟地点没有与其映射的页框地点,以及程序的第一行物理地点等,其余大部分页表信息都是在访问程序时才对页表进行添补。
当cpu必要实行应用程序的机器码时,必要通过页表查询真实物理地点,第一次访问时页表并没有记录相关信息,此时会触发页面错误。利用系统在捕获到这个错误后,会跳转到应用程序的内核态,获取对应的页框添补页表信息,也就是说只有当页面虚拟地点被访问时,其页表中的虚拟地点映射的页框才会被添补。
其中空闲区域的虚拟地点也会在页表中表现,不过多级页表中,记录虚拟地点的页表也是动态生成的,以是连续的空闲区域的虚拟地点实际上并不会访问,也就不会生成对应页表,对应页表的内存资源也会被节省。
TLB缓存
一个应用程序所占利用的物理地点极多,每次实行对应地点的机器码,都必要区页表中查找,页表生存在内存中,固然内存的访问速度较快,不过在实行程序过程中,必要大量的访问页表,内存的访问速度也无法保证程序的快速运行,以是我们必要一个IO速度更快的存储单位。
TLB缓存是CPU上的硬件单元,TLB缓存的IO速度极快,是内存的几十倍到一百倍,访问速度接进于寄存器,不过其存储空间仍然有限,不敷以存下整个页表,以是他只能存储部分页表,当CPU访问页表时,会起首访问TLB缓存,如果存在虚拟地点和页框的对应关系,则直接利用,如果没有则取访问页表,并将本次访问的虚拟地点和页框关系记录在TLB中,更换掉旧的记录。
以是我们在一样平常写代码应该只管连续访问连续内存数据,这样可以只管使两个机器码在同一物理内存页中,提高TLB的命中率,进而提高程序性能。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复
使用道具
举报
0 个回复
正序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
发新帖
回复
祗疼妳一个
金牌会员
这个人很懒什么都没写!
楼主热帖
容斥原理
信息收集之 端口扫描
教你30分钟快速搭建直播间
ASP.NET Core依赖注入系统学习教程:Se ...
【C++】拷贝构造函数的调用时机 ...
高考是人生旅途的一处驿站
Java EnumMap get()方法具有什么功能呢 ...
JetBrains RubyMine 2022 for Mac(Ruby ...
多态详解
java运算符(超详细!!!) ...
标签云
AI
运维
CIO
存储
服务器
浏览过的版块
移动端开发
DevOps与敏捷开发
.Net
Mysql
虚拟化与私有云
MES
Oracle
分布式数据库
网络安全
程序人生
快速回复
返回顶部
返回列表