99网
您的当前位置:首页初识虚拟内存

初识虚拟内存

来源:99网

什么是虚拟内存?

为什么要有虚拟内存?

通过虚拟内存,操作系统可以保护各个进程的内存空间,防止非法访问。这有助于防止程序错误和恶意行为导致系统崩溃或数据损坏。

内存分段

  • 内存碎片

    内存碎片可分为内部内存碎片和外部内存碎片。

    内存分段技术可以做到段根据实际需求来分配内存,即有多少需求就分配多大的量,所以不会出现内部内存碎片。

    但由于每个段的长度并不固定,所以多个段不一定能恰到好处地利用完所有的内存空间,这会产生若干个不连续的小的物理内存,致使新的程序无法被装载,所以存在外部内存碎片。

  • 内存交换的效率低

    解决外部内存碎片的方法就是通过内存交换,将内存中的数据写入到磁盘,再从磁盘写回内存中紧密排列,这样就能重新整理出空闲的物理内存空间。

    在 Linux 系统中,这个内存交换空间也就是常见的 Swap 空间,它是从磁盘中划分出来用于内存与磁盘做空间交换的。

    但是显而易见,对于多进程系统而言,采用分段的方式,产生外部内存碎片的概率是很高的,这就会导致频繁地 Swap 内存区域,同时磁盘的 I/O 是很慢的,所以每一次内存交换都会造成一定的性能瓶颈。

内存分页

由于内存分页的内存空间都是预先划分好的,所以不会出现内存分段中段与段之间会产生碎片的问题,但由于分配内存的最小单位是一页,即使程序不足一页大小也会至少分配一个页,所以会存在页内内存浪费,产生内部内存碎片的问题。

如果内存空间不足,操作系统会把其他正在运行的进程中最近没被使用的内存页给释放掉,即换出 Swap Out 到磁盘,当需要访问该页数据时,再 Swap In 加载进内存。所以一般来说只需要操作极少数的页,内存交换的效率就相对较高。

内存分页的缺点?

为了解决简单分页造成的额外内存开销,就引申出了多级页表,这里可以简单地类比成数据库索引结构中的多叉树。基于计组原理中的局部性原理,我们可以这样实现:如果某个一级页表的页表项没有被用到,那么就不需要创建它对应的二级页表,等到需要使用的时候再创建…以此类推多级页表,就能极大地减少内存的占用。

但是页表的多级结构(如二级或三级页表)虽然减少了单级页表的大小,但也会增加额外的查找开销。

TLB 是什么?

简单来说,就是针对多级页表增加了查询开销的问题,同样是基于局部性原理,把最常访问的几个页缓存起来,即 CPU 中的 TLB,也称为页表缓存、转址旁路缓存、快表。

  • 查找顺序

  • TLB 更新

    1. 当 TLB 未命中并从页表中获取新的映射后,需要将新的映射加载到 TLB 中
    2. 如果 TLB 已满,需要使用某种替换策略(如 LRU,Least Recently Used,最近最少使用)来选择一个旧的映射进行替换
  • TLB 刷新

  • 多级 TLB

    为了进一步提高性能,某些高性能处理器使用多级 TLB(如一级 TLB 和二级 TLB),一级 TLB 速度更快但容量较小,二级 TLB 容量更大但速度稍慢。这种结构可以在保持高命中率的同时,提供更大的缓存空间。

段页式内存管理

段页式内存管理(Segmented Paging Memory Management)是一种结合了分段(segmentation)和分页(paging)两种内存管理技术的混合机制。它利用分段的灵活性和分页的高效性,以便更好地管理内存,提高内存利用率,并提供更强的保护和隔离。

    • 逻辑地址由段号和段内偏移量组成
    • 通过段表(Segment Table)查找段号对应的段基地址和段长度,验证段内偏移量是否在段长度范围内
    • 段基地址和段内偏移量相加得到段内地址
    • 段内地址再分为页号和页内偏移量,通过页表查找页号对应的页框号
    • 最终的物理地址由页框号和页内偏移量组成

总结

分段(Segmentation)

优点

  • 逻辑单元管理:每个段可以表示一个逻辑单元(如代码段、数据段、堆栈段),有助于程序结构化
  • 灵活的大小:段的大小是可变的,可以根据实际需要进行分配,减少内存浪费
  • 内存保护:可以为不同段设置不同的访问权限,增强内存保护和进程隔离

缺点

  • 外部碎片:段的大小可变,容易产生外部碎片,导致内存空间利用率下降
  • 复杂的内存管理:需要维护段表和段的动态分配,增加了内存管理的复杂性

分页(Paging)

优点

  • 消除外部碎片:内存被分为固定大小的页,避免了外部碎片问题
  • 简化内存管理:固定大小的页使得内存分配和回收更加简单
  • 虚拟内存支持:分页机制与虚拟内存技术结合,可以高效地管理大地址空间

缺点

  • 内部碎片:由于页的大小固定,可能会产生内部碎片,即未用完的页内空间浪费
  • 地址转换开销:虚拟地址到物理地址的转换需要通过页表查找,增加了访问内存的时间开销
  • TLB 未命中开销:TLB 未命中时,需要访问页表,增加了内存访问延迟

段页式内存管理(Segmented Paging)

优点

  • 灵活的内存管理:结合了分段的逻辑单元管理和分页的固定大小页管理,提供了更灵活的内存管理
  • 减少外部碎片:分页机制消除了外部碎片,同时保留了分段的逻辑结构优势
  • 强大的内存保护:分段机制提供了细粒度的访问控制,增强了内存保护

缺点

  • 实现复杂性:需要维护段表和页表,增加了实现和管理的复杂性
  • 地址转换开销:地址转换过程更复杂,需要多次查找(段表和页表),增加了时间开销
  • 硬件支持要求高:需要复杂的硬件支持(如 MMU,内存管理单元),增加了系统实现难度

目前操作系统的内存管理方案

现代操作系统大多采用分页(Paging)或段页式内存管理(Segmented Paging),具体选择取决于系统的需求和设计目标。

分页(Paging)

  • 使用系统:Linux、Windows、macOS 等大多数现代操作系统
  • 原因:分页提供了较好的内存利用率和简化的内存管理,适合于大多数通用计算环境。分页与虚拟内存技术结合,能够高效管理大地址空间

段页式内存管理(Segmented Paging)

  • 使用系统:一些高级的操作系统和特定领域的系统(如某些实时操作系统)
  • 原因:段页式内存管理结合了分段和分页的优点,适合需要复杂内存管理和高性能的应用环境。它在提供灵活内存管理的同时,增强了内存保护和隔离能力
  1. 分段适用于需要逻辑结构化和内存保护的场景,但易产生外部碎片
  2. 分页提供了简化的内存管理和较好的内存利用率,但易产生内部碎片和增加地址转换开销
  3. 段页式内存管理结合了两者的优点,提供了灵活和高效的内存管理,但实现复杂性较高
  4. 现代操作系统多采用分页或段页式内存管理,以满足不同应用需求和系统性能要求

参考资料

因篇幅问题不能全部显示,请点此查看更多更全内容