• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

风子sama

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

操作系统内存管理基础

操作系统内存管理基础

常⻅的⼏种内存管理机制

简单分为连续分配管理方式和非连续分配管理方式这两种。连续分配管理方式是指为一个用户程序分配一个连续的内存空间,常见的如块式管理。同样地,非连续分配管理方式允许一个程序使用的内存分布在离散或者说不相邻的内存中,常见的如页式管理和段式管理。

1.块式管理︰远古时代的计算机操系统的内存管理方式。将内存分为几个固定大小的块,每个块中只包含一个进程。如果程序运行需要内存的话,操作系统就分配给它一块,如果程序运行只需要很小的空间的话,分配的这块内存很大一部分几乎被浪费了。这些在每个块中未被利用的空间,我们称之为碎片。

2.页式管理︰把主存分为大小相等且固定的一页一页的形式,页较小,相对相比于块式管理的划分力度更大,提高了内存利用率,减少了碎片。页式管理通过页表对应逻辑地址和物理地址。

3.段式管理︰页式管理虽然提高了内存利用率,但是页式管理其中的页实际并无任何实际意义。段式管理把主存分为一段段的,每一段的空间又要比一页的空间小很多。但是,最重要的是段是有实际意义的,每个段定义了一组逻辑信息,例如,有主程序段MAIN、子程序段×、数据段D及栈段S等。段式管理通过段表对应逻辑地址和物理地址。

段页式管理机制结合了段式管理和页式管理的优点。简单来说段页式管理机制就是把主存先分成若干段,每个段又分成若干页,也就是说段页式管理机制中段与段之间以及段的内部的都是离散的。

快表和多级⻚表

⻚表管理机制中有两个很重要的概念:快表和多级⻚表,这两个东⻄分别解决了⻚ 表管理中很重要的两个问题。

在分⻚内存管理中,很重要的两点是: 1. 虚拟地址到物理地址的转换要快。 2. 解决虚拟地址空间⼤,⻚表也会很⼤的问题。

快表

为了解决虚拟地址到物理地址的转换速度,操作系统在 ⻚表⽅案 基础之上引⼊了 快表 来加速虚 拟地址到物理地址的转换。我们可以把快表理解为⼀种特殊的⾼速缓冲存储器(Cache),其中 的内容是⻚表的⼀部分或者全部内容。作为⻚表的 Cache,它的作⽤与⻚表相似,但是提⾼了访 问速率。由于采⽤⻚表做地址转换,读写内存数据时 CPU 要访问两次主存。有了快表,有时只 要访问⼀次⾼速缓冲存储器,⼀次主存,这样可加速查找并提⾼指令执⾏速度

使⽤快表之后的地址转换流程是这样的:

  1. 根据虚拟地址中的⻚号查快表;

  2. 如果该⻚在快表中,直接从快表中读取相应的物理地址;

  3. 如果该⻚不在快表中,就访问内存中的⻚表,再从⻚表中得到物理地址,同时将⻚表中的该 映射表项添加到快表中;

  4. 当快表填满后,⼜要登记新⻚时,就按照⼀定的淘汰策略淘汰掉快表中的⼀个⻚

多级⻚表

引⼊多级⻚表的主要⽬的是为了避免把全部⻚表⼀直放在内存中占⽤过多空间,特别是那些根本 就不需要的⻚表就不需要保留在内存中。多级⻚表属于时间换空间的典型场景

总结

为了提⾼内存的空间性能,提出了多级⻚表的概念;但是提到空间性能是以浪费时间性能为基础 的,因此为了补充损失的时间性能,提出了快表(即 TLB)的概念。 不论是快表还是多级⻚表实 际上都利⽤到了程序的局部性原理,局部性原理在后⾯的虚拟内存这部分会介绍到。

分⻚机制和分段机制的共同点和区别

  1. 共同点 : 分⻚机制和分段机制都是为了提⾼内存利⽤率,较少内存碎⽚。 ⻚和段都是离散存储的,所以两者都是离散分配内存的⽅式。但是,每个⻚和段中的内存是连续的。
  2. 区别 :
    1. ⻚的⼤⼩是固定的,由操作系统决定;⽽段的⼤⼩不固定,取决于我们当前运⾏的程 序。
    2. 分⻚仅仅是为了满⾜操作系统内存管理的需求,⽽段是逻辑信息的单位,在程序中可以 体现为代码段,数据段,能够更好满⾜⽤户的需要。

逻辑(虚拟)地址和物理地址

我们编程⼀般只有可能和逻辑地址打交道,⽐如在 C 语⾔中,指针⾥⾯存 储的数值就可以理解成为内存⾥的⼀个地址,这个地址也就是我们说的逻辑地址,逻辑地址由操作系统决定。物理地址指的是真实物理内存中地址,更具体⼀点来说就是内存地址寄存器中的地 址。物理地址是内存单元真正的地址

CPU 寻址了解吗?为什么需要虚拟地址空间?

现代处理器使⽤的是⼀种称为 虚拟寻址(Virtual Addressing) 的寻址⽅式。使⽤虚拟寻址,CPU 需要将虚拟地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为 物理地址转换的硬件是 CPU 中含有⼀个被称为内存管理单元(Memory Management Unit, MMU) 的硬件。

为什么要有虚拟地址空间呢? 先从没有虚拟地址空间的时候说起吧!没有虚拟地址空间的时候,程序都是直接访问和操作的都 是物理内存 。但是这样有什么问题呢

  1. ⽤户程序可以访问任意内存,寻址内存的每个字节,这样就很容易(有意或者⽆意)破坏操作系统,造成操作系统崩溃。
  2. 想要同时运⾏多个程序特别困难,⽐如你想同时运⾏⼀个微信和⼀个 QQ ⾳乐都不⾏。为什么呢?举个简单的例⼦:微信在运⾏的时候给内存地址 1xxx 赋值后,QQ ⾳乐也同样给内 存地址 1xxx 赋值,那么 QQ ⾳乐对内存的赋值就会覆盖微信之前所赋的值,这就造成了微信这个程序就会崩溃

总结来说:如果直接把物理地址暴露出来的话会带来严重问题,⽐如可能对操作系统造成伤害以 及给同时运⾏多个程序造成困难。

通过虚拟地址访问内存有以下优势:

​ 程序可以使⽤⼀系列相邻的虚拟地址来访问物理内存中不相邻的⼤内存缓冲区。

​ 程序可以使⽤⼀系列虚拟地址来访问⼤于可⽤物理内存的内存缓冲区。当物理内存的供应量 变⼩时,内存管理器会将物理内存⻚(通常⼤⼩为 4 KB)保存到磁盘⽂件。数据或代码⻚会根据需要在物理内存与磁盘之间移动。

​ 不同进程使⽤的虚拟地址彼此隔离。⼀个进程中的代码⽆法更改正在由另⼀进程或操作系统 使⽤的物理内存。

posted on 2021-09-29 10:37  风子sama  阅读(123)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3