操作系统之虚拟内存(什么是虚拟内存、虚拟内存实现机制、页面置换算法)

1. 什么是虚拟内存?
  • 虚拟内存设计的背景:
  1. 进程映像包括程序代码、数据和PCB,这些都需要占据物理内存。
  2. 有可能一个进程运行所需的程序代码和数据完全超过了物理内存的大小,更何况操作系统中同时有多个进程,而且物理内存需要存储其他信息。
  3. 这时候,可以根据程序的局部性原理,先将一部分的程序和数据加载到物理内存中,剩余部分放在磁盘上。
  4. 有需要的时候,再从磁盘加载其他部分;如果物理内存不够,还可以将已经加载到物理内存的部分换出,为加载其他部分腾出空间。
  5. 而且,希望这样的换入换出对用户来说是透明。给用户一种内存很大,无需担心小而有限的内存容量给程序设计带来限制的安全感。
  • 虚拟内存的实质:
  1. 将进程的地址空间叫做虚拟地址空间,对这片空间进行分块,每个块叫做一个
  2. 使用某些机制,如分页机制、分段机制、段页式机制,将每个页映射到物理内存中,即将虚拟地址映射为物理地址
  3. 这样进程访问的是虚拟地址,内部会被转化成存储了代码或数据的物理地址,从而访问到想要的代码或数据。
  4. 并且,这些页不需要被映射到连续的物理内存,也不需要所有页都在物理内存中
  5. 当进程引用不到物理内存中的页时,操作系统和硬件执行一些列操作,将缺失的部分装入物理内存,并重新执行失败的指令。
  • 优点: 通过使用虚拟内存技术,可以将物理内存扩大成更大的虚拟内存,从而不用担心小容量的内存对程序设计的限制。
2. 如何实现虚拟内存?
  • 通过分页分段段页式三种机制,实现虚拟内存。
① 分页
  • 将进程的虚拟地址空间划分成页,虚拟地址页号 + 偏移量组成。通过查找页表中的页表项(PTE),可以获得该页对应的物理内存页框号页框号 + 虚拟地址中的偏移量构成物理地址,进程便可以访问到代码或数据。
    在这里插入图片描述
  • 分页机制有三种实现:两级分页倒排序转换检测缓冲区(TLB)

分级分页

  • 32 bit虚拟地址的两级页表:
  1. 系统采用字节寻址,每个页的大小为4 kb,所以需要12 bit进行页内寻址,即虚拟地址中的偏移量需要12 bit
  2. 一级和二级页表中,每个页表的大小均为4 kb,每个页表项为4 byte,可以存储1 kb(1024)页表项
  3. 一级页表(即根页表)只有一个页表,每个页表项对应一个二级页表(即用户页表),因此可以查找1024个用户页表。
  4. 因此,用户页表共有 1024(页表数目)* 1024(页表项数目)= 1 Mb的页表项,可以寻址1 Mb * 4 kb= 4 GB虚拟地址空间。
    在这里插入图片描述
  • 根据上面的分析可知,在32 bit的两级分页系统中,地址转换如下:
  1. 前10 bit用于查找根页表中的页表项,根据根页表中的页表项可以得到对应的用户页表
  2. 中间10 bit用于查找用户页表中的页表项,根据用户页表种的页表项可以得到对应的页框号
  3. 后12 bit用于页内寻址(即偏移量),将页框号加上偏移量便可以得到物理地址,从而访问到物理内存中的数据。

在这里插入图片描述

  • 分级的页表的缺点:页表的大小与虚拟地址空间的大小成正比。因为虚拟地址空间越大,需要的页表项越多,页表也就越大。

倒排页表

  • 倒排页表设计的背景:
  1. 传统的分页机制实现方法中,一个虚拟页对应页表中的一个页表项,导致页表大小与虚拟地址空间的大小成正比。
  2. 物理内存中的页框数是固定的,如果我们将页框号与页表项一一对应,则可以减少传统实现方式中对内存的大量占用。
  3. 假设有 2 m 2^m 2m个页框,只需要构建一个大小为 2 m 2^m 2m的页表。检索整个页表,如果存在某个页表项i中的 (页号,PID) 符合该虚拟地址的页号和对应的PID,就认为该页的页框号i
  • 倒排表的整体设计思路:
  1. 基于上面的想法,假设有 2 m 2^m 2m个页框,只需要构建一个大小为 2 m 2^m 2m的页表。每个页表项包含:页号、PID、控制位。
  2. 查找页框号时,对整个页表进行检索,直到找到某个页表项中的 (页号,PID) 满足条件。
  3. 检索页表中所有的页表项,效率非常低下。因此,需要使用一个hash表
  4. 先通过hash函数将n bit的页号映射成m bit的页表项索引,hash表中包含指向倒排表的指针,通过该指针可以快速检索到对应的页表项。
  5. 由于不同的页号在映射时可能出现hash冲突,为了解决冲突使用链表。如果该页表项有后继页表项,则通过链指针指向后继页表项。
  6. 因此倒排页表的页表项包含:页号、PID 、控制位、链指针(没有后继页表项,链指针为null)。
    在这里插入图片描述
  • 倒排页表进行地址转换时,需要访问两次内存:一次查询hash表,一次查询页表。
    转换检测缓冲区(TLB)
  • 转换检测缓冲区(Translation Lookaside BufferTLB),又叫快表。TLB是为页表设计的一种特殊的高速缓存,一般放在MMU(Memory Management Unit,内存管理单元)中。
  • TLB设计的背景:
  1. 原则上访问虚拟地址时需要进行两次内存访问:一次查找页表获得对应的页框号;一次从物理内存获取数据。
  2. 因此,简单的虚拟内存方案会导致内存访问时间的加倍
  3. 如果我们将一些访问过的页表项存入到TLB中,就可以减少内存访问的次数。
  • TLB访问的过程:
  1. 给定一个虚拟地址,内存首先检查TLB,如果TLB命中(TLB hit),则获得页框号并形成物理地址。
  2. 如果TLB未命中(TLB miss),则可能存在两种情况,一种是页表项在页表中但不在TLB中,一种是页表项不在页表中
  3. 如果页表项在页表中但不在TLB中,处理器检索页表获得页表项,并从页表项中获得页框号形成物理地址。同时,处理器还要更新TLB。
  4. 如果页表项不在页表中,则发生一次缺页(page fault)中断。这时将离开硬件作用范围,将由操作系统负责将缺失的页从磁盘加载到物理内存并更新页表。
  5. 如果物理内存已满,需要先进行页面置换,再更新页表。
    在这里插入图片描述
  • 关于虚拟地址与TLB的映射:关联映射
  1. 对于普通的页表,虚拟地址中的页号为i,则对应的页表项索引为i。这种方式叫直接映射。
  2. 而TLB的大小是有限的,不可能使用直接映射,而是采用关联映射
  3. 每个TLB的entry都包含:页号、页表项,查找时可以同时检索所有的entry。
    在这里插入图片描述
② 分段
  • 我们可以把内存看作多个段,每个段构成一个独立的地址空间。与分页相比,每个段的大小是不固定的,且可以动态增长
  • 分段系统中的地址转换:
  1. 分段系统中,虚拟地址由段号偏移量组成。
  2. 通过段表指针可以查找段号所对应的的entry,该entry中包含段基址长度
  3. 段基址 + 偏移量可以获得物理地址(段地址),便可以访访问物理内存中对应的段。
    在这里插入图片描述
  • 分段与分页的比较:
  1. 对程序员是否透明: 分页对程序员是透明的,分段需要程序元显式划分每个段。
  2. 大小是否固定: 页的大小是固定的,段的大小是不固定的,而且可以动态改变。
  3. 地址空间的维度: 分页是一维地址空间:分页标识一个地址,只需要一个页内地址;分段是二维地址空间:分段标识一个地址,需要给出段名和段内地址。
  4. 出现的原因: 分页主要用于虚拟内存,从而获得更大的地址空间;分段主要为了使程序和数据可以划分成逻辑上独立的地址空间,并且有利于共享和保护。
    出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。
③ 段页式
  • 段页式的主要思想:
  1. 将进程的地址空间划分成多个段,每个段有划分成多个页。
  2. 这样可以既拥有分段共享和保护的优点,还能拥有分页的虚拟内存功能。
  • 段页式系统的结构如下:
  1. 一个进程拥有一个段表和多个页表每个段对应一个页表,即段表中的每个entry对应一个页表。
  2. 虚拟地址包含:段号、页号、偏移量,先通过段号查找到对应的页表,然后通过页号查找到对应的页框号形成物理地址。
    在这里插入图片描述
3. 虚拟内存的页面置换算法
① 最佳(OPT)
  • 最佳策略(optimal,OPT)选择置换下次访问距离当前时间最长的那些页
  • 需要访问的页面顺序如下,有三个页框。
    2 3 2 1 5 2 4 5 3 2 5 2 2\quad3\quad2\quad1\quad5\quad2\quad4\quad5\quad3\quad2\quad5\quad2 232152453252
  • 则页面的置换行为如下,其中F表示页框满后的缺页中断:
    在这里插入图片描述
  • 注意:
  1. 由于操作系统无法知道页面下次访问的时间,所以这个算法是不可能实现的。
  2. 最佳策略作为一种标准,用于衡量其他算法的性能。
② 先进先出(FIFO)
  • 先进先出策略(First In First Out,FIFO),选择最先进入页框中的进行置换
  • 页面访问的要求同上,访问结果如下:
    在这里插入图片描述
③ 最近最少使用(LRU)
  • 最近最少使用策略(Least Recently Used,LRU),选择上次访问时间距离当前最远的页进行置换
  • LRU的理论基础:根据局部性原理,这样的页是最近最不可能访问的。
  • 页面访问的要求同上,访问结果如下:
    在这里插入图片描述
④ 时钟(clock)
  • 看不懂。。。
4. 面经问题总结

1. 操作系统的内存管理

  • 虚拟内存设计的背景(内存大小不能满足进程的运行需求)、设计思想(虚拟地址空间分页、映射、缺页如何处理)
  • 三种机制: 分页(多级、倒排、TLB)、分段(有利于共享和保护)、段页式(前两者的结合)
  • 页面置换算法:最佳策略(不可能实现)、先进先出、LRU
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值