本科生操作系统原理学习记录
学习记录全家桶
第九章 虚拟内存
代码必须转入内存才能运行,但是并不是所有代码都需要装入
局部性原理:一个程序只要部分装入内存就可以运行
9.1 虚拟内存技术
当进程运行时,先将其一部分装入内存,另一部分暂留在磁盘,当要执行的指令或访问的数据不在内存时,由操作系统自动完成将它们从磁盘调入内存执行。
虚拟地址空间:分配给进程的虚拟内存
虚拟地址:在虚拟内存中指令或数据的位置
虚拟内存:把内存和磁盘有机结合起来使用,得到一个容量很大的“内存”,即虚存。但是也要结合电脑本身的地址空间,即32位和64位的影响。32位最大只能为4G,64位可以很大。
写时复制 Copy-on-Write
写时复制允许父进程和子进程在初始化时共享页面
如果一个进程对共享页面进行修改,会产生副本。
9.2 虚拟内存的实现
两种实现方式:
-
虚拟页式(虚拟存储技术+页式存储管理)
-
虚拟段式(虚拟存储技术+段式存储管理)
虚拟页式有两种方式:
- 请求分页(一开始全在外存之中)
- 预调页(预先调一些页)
请求分页
-
进程开始运行之前,不是装入全部页面,而是装入一个或零个页面
-
运行之后,根据进程运行需要,动态装入其他页面
-
当内存空间已满,而又需要装入新的页面时,则根据某种算法置换内存中的某个页面,以便装入新的页面
缺页中断
如果对一个页的访问,首次访问该页需要陷入OS 缺页中断( page-fault trap)
- 访问指令或数据
- 查看另一个表来决定:
2.1 无效引用 => 终止
2.2 仅仅不在内存 - 找到页在后备存储上的位置
- 得到空的页框,把页换入页框
- 重新设置页表,把有效位设为v
- 重启指令
缺页中断的处理过程(期末考试)内中断,软中断
请求分页的性能(期末考试)
时间换空间
缺页率:缺页次数 / 总的访问次数 ,缺页的概率。
有效访问时间(EAT)
EAT = (1-p)* 内存访问时间 + p * 页面出错时间
9.3 页面置换
基本的页置换方法:
- 找到页在磁盘中的位置
- 查找一空闲框(这里需要处理很多中可能以及策略)
- 将页写入空闲框,更新页表和帧表
- 重启用户进程
页面置换算法
FIFO先进先出算法
先进先出算法采用队列实现,对每次要写入的页,先在队列中查找是否有空闲位置,有的话直接将页插入队尾;没有空闲页则查找是否原本就存在这个页,如果存在,则不做任何操作;如果没有,则将队列头部的页挤掉,这个页插入队尾。
Belady异常,更多的页框可能呢会导致更多的缺页(四个页框就比三个要多缺页)
OPT最优置换算法
被置换的页是将来不再需要的或最远的将来才会被使用的页(从当前的页号往后看,哪个不再需要或者最远需要)
作用:作为一种标准来衡量其他算法的性能
LRU最近最少使用算法
往前看,看哪个页号最长时间没被使用,而且在画图更新的时候,最好将最近使用的页面放在最上面,最久使用的放在最后面。
置换最长时间没有使用的页
二次机会算法
需要访问位
如果访问位为0,直接置换
如果将要交换的页访问位是1,则:
把访问位设位0
把页留在内存中
以同样的规则,替换下一个页
实现:时钟置换(顺时针方式)
9.4 系统颠簸
9.4.1 页框分配
必须满足:每个进程所需的最少的页数
两个主要的分配策略
- 固定分配
- 优先级分配
固定分配:
平均分配 –均分法
例:如果有100个页框,和5个进程,则每个进程分给20个页
按比率分配 – 根据每个进程的大小来分配
优先级分配:
根据优先级而不是进程大小来使用比率分配策略
如果进程Pi产生一个缺页
- 选择替换其中的一个页框
- 从一个较低优先级的进程中选择一个页面来替换
9.4.2 颠簸
如果一个进程没有足够的页,那么缺页率将很高,这将导致:
- CPU利用率低下.
- 操作系统认为需要增加多道程序的道数
- 系统中将加入一个新的进程
颠簸(抖动):一个进程的页面经常换入换出
抖动的原因:进程频繁访问页面数目高于可用的物理块数(分配给进程的物理块不够)
工作集模型:
工作集概念:某短时间间隔里,进程实际访问页面的集合。
a 安装更快的CPU 不行
b. 安装更大的分页磁盘 不行
c. 提高多道程度
d. 降低多道程度
e. 安装更多内存
f. 安装更快的硬盘或者具有多个硬盘的多个控制器 有可能
g. 为页面获取算法添加预先调页
9.5 内核内存分配
不同于用户内存
通常从空闲内存池中获取
- 内核需要为不同大小的数据结构分配内存
- 一些内核内存需要连续的物理页模拟
内核在使用内存块时有如下特点:
(1)内存块的尺寸比较小;
(2)占用内存块的时间比较短;
(3)要求快速完成分配和回收;
(4)不参与交换。
(5)频繁使用尺寸相同的内存块,存放同一结构的数据;
(6)要求动态分配和回收。
伙伴系统
Buddy System
主要思想:内存按照2的幂
9.6 其他因素
9.6.1 预调页
在进程启动初期,减少大量的缺页中断
在引用前,调入进程的所有或一些需要的页面
如果预调入的页面没有被使用,则内存被浪费
9.6.2 页面尺寸选择
尺寸选择
- 碎片 – 需要小的页
- 表大小 – 需要大的页
- I/O 开销 – 需要大的页
- 程序局部 – 需要小的页
- 缺页次数 – 需要大的页
- 其他因素
没有最佳答案,总的来说,趋向更大的页
9.6.3 TLB范围
TLB 范围 – 通过TLB所访问的内存量
TLB 范围 = (TLB 大小) X (页大小)
理想情况下,一个进程的工作集应存放在 TLB中
- 否则会有大量的缺页中断
增加页的大小
- 对于不需要大页的应用程序而言,这将导致碎片的增加
提供多种页的大小
- 这允许需要大页的应用程序有机会使用大页而不增加碎片的大小