内存分页
分段的好处是能产生连续的内存空间,但是会出现大量内存碎片与内存交换效率低的问题
先思考一下怎么解决这两个问题,内存碎片是由多个不连续的小物理内存空间造成,如果把这些不连续的小物理内存空间组合起来,是不是解决了这个问题?同样的,内存交换的时候我们保证交换的数据小,是不是能提高内存交换的效率?
这个办法就是内存分页,分页是把整个虚拟与物理空间切成一段段固定尺寸的大小,这样一个连续并且尺寸固定的空间,我们叫页,在 linux 下,每一页的大小为4kb。(虚拟空间是指存储一套虚拟地址的空间)
虚拟地址与物理地址是通过页表来映射,虚拟空间内的虚拟地址一定是连续的,物理地址不一定,但可以通过连续的虚拟地址把多个不连续的物理内存组合使用。
而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程的运行。
分页方式是如何解决内存碎片与内存交换效率慢的问题呢?内存碎片的解决:
因为使用内存的单位变成固定大小的页,所以每个程序的虚拟空间维护的也是连续的页(虚拟地址),通过页表再映射到物理内存页,虽然映射的物理内存页不连续,但是虚拟空间是连续的,可以让它们组合起来使用,但这也只能解决外部内存碎片问题,没有解决内部内碎片问题,因为每页都有固定大小,可能某一页只使用了部分,依然会造成一些浪费。
内存交换效率慢的解决:
之前说过,减少交换数据的大小,可以提高内存交换效率,分页方式是这样解决的,如果内存空间不够时,操作系统会把其他正在运行的进程中的「最近没被使用」的内存页释放掉,也就是加载到硬盘,称为换出,一旦需要的时候再加载进来,称为换入。所以一次性写入硬盘的也只有一个页或几个页,内存的交换效率自然就提升了。
分页方式使加载程序的时候,不再需要一次性都把程序加载到物理内存中。完全可以在进行虚拟内存和物理内存的页之间的映射之后,并不真的把页加载到物理内存里,而是只有在程序运行中,需要用到对应虚拟内存页里面的指令和数据时,再加载到物理内存里面去(用大白话说,当你需要用到的时候才会去使用对应的物理内存)。
在内存分页方式下,虚拟地址和物理地址是如何映射的?
在分页机制下,每个进程都会分配一个页表,虚拟地址会分为两部分,页号和页内偏移量,页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,页内偏移量+物理内存基地址就组成了物理内存地址,如下图所示
就是下面这几步
页号找到页表中的页项
获取页项的物理页号基地址
偏移量+物理页号基地址计算出物理内存地址
伺服电机靠什么为动力源进行移动
智算中心网络架构设计及组网实践案例
小米全面屏电视E55A的出色体验
助听器简介和重要的设计注意事项
数字功放芯片NTP8835和TAS5731M的对比测评
如何解决内存碎片与内存交换效率慢的问题
电信网络寻线仪KE801的应用介绍
李楠表态:iPhone 12 mini是未来两年内最好用的智能手机
从各方面提升的iPhone8,这会是你满意的旗舰嘛?
NFC技术引领行业向更小的天线和新应用过渡
DRAM成长率明年恐创新低
二极管的主要参数解读
Facebook欲建立无国界货币是为了什么
控制器连接Profinet转Modbus RTU网关与精密数显温控仪通讯配置案例
两处顶级港口争取建厂,印度看中了特斯拉什么?
由于华为加入美国政府的实体名单,Skyworks股票开始飙升
AirPods3订单砍了30%以上 iPhone13全线降价为iPhone14做准备
工业面阵相机和线阵相机的应用对比和选型
一种智能型全自动快速充电机的设计
苹果对MagSafe双项充电器产品页面进行更新