虚拟内存 操作系统笔记整理系列

Posted 雨宙

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟内存 操作系统笔记整理系列相关的知识,希望对你有一定的参考价值。

虚拟内存

背景

  1. 虚拟内存:用户逻辑内存与物理内存的分离。
    (1)只有程序的一部分需要在内存中来运行
    (2)逻辑地址空间可以远远大于物理地址空间
    (3)允许地址空间可以被多个进程共享
    (4)允许更多高效进程创建
  2. 虚拟内存可以通过按需调页和页置换来实现

按需调页(Demand Paging)

只有在需要时才将页调入内存,更少的I/O,更少的内存,更快的响应,满足更多的用户

  1. 有效-无效位:每个页表条目都关联一个有效-无效位,1表示在内存中,0表示不在内存中,初始时所有的有效-无效位置为0
  2. 页错误:如果有一个页面的引用,第一个引用将陷入操作系统(访问页,页不在内存中,在磁盘中)

处理页错误的步骤:

  1. 检查这个进程的内部表,以确定该引用是有效的还是无效的内存访问
  2. 如果引用无效,终止进程;如果引用有效但是该页尚未被调入到物理内存中,那么现在就应调入
  3. 执行调度磁盘操作,将所需的页读入到物理内存刚分配的帧中
  4. 当磁盘读取完成时,修改进程的内部表和页表,将页表的对应的有效无效位设置为1,以指示该页处于内存中
  5. 重新启动被陷阱中断的指令
    在这里插入图片描述
  1. 页置换:发生在没有空闲帧的时候
    (1)在内存中找到一些没有真正使用的页面(牺牲帧),将其交换出去
    (2)算法性能:页置换算法导致最少数量的页错误
  2. 按需调页的性能
    (1)页错误率p:p=0,没有页错误;p=1,每一个对页的引用的引用都导致页错误
    (2)有效访问时间EAT:(1 – p) x memory access
    + p (page fault interrupt
    + swap page out
    + swap page in
    + restart the process)

进程创建(Process Creation)

在进程创建过程中,虚拟内存提供了其他的好处:写时复制、内存映射文件

写时复制(Copy-on-Write):

  1. 允许子进程和父进程最初在内存中共享相同的页,如果任何一个进程修改了一个共享页面,那么该页面才会被复制
  2. 允许更高效的进程创建,因为只复制修改过的页
  3. 空闲页是从一个被清空的页面池中分配的
    在这里插入图片描述

内存映射文件(Memory-Mapped Files)

  1. 允许一部分虚拟内存与文件进行逻辑关联
  2. 标准系统调用open(),read(),write()来顺序读取磁盘文件
  3. 实现文件的内存映射是,将每个磁盘块映射到一个或多个内存页面,最初,文件访问按普通请求调页来进行,从而产生缺页错误,文件按页从文件系统读取到物理内存,之后,文件的读写就按常规的内存访问来处理
  4. 通过内存的文件操作,没有系统调用read()和write()的开销(不用每一次都到磁盘读写),简化了文件的访问和使用
  5. 注:内存映射文件的写入不一定是对物理文件的同步写入,可能是定期更新,当关闭文件时,所欲内存映射数据会写到磁盘,并从进程虚拟内存中删除
    在这里插入图片描述

页置换(Page Replacement)

页置换完成了逻辑内存和物理内存的分离——可以在较小的物理内存上提供大的虚拟内存

  1. 页置换步骤:
    (1)找到所需页的磁盘位置
    (2)找到一个空闲帧
    a. 如果有空闲帧,就使用它
    b. 如果没有空闲帧,那么就使用页置换算法选择一个牺牲帧
    c. 将牺牲帧的内容写到磁盘上,修改对应的页表和帧表
    d. 从发生页错误位置,继续用户进程
    在这里插入图片描述

页置换算法

想要达成的目标:低页错误率
评估算法:针对特定的内存引用串,运行某个页置换算法,并计算页错误的数量

  1. 引用串
    (1)需要考虑如何降低数据数量
    a. 仅考虑页码
    b. 如果有一个对页p的引用,那么紧跟其后的任何对页p的引用都不会产生页错误
  2. 理论上,帧数越多,页面错误越少

FIFO算法

  1. 核心思想:先进先出
  2. 表现并不好:当帧数增大的时候,页错误数量也可能会增大
    在这里插入图片描述

OPT算法

  1. 核心思想:替换最长时间不会被使用的页(向后数)
    在这里插入图片描述

LRU算法

  1. 核心思想:替换最长时间没有被使用的页面(向前数)
  2. 计数器实现:置换具有最小时间的页
  3. 栈实现:两个指针首指针和尾指针,每当页被引用时,从栈中移除并放在顶部,这样,最近使用的页面总是在堆栈的顶部,最近最少使用的页面总是在底部
    在这里插入图片描述

近似LRU页置换算法

包括额外引用位算法和第二次机会算法

基于计数的页面置换算法

为每个页面的引用次数保存一个计数器,采用最不经常使用或最经常使用页置换算法

帧分配(Allocation of Frames)

每个进程分配到所需要的最小帧数,所分配的帧不能超过可用帧的数量
两种分配方案:固定大小分配、基于优先级分配

固定大小分配

  1. 平均分配:100个帧,5个进程,给每个进程分配20个页
  2. 按比例分配(根据进程的大小)

基于优先级分配

  1. 所采用的比例分配的策略不是根据进程的大小,而是根据进程的优先级 或 大小和优先级的组合
  2. 发生页错误时换出优先级低的进程中的帧

全局分配和局部分配

全局置换允许一个进程从所有帧的集合中选择一个置换帧,而不管该帧是否已分配给其他进程,也就是说,一个进程可以从另一个进程那里获取帧
局部置换要求每个进程只从它自己分配的帧中进行选择

颠簸(Thrashing)

  1. 如果一个进程没有足够的页,页错误率非常高,这会导致 低CPU利用率,操作系统认为可以增加多道程序的度,另外一个进程被添加进来
  2. 颠簸:进程在不断地将页调入调出(页错误率高)

按需调页是根据局部性原理工作的,即每个进程只有一部分加载到物理内存中,进程会从一个局部转移到另外一个局部,局部可能会重叠

  1. 颠簸发生的原因:局部之和>内存(如果没有分配到足够的帧来容纳当前局部,进程将会发生颠簸,因为不能在内存中保留正在使用的所有页面)

工作集模型

  1. 最近 △ \\triangle 个页面引用的页面集合称为工作集(不用重复)
    在这里插入图片描述

其他考虑

预调页

  1. 预估第一个局部需要的页,一次性调入内存中

页大小的选择

  1. 页表的大小:页表放入内存导致两次访问,使用TLB一次访问内存(一般只能放页表的子集,每一个局部的页加载到TLB中)
  2. 碎片:单个页越大,内部碎片越大
  3. I/O开销:单个页越大,效率越高,减少寻道和延迟时间
  4. 局部:单个页越大,不能精确覆盖局部

TLB范围

  1. TLB范围(TLB reach):TLB条数与页面大小的乘积
  2. 增大TLB范围的两种方法:增大页面大小、提供多个页面大小

I/O互斥锁

  1. 页有时需要被锁定在内存中
  2. 用于执行I/O请求的页面必须被锁定,以防止页置换算法将其替换出去。

以上是关于虚拟内存 操作系统笔记整理系列的主要内容,如果未能解决你的问题,请参考以下文章

内存管理 操作系统笔记整理系列

内存管理 操作系统笔记整理系列

CPU调度 操作系统笔记整理系列

CPU调度 操作系统笔记整理系列

Java虚拟机系列(25篇文章)一起啃

操作系统笔记:内存虚拟化