虚拟内存 操作系统笔记整理系列
Posted 雨宙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了虚拟内存 操作系统笔记整理系列相关的知识,希望对你有一定的参考价值。
虚拟内存
背景
- 虚拟内存:用户逻辑内存与物理内存的分离。
(1)只有程序的一部分需要在内存中来运行
(2)逻辑地址空间可以远远大于物理地址空间
(3)允许地址空间可以被多个进程共享
(4)允许更多高效进程创建 - 虚拟内存可以通过按需调页和页置换来实现
按需调页(Demand Paging)
只有在需要时才将页调入内存,更少的I/O,更少的内存,更快的响应,满足更多的用户
- 有效-无效位:每个页表条目都关联一个有效-无效位,1表示在内存中,0表示不在内存中,初始时所有的有效-无效位置为0
- 页错误:如果有一个页面的引用,第一个引用将陷入操作系统(访问页,页不在内存中,在磁盘中)
处理页错误的步骤:
- 检查这个进程的内部表,以确定该引用是有效的还是无效的内存访问
- 如果引用无效,终止进程;如果引用有效但是该页尚未被调入到物理内存中,那么现在就应调入
- 执行调度磁盘操作,将所需的页读入到物理内存刚分配的帧中
- 当磁盘读取完成时,修改进程的内部表和页表,将页表的对应的有效无效位设置为1,以指示该页处于内存中
- 重新启动被陷阱中断的指令
- 页置换:发生在没有空闲帧的时候
(1)在内存中找到一些没有真正使用的页面(牺牲帧),将其交换出去
(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):
- 允许子进程和父进程最初在内存中共享相同的页,如果任何一个进程修改了一个共享页面,那么该页面才会被复制
- 允许更高效的进程创建,因为只复制修改过的页
- 空闲页是从一个被清空的页面池中分配的
内存映射文件(Memory-Mapped Files)
- 允许一部分虚拟内存与文件进行逻辑关联
- 标准系统调用open(),read(),write()来顺序读取磁盘文件
- 实现文件的内存映射是,将每个磁盘块映射到一个或多个内存页面,最初,文件访问按普通请求调页来进行,从而产生缺页错误,文件按页从文件系统读取到物理内存,之后,文件的读写就按常规的内存访问来处理
- 通过内存的文件操作,没有系统调用read()和write()的开销(不用每一次都到磁盘读写),简化了文件的访问和使用
- 注:内存映射文件的写入不一定是对物理文件的同步写入,可能是定期更新,当关闭文件时,所欲内存映射数据会写到磁盘,并从进程虚拟内存中删除
页置换(Page Replacement)
页置换完成了逻辑内存和物理内存的分离——可以在较小的物理内存上提供大的虚拟内存
- 页置换步骤:
(1)找到所需页的磁盘位置
(2)找到一个空闲帧
a. 如果有空闲帧,就使用它
b. 如果没有空闲帧,那么就使用页置换算法选择一个牺牲帧
c. 将牺牲帧的内容写到磁盘上,修改对应的页表和帧表
d. 从发生页错误位置,继续用户进程
页置换算法
想要达成的目标:低页错误率
评估算法:针对特定的内存引用串,运行某个页置换算法,并计算页错误的数量
- 引用串
(1)需要考虑如何降低数据数量
a. 仅考虑页码
b. 如果有一个对页p的引用,那么紧跟其后的任何对页p的引用都不会产生页错误 - 理论上,帧数越多,页面错误越少
FIFO算法
- 核心思想:先进先出
- 表现并不好:当帧数增大的时候,页错误数量也可能会增大
OPT算法
- 核心思想:替换最长时间不会被使用的页(向后数)
LRU算法
- 核心思想:替换最长时间没有被使用的页面(向前数)
- 计数器实现:置换具有最小时间的页
- 栈实现:两个指针首指针和尾指针,每当页被引用时,从栈中移除并放在顶部,这样,最近使用的页面总是在堆栈的顶部,最近最少使用的页面总是在底部
近似LRU页置换算法
包括额外引用位算法和第二次机会算法
基于计数的页面置换算法
为每个页面的引用次数保存一个计数器,采用最不经常使用或最经常使用页置换算法
帧分配(Allocation of Frames)
每个进程分配到所需要的最小帧数,所分配的帧不能超过可用帧的数量
两种分配方案:固定大小分配、基于优先级分配
固定大小分配
- 平均分配:100个帧,5个进程,给每个进程分配20个页
- 按比例分配(根据进程的大小)
基于优先级分配
- 所采用的比例分配的策略不是根据进程的大小,而是根据进程的优先级 或 大小和优先级的组合
- 发生页错误时换出优先级低的进程中的帧
全局分配和局部分配
全局置换允许一个进程从所有帧的集合中选择一个置换帧,而不管该帧是否已分配给其他进程,也就是说,一个进程可以从另一个进程那里获取帧
局部置换要求每个进程只从它自己分配的帧中进行选择
颠簸(Thrashing)
- 如果一个进程没有足够的页,页错误率非常高,这会导致 低CPU利用率,操作系统认为可以增加多道程序的度,另外一个进程被添加进来
- 颠簸:进程在不断地将页调入调出(页错误率高)
按需调页是根据局部性原理工作的,即每个进程只有一部分加载到物理内存中,进程会从一个局部转移到另外一个局部,局部可能会重叠
- 颠簸发生的原因:局部之和>内存(如果没有分配到足够的帧来容纳当前局部,进程将会发生颠簸,因为不能在内存中保留正在使用的所有页面)
工作集模型
- 最近
△
\\triangle
△个页面引用的页面集合称为工作集(不用重复)
其他考虑
预调页
- 预估第一个局部需要的页,一次性调入内存中
页大小的选择
- 页表的大小:页表放入内存导致两次访问,使用TLB一次访问内存(一般只能放页表的子集,每一个局部的页加载到TLB中)
- 碎片:单个页越大,内部碎片越大
- I/O开销:单个页越大,效率越高,减少寻道和延迟时间
- 局部:单个页越大,不能精确覆盖局部
TLB范围
- TLB范围(TLB reach):TLB条数与页面大小的乘积
- 增大TLB范围的两种方法:增大页面大小、提供多个页面大小
I/O互斥锁
- 页有时需要被锁定在内存中
- 用于执行I/O请求的页面必须被锁定,以防止页置换算法将其替换出去。
以上是关于虚拟内存 操作系统笔记整理系列的主要内容,如果未能解决你的问题,请参考以下文章