内存管理及内存对齐模式

1-内存管理(内存的分配与回收)

内存的分配与回收是由OS完成的
简单的内存分配与回收的方法基于:连续存储空间分配与回收(连续空间)

连续存储空间分配与回收会造成“内存碎片”(外部碎片),在存在内存碎片的情况下,会出现这样的问题:某一个软件需要的内存空间,在内存中,没有一个碎片可以满足,但是多个碎片的整合可以满足该软件对内存空间的需求,这意味着,实际上余下的内存是够用的,但是由于内存空间被分为多段使用,余下的碎片,每一个碎片都不可以满足程序内存要求,使得内存分配失败,这叫做内存的“假满”,产生该问题的关键是,“连续分配”

用磁盘存储文件的手段解释内存分配与回收的问题:在磁盘中,“扇区”是存储信息的基本单位,且,每一个能够存储的信息量有两种(512B或1024B)
对于文件的存储,总是一个扇区一个扇区的存储相关文件数据的,就算一个文件中只有3B,那么也需要占用一个扇区,即占用512B或1024B的外存空间,这已经存在了对外存空间的浪费。其实外存空间的浪费比上述说到的还要严重,原因在于OS对磁盘扇区的管理方式

所有扇区都必须被OS管理到,使用的方法仍是 编号 管理,
以41024G(4T,每个扇区大小为1024B):磁盘共42^30个扇区,每个扇区都要一个编号来进行识别,那么每一个扇区的二进制位数为 32位二进制
每个扇区编号取值范围为0~2 ^ 32 这意味着OS对每一个扇区需要4B进行编号,磁盘有42 ^ 30个扇区,那么完成所有的扇区编号,需要消耗 44*2 ^ 30个字节,这些编号放在外存中,会占用16GB的外存空间,且对于内存而言,为了表示一个外存中信息的扇区的编号,又会消耗4B内存空间,这是无谓的浪费。为了降低这种消耗,OS将多个扇区合并成一个 “簇”,对簇进行编号,这样可以减少内存空间,上述硬盘,将4个扇区合并成一个簇,那么一个簇的大小为4096B,即簇变成了外存分配空间的基本单位,即存储1B的文件,也要消耗一个簇的空间

事实上,对于簇的使用,OS肯定是连续分配为先的(分配并使用簇,其实是写文件到外存中,但是如果文件被删除了,那么那些簇会变为 “空闲簇”,以便再次使用,通过反复的存储 删除操作,就会产生大量的 碎片簇
如果要存储一个大文件,会先选择 碎片簇,这就使得这个文件在外存存储角度是非连续的,这是典型的非连续存储方案!这种方案避免了内存管理的中会出现的 假满 现象, 但是必须考虑到 定位(内存定位)/寻址
若能在上述方案的基础上解决寻址的问题,那么就可以用来管理内存的分配与回收,这种方案称为内存的 页式管理

寻址(地址映射):
从逻辑地址到物理地址
只有在连续存储空间分配与回收的前提下,逻辑地址 -> 物理地址(段地址+逻辑地址),但是如果软件分配到的空间不连续,则上述的映射方法失效
为了避免出现内存碎片,且同时解决地址映射问题,OS开发者提出了一种叫做 页式管理 的内存分配回收方法

在这里插入图片描述

假设:物理页面大小为1000B,软件大小为2078B,现在软件中有一个数据的逻辑地址为1867,如何定位这个数据?
经过1867/1000 和1867%1000 得到 1 和 867 1是逻辑页号,867是页内偏移量,再根据 页面表 ,以 1为下标,可以得到1号逻辑页面所分配的物理页面是 0 则在物理页面编号为0的那个页面,偏移867字节,就可以定位成功
这种定位(地址映射)操作,在程序执行中十分频繁,如果每次映射要进行一次除法和取余,又会大大降低地址映射速度,另外,页面表本身也存储在内存中,那么异地地址映射,需要两次内存访问:
第一次,根据逻辑页号在页面表中查到物理页面
第二次,根据物理地址和偏移量,访问内存空间
每次地址映射,要进行两次内存访问,是非常低效的
为了提高地址映射速度,计算机和硬件厂商配合,完成了在硬件级别实现第一次访问,即不用第一次访问内存,就可直接得到物理页号
为了加快上述除法和取余,将页面大小设置成2的整数次方,就可以不用除法和取余 n /1024 <=> n >> 10 n%1024 <=> n & 0000 0011 1111 1111
通过上述手段,页式管理打破了软件空间需要 连续 的基本要求,同时也解决了地址映射问题

2-内存对齐模式

由于物理页面的大小是有限的,而装入其中的软件也是随机的,那么就存在一种可能,软件中的某个数据,假设其占用4B空间,那么这4B可能存储在不同的物理页面中,若存在上面的情况,那么一个数据需要两次内存访问才可以得到,这将降低内存的访问效率
为了避免同一个数据分别存储在不同的页面中,只需要保证:
对于2B的数据,其首字节地址必须是2的倍数
对于4B的数据,其首字节地址必须是4的倍数
要求长度为2,4,8字节的数据的首字节地址必须为2,4,8的倍数,这个要求就是内存对齐模式
在这里插入图片描述
当有特殊需要,也可以在程序最前面加上伪指令,令默认的内存对齐模式更改为自己需要的,此处新的内存对齐模式 变为 1B 连续对齐
在这里插入图片描述

程序结束后,恢复系统默认的内存对齐模式
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值