内存管理的介绍

1 虚拟内存

为何需要虚拟内存?

因为假设是单片机,由于没有操作系统,需要把代码用工具3烧录进去,单片机的CPU直接操作内存的物理地址,所以内存不能同时运行两个进程,第一个程序在2000的位置写入一个新的值,将会从擦掉第二个程序存放在相同位置上的所有内容。操作系统为了解决这个问题,引入了虚拟内存地址。。就是操作系统提供一种机制,将不同进程的虚拟地址和不同内存的物理地址映射起来,每个进程都分配一套独立的虚拟地址,当程序访问虚拟地址时,由操作系统转换成不同的物理地址,然后写入的就是不同的物理地址,这样子避免冲突。

虚拟内存地址:程序所使用的内存地址。

物理内存地址:实际硬件里面的空间地址。

进程持有的虚拟地址会通过CPU芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存——


 操作系统如何管理虚拟地址与物理地址的关系?

主要通过内存分段和内存分页来管理。

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


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

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

段选择因子就保存在段寄存器里面。段选择因子里面最重要的是段号,用来作段表的苏索引。段表里面保存这个段的基地址、段界限、特权等级。

虚拟地址就是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成4个段。每个段z在段表中有一个项。


2 内存分段

分段的弊端:内存碎片 , 内存交换效率低 

为何分段会有内存碎片?

假设有 1G 的物理内存,⽤户执⾏了多个程序,其中: 游戏占⽤了 512MB 内存
浏览器占⽤了 128MB 内存 ⾳乐占⽤了 256 MB 内存。 这个时候,如果我们关闭了浏览器,则空闲内存还有 1024 - 512 - 256 = 256MB 如果这个 256MB 不是连续的,被分成了两段 128 MB 内存,这就会导致没有空间再打开⼀个 200MB 的程序。
这里的外部内存碎片是产生了多个不连续的小物理内存,导致新程序无法被装载。
内部内存碎片,程序所有的内存都被装载到了物理内存,但是这个程序有部分的内存可能并不是正常使用,造成内存浪费。

解决外部内存碎片的问题方式:内存交换

可以把⾳乐程序占⽤的那 256MB 内存写到硬盘上,然后再从硬盘上读回来到内存⾥。不过再读回的时 候,我们不能装载回原来的位置,⽽是紧紧跟着那已经被占⽤了的 512MB 内存后⾯。这样就能空缺出连 续的 256MB 空间,于是新的 200MB 程序就可以装载进来。 这个内存交换空间,在 Linux 系统⾥,也就是我们常看到的 Swap 空间,这块空间是从硬盘划分出来的, ⽤于内存与硬盘的空间交换。

为何分段会导致内存交换效率低?

因为使用分段方式很容易产生内存碎片,然后经常需要重新Swap内存区域,容易有性能瓶颈,要是内存交换的是一个很大的空间,就会让机器显得卡顿。


3内存分页

为了解决内存交换效率低的问题,出现了内存分页。

分段好处是产生连续的内存空间。

分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,叫做页,在Linux下,每一页大小为4KB

页表是存储在内存里的,内存管理单元(MMU)就将虚拟内存地址转换成物理地址的工作。而当进程访问的虚拟地址在页表中查不到时,系统会产生一个缺页异常,进入系统内核空间分配物理内存、更新进程页表,最后再返回用户空间,恢复进程运行。


分页如何解决分段的内存碎片和内存交换效率低的问题的?

因为采用分页把内存空间预先划分好,然后内存的释放都是以页为单位的,不会产生无法给进程使用的小内存。当内存空间不够时,操作系统会把运行的进程中的其他最近没有使用的内存页面给释放:就是暂时写在硬盘上,叫做换出,一旦需要了,就加载进来,叫做换入(Swap in),这样子一次性写入磁盘的也是几个页,不用太多时间,内存交换效率比较高。


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

此机制下,虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物理每页所在物理内存的基地址。

内存地址转换步骤:

1 把虚拟内存地址切分为页号和偏移量

2 根据页号查页表得到对应的物理页号

3拿得到的物理页号与偏移量组合形成物理内存地址。


简单分页有什么缺点?

操作系统同时运行很多进程时,需要的页表会很庞大,

32 位的环境下,虚拟地址空间共有 4GB ,假设⼀个⻚的⼤⼩是 4KB 2^12 ),那么就需要⼤约 100
2^20 ) 个⻚,每个「⻚表项」需要 4 个字节⼤⼩来存储,那么整个 4GB 空间的映射就需要有 4MB
的内存来存储⻚表。
4MB ⼤⼩的⻚表,看起来也不是很⼤。但是要知道每个进程都是有⾃⼰的虚拟地址空间的,也就说都有
⾃⼰的⻚表。 那么, 100 个进程的话,就需要 400MB 的内存来存储⻚表,这是⾮常⼤的内存了,更别说 64 位的环
境了。

多级页表

为解决上面的弊端,使用多级页表,将单级页表再分项,将页表(一级页表)分为1024个页表(二级页表),每个(二级页表)中包含1024个页表项,形成二级分页。如果某个一级页表的页表项没有被用的,也不需要创建这个页表项对应的二级页表,即可以在需要时才创建二级页表。一级页表覆盖到全部虚拟空间,二级页表在需要时创建。


TLB:页表缓存、转载旁路缓存、快表等。

把最常访问的几个页表项存储到访问速度更快的硬件中,所以在CPU芯片中加入一个专门存放经常访问的页表项的Cache,就叫TLB


4 段页式内存管理

内存分段和内存分页不是对立的,可以组合起来在同一个系统中使用,组合起来后,通常称为段页式内存管理。

实现方式:先使用分段机制,把程序划分为许多有意义的段,然后把每个段分为多个页,这样子地址由段号、段内页号和页内位移三部分组成。用于段页式地址变换的数据结构是每一个程序一张段表,每个段又建立一张页表,段表中的地址是页表的起始地址,而页表中的地址则为某页的物理页号。

段页式地址变换中要得到物理地址必须经过三次内存访问:第一次访问段表,得到页表起始地址;第二次访问页表,得到物理页号;第三次将物理页号与页内位移组合,得到物理地址;


5Linux内存管理

6总结

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值