第三章.2节 虚拟内存

版权声明:就是开个版权玩一下 https://blog.csdn.net/qq_41997479/article/details/86321778

(PS:个人课下整理的操作系统笔记,OneNote直接拷贝过来的,图片看不了就将就一下,配合张伟老师的PPT看效果更好)

一、背景

1.虚拟内存:是指具有请求调页与页置换功能,能从逻辑上对内存容量进行扩充的系统

2.

二、按需调页(Demand paging)

  • Bring a page into memory only when it is needed.
  • Page is needed : reference to it(有效位是0的情况)
    1. invalid reference : abort
    2. not-in-memory : bring to memory
  • 按需调页系统类似于:交换+分页系统
  • 惰性交换(Lazy swap:开始时进程驻留在二级存储器上,只有在需要页的时候,才将它调入内存。
  • 页错误(Page fault:页在后备存储(磁盘)而不在内存中
  • 处理页错误的步骤:
  1. 检查进程的页表,以确定该引用是合法还是非法的地址访问。
  2. 如果引用非法,那么终止进程。如果引用有效但是尚未调入页面,那么现在应调入。
  3. 找到一个空闲帧。
  4. 调度一个磁盘操作,以便将所需要的页调入刚分配的帧。
  5. 当磁盘读操作完成后,修改进程的内部表和页表,以表示该页已在内存中。
  6. 重新开始因非法地址陷阱而中断的指令。进程现在能访问所需的页,就好像它似乎总在内存中。
  • 页置换(Page replacement):内存中没有空闲帧,需要找一个牺牲帧的方案
  • 按需调页的性能影响因素:
  • 页错误的主要时间:处理页错误中断、读入页、重启进程

 

三、进程创建(Process creation)

1.虚拟内存带来的用于提高 进程创建和运行性能 的技术:写时拷贝(copy on write,COW)内存映射文件(Memory-mapped files)

  1. 写时拷贝:允许父进程和子进程开始时共享同一页面,不管是父进程还是子进程,要修改共享数据区域,要copy出来修改
  2. 内存映射文件——允许虚拟内存与一部分文件逻辑相关联

 

四、页置换(Page replacement):从满内存中找到牺牲帧

1.过度分配:通过页置换技术增加多道程序的度,导致所有进程页的和大于实际内存帧的现象

2.基本页置换方法:

  1. 查找所需页在磁盘上的位置。
  2. 查找一空闲帧:
    1. 如果有空闲帧,那么就使用它;
    2. 如果没有空闲帧,那么就使用页置换算法以选择一个牺牲帧。
    3. 将牺牲帧的内容写到磁盘上;改变页表和帧表。
  3. 将所需页读入(新)空闲帧;改变页表和帧表。
  4. 重启用户进程。

3.可以通过修改脏位(dirty bit)来降低开销,当牺牲帧被写进磁盘,置1.

4.置换算法的评估:针对特定内存引用串(内存的引用序列)运行置换算法,计算发生页错误的数量

  • 如何找到引用串:仅需找到页号即可,相邻的相同页号的访问不会发生页错误
     

如果页大小是100B,则得到以下引用串

1,4,1,6,1,6,1,6,1,6,1(已去掉相邻相同页号的连续访问,因为一定不会发生页错误)

5.随着帧数量增加,发生页错误数量越少。

6.页置换算法——FIFO算法,当必须置换时,将选择之前最旧的页作为牺牲帧

看下面的蓝色长方格往前看最远的

  • 会出现Belady 异常(Anomaly):对于一些页置换算法,随着帧数量增加,页错误率也有可能增加(FIFO就是一个很好的例子)

7.最优置换算法(Optimal Algorithm)——找到未来最长时间不用的帧,肯定不会有Belady异常

  • 该算法页错误率最低,但是无法预测未来
  • 找到未来最长时间不使用的帧。(往后看内存已有帧在之后何时第一次被访问,找出访问时间最远的当作牺牲帧)

8.最近最少使用算法(Least Recently used,LRU)——置换出最近使用最少的帧,也不会有Belady异常

往前看,看上方的访问序列。

  • LRU的实现,记录每个页的上次使用时间,每访问一个页,把它放到栈顶,如果有新元素,则往下压掉最底的那个元素则是牺牲帧
  • LRU算法之一——引用位策略(没被访问置0,访问置1)
    • 很少有计算机系统能提供足够的硬件来支持真正的LRU页置换。然而,许多系统都提供引用位的支持,页表中的每一项都关联着一个引用位。
    • 当8位都填满了,可根据十进制大小,谁小换谁牺牲
  • LRU算法之二——二次机会策略,会让常用帧一直驻留在内存中

 

  • 即引用位是1的有一次免死金牌,会选择下一个是0的。

 

五、帧分配(Allocation of frames)

(PS:帧——是内存中可以使用具有固定大小的内存块)

1.两种主要的分配方式:

  • 固定分配(Fixed allocation)
  • 基于优先级的分配(priority allocation)——从别的低优先级的进程中选择一个帧置换,高优先级进程多分配些帧。
  • 从别的进程找牺牲帧,则要用到全局置换策略

 

六、颠簸(Trashing)

1.颠簸:由于全局页置换(A进程抢B进程的帧,B进程抢C进程的帧)导致所有进程都在磁盘的等待队列去等待,去抢占别的进程的页,造成CPU利用率几乎为0,操作系统会误以为没有进程在运行,于是继续调入新的进程,导致多道程序度过大。

2.结果:计算机的崩溃

3.产生颠簸的原因之一:多道程序的度过大(并发运行的进程数)

4.N个进程局部内存之和>物理内存容量,一定发生颠簸

5.工作集合模型

 

 

 

七、其他考虑

1.欲调页(prepaging):在进程一开始,把所有进程的局部全部加载到内存中

2.页大小的选择标准:从TLB和IO overhead来看,页越大越好

从碎片和Locality来看,页越小越好

3.怎样来提高TLB范围?(TLB范围,通过TLB能访问的内存量)

  • TLB Reach = (TLB Size) X (Page Size),一般只有增加页大小来增加TLB范围

 

猜你喜欢

转载自blog.csdn.net/qq_41997479/article/details/86321778