(学习笔记-内存管理)内存分段、分页、管理与布局

内存分段

程序是由若干个逻辑分段组成的,比如可由代码分段、数据分段、栈段、堆段组成。不同的段是有不同的属性的,所以就用分段的形式把这些分段分离出来

分段机制下,虚拟地址和物理地址是如何映射的?

 分段机制下的虚拟地址由两部分组成,段选择因子段内偏移量

  •  段选择因子:保存在段寄存器里面。段选择因子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。
  •  虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

上图中展示了虚拟地址与物理地址通过段表映射关系,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址,如下图:

 如果要访问段3中偏移量为 500 的虚拟地址,我们可以计算出物理地址为:7000(段3基地址) + 500(偏移量) = 7500。

分段的方法很好,解决了程序本身不需要关心具体的物理内存地址的问题,但是也有一些不足之处:

  • 内存碎片问题
  • 内存交换的效率低

分段产生的内存碎片问题

假设有 1 G的物理内存,用户执行了多个程序,其中:

  • 游戏占用了 512MB 内存
  • 浏览器占用了 128MB 内存
  • 音乐占用了 256 MB 内存

这个时候,如果我们关闭了浏览器,空闲内存还有1024-512-256 = 256MB。

如果这个256MB不是连续的,被分成了两段128MB内存,这就会导致没有空间再打开一个200MB的程序。

内存分段会出现内存碎片吗?

 内存碎片主要分为:内部内存碎片外部内存碎片

内存分段管理可以做到段根据实际需求分配内存,所以有多少需求就分配多大的段,所以就不会出现内部内存碎片

但是由于每个段的长度不固定,所以多个段未必能恰好使用所有的内存空间,会产生多个不连续的小物理内存,导致新的程序无法被装载,所以会出现外部内存碎片的问题。

解决[外部内存碎片]的问题就是内存交换。

可以把音乐程序占用的那256MB内存写到硬盘上,然后再从硬盘上读回内存里。不过再读回时,不能装载到原来的位置,而是紧紧地跟在已经被占用的512MB内存后面。这样就能空缺出连续的256MB内存空间,于是新的200MB程序就可以装载进来。

这个内存交换空间,在Linux系统里,也就是常看到的Swap空间,这块空间是从硬盘划分出来的,用于内存与硬盘的空间交换。

分段导致的内存交换效率低的问题

对于多进程的系统来说,用分段这个方式,外部内存碎片是很容易产生的,产生了外部内存碎片,那不得不重新 Swap 内存区域,这个过程会产生性能瓶颈。

因为硬盘的访问速度比内存慢太多了,每一次内存交换,都需要把一

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值