操作系统-第九章虚拟内存

虚拟内存

程序执行的局部性
时间局部性,空间局部性
虚拟内存类比cache

虚拟存储的基本思想

  1. 基于虚拟存储技术,用户可以在一个比物理内存大的多的虚拟地址空间中编程
  2. 给予局部性远离,在一个作业运行之前,没有必要全部装入主存,而金奖那些当前要运行的那部分页面或者段,先装入主存启动运行,其余的部分暂时留在磁盘兑换区中。
  3. 如果程序所需访问的页尚未调入内存(称为缺页或者缺段),程序应利用OS提供的请求调页功能,将他们调入内存
  4. 如果内存已满,无法装入新的页,利用置换功能,将内存中暂时不用的页调换到磁盘中,腾出空间

虚拟存储器指的是将作业的一部分装入内存便可运行作业,具有请求调入功能和置换功能,能从逻辑上对内存容量加以扩充的一种存储器系统。提高了系统的并发度及吞吐量减少了I/O时间
在这里插入图片描述

内存共享

在这里插入图片描述

按需调页

请求页式,请求段式,请求段页式
慵懒交换:只有在需要页时,才将它调入内存
swapper:交换程序,对整个程序进行操作
pager:调页程序 只是单个的页进行操作

在这里插入图片描述

虚拟存储需要解决的几个问题

以页请求为例

  • 当访问一个页面时,需要检测页是否存在
    (page table +Valid & invalid bit ) or (page table + existence bit)

  • 页面不存如何处理?(page fault trap, 缺页中断,页面错误,页失效)

  • 当装入页面时,若内存无限制叶匡,如何处理?(page replacement,页面置换)

  • 当页面置换过于频繁时,会引起系统不稳定定,如何处理?(thrashing,抖动,颠簸)

页表中须指明对应的页是否在内存中

valid & invalid bit
valid(v) 页面有效并处在内存中
invalid (i)页面无效,或者是有效但不在内存中

如果valid-invalid bit 是 i -> page fault 页错误:
操作系统需要更细致的划分
非法的引用 -> 中止访问
该页不在内存中 -> 将页面调入内存

在这里插入图片描述

如何具体的区分当发生页错误时 page is invalid or isvalid but not in memory

两个页表的模式
进程页表:每个进程维护一个自己的页表,包含当前的内存分配状态,比如合法页面和是否他们在内存中
系统页表: 为正在执行的进程维护一个页表。OS将系统页表的部分保存到旧的进程页表中,装入新调度的进程的页表

另一个实现
页表中每个页面添加一个存在位"existence bit",一直名相应的页是否在内存中。
"valid-invalid bit"标识相应的页面是否合法。

在这里插入图片描述

Page Fault (页面错误、页失效、缺页中断)

当访问一个页面的时候,如果这个页面时第一次访问会内陷入操作系统/
1、操作系统决定只是非法访问还是页不在内存。非法访问,终止进程。页不在内存,调入内存。系统通过对比系统页表和进程页表以确定页面的引用是非法页面,还是一个为装入内存的合法页面。
2、找到一个空闲帧
3、将页面调入刚刚那个分配的祯
4、修改页表,和进程表,将有有效位置为v
5、重新开始因因陷阱而中断的指令
在这里插入图片描述
缺页中断与一般中断相比,有明显不同
CPU在执行完一条指令之后检查和处理通常的中断请求。而缺页中断确实在指令执行期间,发现要访问的指令和数据不在内存时产生和处理。
一条指令执行期间,可能发生多次缺页中断。
在这里插入图片描述
有时重启被中断的指令并不可行
block move :
一条指令可能改变多个不同的位置。MVC指令移动字符串,能将多达256B的块从一块移动到另一块,源和目的快有重叠,原块可能已经有修改,不能再次简单的再次执行该指令
在这里插入图片描述
自加自减情况:
有的处理机自动PC+1

按需调页的性能

有效访问时间 EAT(effective access time)
设缺页率为 p 内存访问时间ma
EAT = (1-p)ma + p(处理也页错误中断 + 换出页 v+换入页 + 重新启动进程)

写时复制

若系统不支持虚拟存储器管理技术,系统需要为进程分配其所需要的所有的内存空间,将整个进程全部装入主存才能运行
在不支持虚拟存储管理的系统中,当父进程创建了一个子进程,fork()为子进程创建一个父进程地址空间的副本,复制父进程的页。位子进程分配独立的物理空间。
存在问题:
由于父子进程继承和隔离的问题,对于数据段和堆栈段独立分配物理空间是合理的。
对于极少数的情况,由于子进程也不会修改进程子父进程的数据,数据段不需要复制,只需要复制堆栈段。
多数进程会执行exec。赋值代码段会浪费时间
在支持虚拟存储的系统中,是否可以

  • 内核为新创建的紫禁城及创建一个虚拟的地址空间,即为子进程复制一个进程虚拟空间结构(逻辑上子进程和父进程分离)
  • 不为子进程分配物理内存,而是共享父进程物理空间
  • 当父子进程中有更改相应段的行为发生时,在为子进程相应的段分配物理空间
  • (fork系统调用不真正赋值父进程到子进程的空间,仅仅是建立一个引用,只有被修改了的页面才进行复制,实现父子进程地址空间的真正分离)

在这里插入图片描述

页面置换

LRU
FIFO
在这里插入图片描述
在这里插入图片描述

帧分配

帧的最少数量

振奋般配的政策受到诸多限制,不能超出可用帧的数量,也必须分配至少最少数量的帧。

  • 随着每个进程帧数量的减少,页错误会增加美因茨影响系统性能。
  • 指令完成之前出现页错误,必须重启指令,一次要有足够的帧来容纳指令。
  • 例:MVC指令,本身6B需要两页,要移动的字符串和目的区域可能都是跨页,因此需要6个帧。
    在这里插入图片描述

分配算法

静态分配(fixed allocation)

  • 平均分配(equal allocation)每个进程都均分帧,分不下的帧放入空闲帧缓存池
  • 比例分配:根据进程大小,将可用内存分给每个进程
    设进程pi 的虚拟内存大小为si
    S = ∑ s i S = \sum s_i S=si
    这样,如果总的可用帧数为m,那么进程pi可以分到ai个帧
    a i = s i / S ∗ m a_i = s_i / S *m ai=si/Sm

每个进程分配到的真的数量随着进程数而变化,进程增加,内个进程分到的帧数会减少。
有进程离开,会有帧分配给剩余进程

优先级分配
使用优先级,或者大小与优先级的混合。
如果进程Pi发生页错误,可以从自己的帧中或者选一个优先级低的进程将他的帧替换出去

可变分配
根据程序的实际运行状况,动态决定分配内存的数量

全局分配和局部分配

局部分配

仅从当前进程中分配到的帧中选择帧进行替换。
一个需要更多内存的进程可能不会获得目前系统中的空闲页框。

全局分配

可以从所有的帧中进行选择替换。
可能从缺页率低的进程中获取叶匡,分配给缺页率高的进程。
但是也可能从却也路已经比较高的进程中获取叶匡,只是1该进程频繁进行页面置换。导致抖动的发生。

抖动(thrashing)

thrashing : high paging activity, a process is busy swapping pages n and out , spending more time paging than excuting.
系统频繁的进行页面置换,用于置换的时间比执行所画的时间都多。

抖动的原因

如果进程没有足够的帧,那么缺页率就会很高
导致:

  • 很低的CPU利用率
  • OS会考虑减少程序执行的并发度
  • 当新的进程加入时,会导致更低的cpu效率
    在这里插入图片描述

局部模式

下面po出一些概念
在这里插入图片描述
局部:

  • 进程访问页的集合,这些页在使用上有关联性
  • 一段成许或数据一班由若干个局部组成
  • 任何时刻,进程总是处在一个或者多个局部中

在这里插入图片描述

在这里插入图片描述
上图中页面{1 2 3 4 5 6} 构成一个剧本,该段代码至少分配6个页面才能执行。

为什么抖动会发生?
对于内存中运行的进程,如果分配给这些进程的内存大小不足以容纳这写进程的局部,则会出现页面频繁置换的现象,即系统出现颠簸。
而使用局部置换和优先级置换的政策,对于抖动的影响是有限的。

因此,分配给每个进程的页框数不应该少于该进程的当前局部

抖动的预防

工作集模型

  • 目的:为进程分配足够多的帧

  • 问题:如何确定一个局部需要多少帧?

  • 根据局部性原理,每个进程最近使用的页框数,作为将要使用的页框数的近似值:

  • 对一段时间内每个进程访问的页面进行采样,作为对进程的一个局部近似。

  • 即根据在一个时间窗口内每个进程所访问的而页面踪迹,得出该段时间内每个进程所访问的页面集合,即每个进程的工作集。

  • 将该工作集的大小作为每个进程梭巡欸村的下限,

  • 如果所有进程所需要的页框数之和 大于 系统可用的页框数,则可能导致系统抖动,需要挂起或者终止部分进程,以释放内存,将他们分配给其他进程。

缺页频率模式 Page-fault Frequency Scheme
确定一个可以接受的缺页率。

  • 如果实际缺页率太低,进程失去一些帧
  • 如果实际缺页率太高,进程获得一些帧。
  • 有时需要挂起或者结束进程,以释放其所占用的内存
工作集模型

三个术语:

  • 工作集窗口( △ \triangle ):在这里插入图片描述
    工作集窗口为10
  • 工作集:最近10个页面的应用序列,被访问的页集合记为WS
  • 工作集大小:工作集中所含的不同的页的数量,WSS

在这里插入图片描述
WSS是一个局部近似,可以认为使在近段时间内最少需要的页框数。
如果一个进程可用的页框数少于WSS,也就是说分配给该进程的页框数不能包含某进程的某个局部,就可能引起颠簸(或抖动)。
在这里插入图片描述

Page-Fault Frequency Scheme 缺页率模型

在这里插入图片描述

内存映射文件

文件的每次访问,都需要系统调用和磁盘访问。使用那日从映射,用虚拟内存,将文件作为普通的内存进行访问。

基本机制:

文件的内存映射,可以将磁盘块应身为内存的一页或者多页。开始的文件访问按照普通的页面调度来进行,会产生页错误。这样一页大小的本份文件就从文件系统读入物理页。文件的读写就按照普通的内存来访问,利用内从访问文件,而不是使用系统调用read() write()简化了文件的访问。
可以通过内存映射文件实现共享内存
多个进程允许将同一文件映射到各自的虚拟内存中,以允许数据共享。
在这里插入图片描述

分配内核内存

为内核分配内存与用户内存不同,通常从空闲内存池中获取

  • 内核需要为不同大小的数据结构分配内存,又得不到一页。啮合需要谨慎的使用内存,降低碎片浪费。
  • 内核内存不尊寻按页分配
  • 一些内核内存需要连续。

页表结构(请求页式)

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值